Introduction
ComeHome provides a comprehensive set of flexible options to easily integrate into your technical ecosystem.
Website Integration
The platform can be branded and integrated into your existing web experience in a couple of ways.
Co-Branded ComeHome Site (most common)
A co-branded ComeHome site hosted at <partner>.comehome.com, for example https://lendco.comehome.com that can be linked to from within your website or using our Search Widgets.
Search Widgets
The primary way to deliver ComeHome functionality into a portal experience is via an embeddable widget. ComeHome widgets are embedded via a script tag snippet that allows configuration of the widget content.
Widgets are designed to be fully responsive to support any screen size out of the box, and render in any modern web browser across phones, tablets and desktops.
As an initial POC we propose to utilize the Home Search widget. As we define the desired user experience and flows together, ComeHome can deliver additional content as widgets to support the desired interactions.
The Comehome widget, "hero" style
The Comehome widget, "banner" style
Versions (Image and Text Editable) Home Buyer Widget & Homeowner Widget
See Search Widget Implementation below for implementation details.
Property Widgets
Another way to deliver ComeHome functionality into a portal experience is via the embeddable property widget.
Just like the search widget, property widget is designed to be fully responsive to support any screen size out of the box, and render in any modern web browser across phones, tablets and desktops.
The Comehome property widget, "flexible" state rendering up to 5 property cards
The Comehome property widget, "alternate" state with one property card layout
The Comehome property widget, "null" state, which behaves similarly to the search widget. This UI appears when no properties returned after passing in zipcode, city, or coordinates
Versions (Image and Text Editable) Null State Widget & Flexible Widget & Alternate Widget
See Property Widget Implementation below for implementation details.
Search Widget Implementation
Iframe Option for Search Widget
<iframe src="https://partner.comehome.com/widget?parent_site_hostname=www.partnersite.com&public_key=pk.pr4gruuiiEn7YDqG[8p4iqYXDjcE2v&layout=hero&destination=homebuyer&headline_copy=Find%20Your%20Perfect%20Home%20with%20the%20Mortgage%20to%20Match&headline_copy_max_width=940px&search_dropdown_margin_bottom=100px&background_image=https%3A%2F%2Fimages.unsplash.com%2Fphoto-1501183638710-841dd1904471" />
The widget can be rendered by building the URL manually and setting it as the src of an iframe
. The domain of the URL must be the URL of the partner’s cobranded ComeHome instance followed by the path to the widget: /widget
, followed by the query parameters used to configure the widget. All available query parameters are listed in the URL Parameters section further down in the document. This allows ultimate flexibility with any frontend infrastructure, but the appropriate styling of the iframe
falls on the implementer.
Snippet Option for Search Widget
<div id="comehome-widget-destination" />
<script>
document.addEventListener("DOMContentLoaded", function(){
/* Classname of the element that'll be replaced by the widget's iframe */
var DESTINATION_ELEMENT_ID = 'comehome-widget-destination';
/* URL of the cobranded ComeHome instance */
var COMEHOME_URL = 'https://partner.comehome.com';
/* These keys and values are used to form the query string params appended to the iframe's URL */
var CONFIG = {
parent_site_hostname: 'www.partnersite.com',
public_key: 'pk.pr4gruuiiEn7YDqG[8p4iqYXDjcE2v',
layout: 'hero',
destination: 'homebuyer',
headline_copy: 'Find Your Perfect Home with the Mortgage to Match',
background_image: 'https://images.unsplash.com/photo-1501183638710-841dd1904471',
mobile_breakpoint: '769px',
loid: '2321112349',
agentid: '1234',
banner_background_color: '#06315C'
};
/* CSS properties for the iframe element - added to a <style> tag that's written to the page */
var DESKTOP_CSS = {
border: 'none',
width: '100%',
height: '600px'
};
/* CSS properties for the iframe element - added to a media query in a <style> tag that's written to the parent page to match the media query used in the widget */
var MOBILE_CSS = {
height: '400px'
};
var i = document.createElement('iframe');
var s = document.createElement('style');
var d = document.getElementById(DESTINATION_ELEMENT_ID);
var iId = `comehome_widget_${Math.round(Math.random() * Math.pow(10, 12))}`;
i.src = COMEHOME_URL + '/widget?' + Object.keys(CONFIG).filter(key => CONFIG[key]).map(key => key+'='+encodeURIComponent(CONFIG[key])).join('&');
function cssObjectToString(obj) { return Object.keys(obj).map(key => key+':'+obj[key]).join('; '); }
s.innerText = `#${iId}{${cssObjectToString(DESKTOP_CSS)}}@media screen and (max-width: ${CONFIG.mobile_breakpoint}){#${iId}{${cssObjectToString(MOBILE_CSS)}}}`;
(i.frameElement || i).setAttribute('id', iId);
if (d) { d.parentNode.replaceChild(i, d); i.parentNode.insertBefore(s, i); } else { throw new Error('ComeHome widget destination element not found');}
});
</script>
For quicker drop-in functionality, a snippet of HTML/Javascript can be run that creates an iframe
, adds some styling to the iframe
, then sets the src
to the ComeHome URL of the widget. A sample snippet that can be copied and modified is provided to the right. The snippet is set up so that the widget’s iframe
is added in the location within the parent site’s HTML where the snippet is executed. If seeking to have the widget occupy a different place within a page’s HTML, line 1 of the below snippet can be removed, and a different DOM element id
can be specified as the DESTINATION_ELEMENT_ID
on line 4.
Snippet Configuration for Search Widget
var DESKTOP_CSS = {
'border': 'none',
'width': '100%',
'height': '100%'
};
The following snippet config constants can/should be modified by the implementer. Here’s a greater explanation of each. For an explanation of the keys seen in the CONFIG
snippet variable, see the URL Parameters section further down.
Variable | Description |
---|---|
DESTINATION_ELEMENT_ID | This should not need modification as long as it matches the id seen on line 1 of the snippet to the right. If desiring the widget iframe to replace some other element on the page, that element’s id can be specified here. |
COMEHOME_URL | The URL of the partner’s cobranded ComeHome instance |
DESKTOP_CSS | Controls additional CSS styling of the widget’s iframe . This is often necessary to add, since the iframe often needs to be styled within the parent site to appear as desired. Define as an empty object ({} ) if no iframe styles are needed. For example, the configuration to the right would cause the widget to stretch the full width and height of its parent HTML element within the parent site. |
MOBILE_CSS | Additional styling to be applied to the widget’s iframe within a CSS media query, used to change the style of the iframe when the client’s page is rendered on a small mobile screen. Define as an empty object ({} ) if no mobile iframe styles are needed. |
Please note that in many cases the HTML of the parent site will need to be modified to account for the widget’s proper placement and styling (i.e. if the widget snippet is executed inside a <div>
that is only 50px wide, it’ll be much harder to get it to stretch the width of the greater page content). The widget can be styled either by utilizing CSS within the parent site to style the widget’s iframe or by styling the iframe
directly using the DESKTOP_CSS
and MOBILE_CSS
configurations in the snippet.
URL Parameters for Search Widget
The URL query parameters available to be passed in the widget URL assigned to the iframe
.
Param | Description |
---|---|
parent_site_hostname | The parent site hostname of the widget. This needs to exactly match the window.location.hostname of the site on which the widget will be implemented. Note that if the widget is being implemented on a site that specifies a port number in the URL (i.e. www.test.com:8000), the port number needs to be included, following the hostname, in parent_site_hostname . |
public_key | This will be generated by the ComeHome team and provided as part of the implementation instructions. The public_key is unique to the hostname of the site on which the widget will be implemented. |
layout | Controls the layout/styling of the widget. Must be either banner or hero as seen in the above screenshots. |
destination | Controls the section of the ComeHome site to which the user will be redirected after selecting a place or address from the autocomplete dropdown. Must be either homebuyer for the home buyer experience or homeowner for the homeowner experience. |
destination_new_window | Optionally controls whether the ComeHome site opens in the same window as the widget after selecting a place or address or whether it opens in a new window. Must be true to open in a new window. Defaults to false when omitted. |
headline_copy | Controls the large copy text seen within the widget. Can be any text, but very long text might cause UI issues within the widget. |
headline_copy_max_width | Controls the max-width of the headline copy within the widget. Omitting this causes the headline copy to stretch as wide as the total width of the widget’s iframe. |
leaving_site_disclaimer_copy | Optionally controls copy text seen underneath the “Powered by ComeHome” attribution. Can be any text. Can be used to inform users that clicking on a widget result will cause them to leave the parent site. |
background_image | Controls the background image seen behind the entire widget when in hero layout or behind the left-side when in banner layout. Must be a valid URL of an image. The image is set to fill the entire area of the widget’s iframe in the hero layout and to cover the entire height and 25% of the width of the widget’s iframe in the banner layout. This means that typically not all of the provided image will be visible, since parts on either the top/bottom or left/right are cropped-off to allow the image to fill the entire area without distorting. As the widget supports an adjustable width and height, the optimal image dimensions vary depending on the implementation and the image itself. Generally a 3:2 aspect ratio is a good starting point for the hero layout, and a 2:3 for the banner layout. |
banner_background_color | Controls the background color behind the right-side of the widget when in banner layout. |
search_dropdown_margin_bottom | Controls the spacing that is maintained between the bottom of the address-search dropdown and the bottom of the widget’s iframe. If it’s desired that other page elements slightly overlap the bottom of the widget, this can be set to ensure the bottom of the address-search dropdown isn’t hidden underneath those page elements. |
mobile_breakpoint | Controls the pixel width of the iframe at which mobile-specific styling is applied to the widget, via a @media (max-width: xxx) media query, allowing the widget to appear in a more user-friendly manner on small devices. |
loid | Optional: This controls whether a user should see particular loan officer information in the ComeHome experience. |
agentid | Optional: This controls whether a user should see particular agent’s information in the ComeHome experience. |
sso=true | Controls whether a particular instance of a widget should utilize SSO authentication. This will most likely be utilized in a location where users are already authenticated, and thus, interaction with the widget will trigger IDP flow into the ComeHome experience. In order for this to work as expected, please notify the ComeHome team that you would like to have some widgets enabled with SSO functionality so that they can adjust the necessary configurations. If this parameter is not utilized, then this instance of the widget will NOT use SSO authentication. |
Property Widget Implementation
Iframe Option for Property Widget
<iframe src="https://partner.comehome.com/widget?parent_site_hostname=www.partnersite.com&public_key=pk.pr4gruuiiEn7YDqG[8p4iqYXDjcE2v&zipcode=80104" />
The widget can be rendered by building the URL manually and setting it as the src of an iframe
. The domain of the URL must be the URL of the partner’s cobranded ComeHome instance followed by the path to the widget: /property-widget
, followed by the query parameters used to configure the widget. All available query parameters are listed in the URL Parameters section further down in the document. This allows ultimate flexibility with any frontend infrastructure, but the appropriate styling of the iframe
falls on the implementer.
Snippet Option for Property Widget
<div id="comehome-widget-destination" />
<script>
document.addEventListener("DOMContentLoaded", function(){
/* Classname of the element that'll be replaced by the widget's iframe */
var DESTINATION_ELEMENT_ID = 'comehome-widget-destination';
/* URL of the cobranded ComeHome instance */
var COMEHOME_URL = 'https://partner.comehome.com';
/* These keys and values are used to form the query string params appended to the iframe's URL */
var CONFIG = {
parent_site_hostname: 'www.partnersite.com',
public_key: 'pk.pr4gruuiiEn7YDqG[8p4iqYXDjcE2v',
zipcode: 80104,
city_state: 'Boulder, CO',
loc: '39.96251,-105.38499,40.07031,-105.13442',
min_beds: 1,
min_baths: 1,
min_price: 500000,
max_price: 2000000
};
/* CSS properties for the iframe element - added to a <style> tag that's written to the page */
var DESKTOP_CSS = {
border: 'none',
width: '100%',
height: '600px'
};
/* CSS properties for the iframe element - added to a media query in a <style> tag that's written to the parent page to match the media query used in the widget */
var MOBILE_CSS = {
height: '400px'
};
var i = document.createElement('iframe');
var s = document.createElement('style');
var d = document.getElementById(DESTINATION_ELEMENT_ID);
var iId = `comehome_widget_${Math.round(Math.random() * Math.pow(10, 12))}`;
i.src = COMEHOME_URL + '/property-widget?' + Object.keys(CONFIG).filter(key => CONFIG[key]).map(key => key+'='+encodeURIComponent(CONFIG[key])).join('&');
function cssObjectToString(obj) { return Object.keys(obj).map(key => key+':'+obj[key]).join('; '); }
s.innerText = `#${iId}{${cssObjectToString(DESKTOP_CSS)}}@media screen and (max-width: ${CONFIG.mobile_breakpoint}){#${iId}{${cssObjectToString(MOBILE_CSS)}}}`;
(i.frameElement || i).setAttribute('id', iId);
if (d) { d.parentNode.replaceChild(i, d); i.parentNode.insertBefore(s, i); } else { throw new Error('ComeHome widget destination element not found');}
});
</script>
For quicker drop-in functionality, a snippet of HTML/Javascript can be run that creates an iframe
, adds some styling to the iframe
, then sets the src
to the ComeHome URL of the widget. A sample snippet that can be copied and modified is provided to the right. The snippet is set up so that the widget’s iframe
is added in the location within the parent site’s HTML where the snippet is executed. If seeking to have the widget occupy a different place within a page’s HTML, line 1 of the below snippet can be removed, and a different DOM element id
can be specified as the DESTINATION_ELEMENT_ID
on line 4.
Snippet Configuration for Property Widget
var DESKTOP_CSS = {
'border': 'none',
'width': '100%',
'height': '100%'
};
The following snippet config constants can/should be modified by the implementer. Here’s a greater explanation of each. For an explanation of the keys seen in the CONFIG
snippet variable, see the URL Parameters section further down.
Variable | Description |
---|---|
DESTINATION_ELEMENT_ID | This should not need modification as long as it matches the id seen on line 1 of the snippet to the right. If desiring the widget iframe to replace some other element on the page, that element’s id can be specified here. |
COMEHOME_URL | The URL of the partner’s cobranded ComeHome instance |
DESKTOP_CSS | Controls additional CSS styling of the widget’s iframe . This is often necessary to add, since the iframe often needs to be styled within the parent site to appear as desired. Define as an empty object ({} ) if no iframe styles are needed. For example, the configuration to the right would cause the widget to stretch the full width and height of its parent HTML element within the parent site. |
MOBILE_CSS | Additional styling to be applied to the widget’s iframe within a CSS media query, used to change the style of the iframe when the client’s page is rendered on a small mobile screen. Define as an empty object ({} ) if no mobile iframe styles are needed. |
Please note that in many cases the HTML of the parent site will need to be modified to account for the widget’s proper placement and styling (i.e. if the widget snippet is executed inside a <div>
that is only 50px wide, it’ll be much harder to get it to stretch the width of the greater page content). The widget can be styled either by utilizing CSS within the parent site to style the widget’s iframe or by styling the iframe
directly using the DESKTOP_CSS
and MOBILE_CSS
configurations in the snippet.
URL Parameters for Property Widget
The URL query parameters available to be passed in the widget URL assigned to the iframe
.
Param | Description |
---|---|
parent_site_hostname | The parent site hostname of the widget. This needs to exactly match the window.location.hostname of the site on which the widget will be implemented. Note that if the widget is being implemented on a site that specifies a port number in the URL (i.e. www.test.com:8000), the port number needs to be included, following the hostname, in parent_site_hostname . |
public_key | This will be generated by the ComeHome team and provided as part of the implementation instructions. The public_key is unique to the hostname of the site on which the widget will be implemented. |
zipcode | filters location of the property cards returned based on zipcode. This location filter has the highest precedence. This field takes in five zipcode digits |
city_state | filters location of the property cards returned based on city or/and state. This location filter has the 2nd highest precedence. This field takes in a string of city or/and state (e.g. San Franscisco, CA or San Francisco or CA ) |
loc | filters location of the property cards returned based on lat lng coordinates. This location filter has the last precedence |
alternate | displays a statically styled widget with one property card. This field takes in a boolean of true or false |
min_beds | filters properties returned with at least x number of beds. This field takes in a numeric value |
max_beds | filters properties returned with at most x number of beds. This field takes in a numeric value |
min_baths | filters properties returned with at least x number of baths. This field takes in a numeric value |
max_baths | filters properties returned with at most x number of baths. This field takes in a numeric value |
min_price | filters properties returned with price greater than or equal to x. This field takes in a numeric value |
max_price | filters properties returned with price less than or equal to x. This field takes in a numeric value |
Webhooks
Webhooks are a kind of subscription that causes our servers to emit an HTTP POST request to a URL you provide whenever some event of interest occurs.
Callouts Webhook
This webhook will trigger whenever we process a property update for a property that matches one of your users' subscriptions. The POST request will contain information about the property update that occurred and some metadata about the user's subscription. You can use this info to construct a notification to your users.
There are two kinds of subscriptions a user can have that can result in them getting notifications for a particular property: property bookmarks (i.e. the user put it on their "watchlist") and saved searches (i.e. the property is inside the geographical bounds of the search and also satisfies all of the specified search filters). If a particular notification was sent because of a bookmark, the value of the notificationType
field will be "PropertyUpdateNotification" and the subscribedAt
field will contain the time at which the user created the bookmark. If a particular notification was sent because of a saved search, the value of the notificationType
field will be "SavedSearchNotification", the subscribedAt
field will contain the time at which the user created the saved search, and the searchId
and name
fields will be present.
There are two kinds of property updates that we process which can trigger a callouts webhook notification: price changes and status changes. A price change is signified by a reason
field with a value of "PRICE_CHANGE" and the presence of the oldPrice
and newPrice
fields. A status change is signified by a reason
field with a value of "MLS_STATE_CHANGE" and the presence of the oldState
and newState
fields.
This is what the body of the request that a webhook will send to your listeners will look like:
{
"propertyReference": {
"chPropertyId": "123-Nosuch-Dr-San-Francisco-CA-94132",
"streetAddress": "123 Nosuch Dr",
"unitNumber": "",
"city": "San Francisco",
"state": "CA",
"zipcode": "94132"
},
"notificationId": "d16a6c20-0310-4d68-96bd-ba517d5ca0f6",
"notificationType": "SavedSearchNotification",
"userId": "bc4cf770-4559-4f43-9493-c69b12382560",
"notificationDate": "2023-04-14T11:19:45Z",
"notificationTitle": "For sale in San Francisco for $1.6M",
"notificationText": "123 Nosuch Dr for $1,595,000.",
"notificationHTML": "Hello World",
"reason": "MLS_STATE_CHANGE",
"newState": "ACTIVE",
"oldState": "PENDING",
"searchId": "12345",
"name": "San Francisco, CA",
"subscribedAt": "2023-03-24T18:15:54Z"
}
Name | Type | Required | Description |
---|---|---|---|
propertyReference | object | true | Information about the property |
chPropertyId | string | true | A unique identifier for the property being viewed. |
streetAddress | string | true | The street address of the property being viewed. This may be absent for listings that have a hidden address. |
unitNumber | string | false | The unit number of the property being viewed. This may be absent for listings that have a hidden address or do not have a unit number. |
city | string | true | The address city of the property being viewed. This may be absent for listings that have a hidden address. |
state | string | true | The address state of the property being viewed. This may be absent for listings that have a hidden address. |
zipcode | string | true | The address zip code of the property being viewed. This may be absent for listings that have a hidden address. |
notificationId | string | true | A unique ID for this notification. |
notificationType | string | true | The type of notification that occurred |
userId | string | true | A unique identifier for the user to whom this notification should be delivered. The exact format of this field is unspecified as the user ID will depend on the login mechanism. For users who are authenticated via SSO such as SAML, this will be the unique ID provided by the identity provider. |
notificationDate | string(date-time) | true | The time at which this notification occurred. May differ from the transmission time if there are delays in notification delivery. |
notificationTitle | string | true | A textual message suitable for display to a user as a notification title/subject. |
notificationText | string | true | A textual message suitable for display to a user describing the notification. |
notificationHTML | string | true | An HTML document describing an email-ready card including compliant attributions |
subscribedAt | string | true | The time at which the user bookmarked the property or created the saved search that resulted in this notification. It can be used, for example, to ignore notifications for searches older than a specified age. |
reason | string | true | A further description of why this update notification was delivered |
oldPrice | number | false | Previous price. Only present if reason is PRICE_CHANGE. |
newPrice | number | false | Current price. Only present if reason is PRICE_CHANGE. |
oldState | string | false | Previous MLS state. Only present if reason is MLS_STATE_CHANGE. |
newState | string | false | Current MLS state. Only present if reason is MLS_STATE_CHANGE. |
searchId | string | false | Unique ID for the search this matched. Only present if notificationType is SavedSearchNotification |
name | string | false | User visible name for the search this matched. Only present if notificationType is SavedSearchNotification |
Enumerated Values
Property | Value |
---|---|
notificationType | PropertyUpdateNotification |
notificationType | SavedSearchNotification |
reason | MLS_STATE_CHANGE |
reason | PRICE_CHANGE |
oldState | ACTIVE |
oldState | PENDING |
oldState | CONTINGENT |
oldState | OFF_MARKET |
oldState | SOLD |
newState | ACTIVE |
newState | PENDING |
newState | CONTINGENT |
newState | OFF_MARKET |
newState | SOLD |
Callouts webhooks can be managed via the partner-api
Analytics Webhook
This webhook will trigger based on the activity of your users on ComeHome across a collection of high-value actions, or activities. This data may be filtered by a variety of ComeHome- and partner-provided metrics. The payload in this webhook is identical to the response from the analytics activities endpoint
Message Order
ComeHome will attempt to deliver messages in order; however, if the
receiving API is unavailable, notifications triggered during the time
the receiving API is not accepting requests may be delivered at a later time,
after subsequent events have been delivered. The notificationDate
field may be used to place such notifications in the correct sequence.
Delivery Retries
ComeHome will attempt to deliver each notification exactly once. Due
to technical factors such as network timeouts, error status codes from the
receiving API or similar, notification may be delivered multiple times
in exceptional cases. The notificationId
field of the notifications
may be used to deduplicate in this case.
Webhook Listener Security
In order to receive webhook notifications, you will need to have a "listener" (a server with a public endpoint that can receive POST requests), and create a webhook in the partner-api with the URL that your listener can be reached at. Once you have a listener up, you'll want to ensure that it's not possible for an unauthorized party to feed you false requests. In other words, you'll want to be able to verify that the POST requests you receive are authentic. We provide two methods of webhook authentication.
It is recommended to use signed authentication in production.
In all cases, your listeners are required to accept HTTPS connections.
Basic Authentication
In this scheme, you provide us with a user-id and a password, and our POST requests will contain a header that adheres to the "Basic Authentication" standard. For example, for the user-id "user" and the password "password", the value of the "Authorization" header will be "Basic dXNlcjpwYXNzd29yZA=="
In this scheme the credentials are stored plainly in every webhook message.
Signed Authentication
const CryptoJS = require('crypto-js');
function verifySignature(secret, header, body) {
// step 1
var parts = header.split(',');
var unix = parseInt(parts[1].split(':')[1]);
var sig = parts[2].split(':')[1];
// step 2
var unixnow = Math.floor(Date.now() / 1000);
if (unixnow - unix > 60) {
return false;
}
// step 3
var canonical = unix + '.' + body;
// step 4
var hmac = CryptoJS.HmacSHA256(canonical, secret);
var expected = CryptoJS.enc.Base64.stringify(hmac);
// step 5
return expected === sig;
}
// this will fail because the timestamp is old, but otherwise the signature would match
verifySignature('secret', 'v:1,t:1680283571,s:MHCAKJqMP7cn6itq8eT4/Q0LHH5M7irACBlmMTfrVyk=', '{"foo":"bar"}');
import base64
import datetime
import hashlib
import hmac
def verify_signature(secret: str, header: str, body: str) -> bool:
# step 1
vals = {k: v for k, v in [pair.split(':',1) for pair in header.split(',')]}
sig = vals['s']
unix = vals["t"]
# step 2
age = int(datetime.datetime.now().timestamp()) - int(unix)
if age > 180:
return False
# step 3
canonical = f"{unix}.{body}"
# step 4
hash = hmac.new(secret.encode(), canonical.encode(), hashlib.sha256).digest()
expected = base64.b64encode(hash).decode()
# step 5
return expected == sig
# this will fail because the timestamp is old, but otherwise the signature would match
verify_signature("secret", "v:1,t:1680283571,s:MHCAKJqMP7cn6itq8eT4/Q0LHH5M7irACBlmMTfrVyk=", '{"foo":"bar"}')
package main
import (
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"fmt"
"strings"
)
func verifySignature(secret, header, body string) bool {
// step 1
segments := strings.Split(header, ",")
_, unix, _ := strings.Cut(segments[1], ":")
_, sig, _ := strings.Cut(segments[2], ":")
// step 2
now := time.Now().Unix()
then, _ := strconv.ParseInt(unix, 10, 64)
if now-then < 180 {
return false
}
// step 3
canonical := fmt.Sprintf("%s.%s", unix, body)
// step 4
mac := hmac.New(sha256.New, []byte(secret))
mac.Write([]byte(canonical))
expected := base64.StdEncoding.EncodeToString(mac.Sum(nil))
//step 5
return expected == sig
}
func main() {
// this will fail because the timestamp is old, but otherwise the signature would match
verifySignature("secret", "v:1,t:1680283571,s:MHCAKJqMP7cn6itq8eT4/Q0LHH5M7irACBlmMTfrVyk=", `{"foo":"bar"}`)
}
In this scheme, we sign our requests using the HMAC-SHA256 algorithm, using a shared secret as a key.
A timestamp is sent with the signature and included in the input to the signing function, which mitigates the potential for replay attacks. Listeners should validate that the timestamp is within a certain tolerance window centered on the current time. A tolerance window is needed to allow for legitimate sources of timing discrepancies arising from, for example, network lag or clock skew. We recommend a tolerance window of 3 minutes.
Your listeners can verify the authenticity of messages with this scheme using the following procedure: (select python on the sidebar to see a python code example)
- parse out the unix time and the signature from the "X-Comehome-Signature" header value (which looks like "v:1,t:(unix time),s:(signature)").
- verify that the unix time matches the current time within a tolerance window (to allow for timing discrepancies arising from network lag or clock skew or other sources). If it's too old, then you can't trust the contents of the message.
- construct a "canonical request" by concatenating the unix time string from step 1, a period ("."), and the entire body of the request.
- using the shared secret as the key, get a HMAC-SHA256 hash sum of this string. Encode this hash sum to base64 to get a signature.
- check that the signature you generated in step 4 matches the signature parsed from the header in step 1. If they don't match, then you can't trust the contents of the request. Otherwise, you can trust the request.
Key Generation
In order to use signed_v1_auth, you will need to generate a secret and share it with us when you create the webhook using the partner-api endpoint. We will use this secret as the key to sign webhook requests with, and your listeners will use this secret to verify the signatures. The secret should be a sequence of bytes generated using a cryptographically secure random number generator, for example using Python's os.urandom
. We require that the secret be between 32 and 64 bytes long, inclusive. The security of this scheme relies on this secret being known only to the sender and the receiver of messages and nobody else. Therefore, the secret should not be reused anywhere else.
Key Rotation
It is good practice to periodically rotate your keys, for the same reason it is good practice to periodically change passwords. In order to rotate keys, both the sender and the listeners need to be notified about the new key. If not handled correctly, some messages can become undeliverable because of a key mismatch between sender and listener. If you design your listeners with key rotation in mind, it's possible to do this without any messages becoming unverifiable.
You can follow this procedure to rotate keys without undeliverable messages.
- generate a new key
- add key to the listener's keys (falling back to the old key if the first key fails to validate signatures)
-
PATCH
the webhook with the new key - revoke the old key by removing it from the listener's keys after some time (after all in-flight messages signed with the old key have been received)
For this reason, it's a good idea to design your listener to be able to store more than one key, and attempt to verify messages with each stored key before rejecting the message. Most of the time there should only be one key but during a short transition period during key rotation, your listeners should be able to try both the old key and the new key.
ComeHome Partner API
Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.
This specification describes the partner API supplied by the ComeHome application.
The ComeHome partner API provides an endpoint that can be used to obtain an access token. This endpoint accepts a POST from a partner, with the request body including client ID (this is the partner identifier issued by ComeHome), a client secret (this is a shared secret key issued by ComeHome), and a grant type. The response will include an access token that can be used to access the other endpoints.
Note that two environments are available for your use: a pre-prod demo
environment, and a production prod
environment. Each endpoint below can be accessed via the specified route, and the root URL will differ based on the environment.
The demo
root URL is: https://api.demo.ch.housecanary.net
The prod
root URL is: https://api.comehome.com
So, for example to fetch an API token for the prod
environment, you would send a request to https://api.comehome.com/v1/partner/token
(full details on this endpoint are provided below).
Authentication
- API Key (Bearer)
- Parameter Name: Authorization, in: header. Bearer {token}
Auth
Requests related to authentication
Issues an access token that provides access to the Partner API
Code samples
const inputBody = '{
"grant_type": "string",
"client_id": "string",
"client_secret": "string"
}';
const headers = {
'Content-Type':'application/x-www-form-urlencoded',
'Accept':'application/json'
};
fetch('/v1/partner/token',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json'
}
r = requests.post('/v1/partner/token', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/token");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakePostRequest()
{
string url = "/v1/partner/token";
await PostAsync(null, url);
}
/// Performs a POST Request
public async Task PostAsync(undefined content, string url)
{
//Serialize Object
StringContent jsonContent = SerializeObject(content);
//Execute POST request
HttpResponseMessage response = await Client.PostAsync(url, jsonContent);
}
/// Serialize an object to Json
private StringContent SerializeObject(undefined content)
{
//Serialize Object
string jsonObject = JsonConvert.SerializeObject(content);
//Create Json UTF8 String Content
return new StringContent(jsonObject, Encoding.UTF8, "application/json");
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/x-www-form-urlencoded',
'Accept' => 'application/json'
}
result = RestClient.post '/v1/partner/token',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/x-www-form-urlencoded',
'Accept' => 'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/v1/partner/token', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
body := `{
"grant_type": "string",
"client_id": "string",
"client_secret": "string"
}`
req, err := http.NewRequest("POST", "/v1/partner/token", bytes.NewBuffer([]byte{body}))
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
req.Header.Set("Accept", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /v1/partner/token
This endpoint accepts either a form-encoded request with parameters described below or a JSON post request with a body with grantType, clientId, and clientSecret (see TokenRequest model described under the Models section for more info on the JSON request body). The response issued will be the same for both kinds of requests.
Code samples for common languages are provided alongside this documentation, but for reference, here is an example form-encoded cURL
request that can be used to fetch an auth token (using provided client-id and client-secret values where noted):
curl --location --request POST 'https://api.comehome.com/v1/partner/token' --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode 'grant_type=client_credentials' --data-urlencode 'client_id=CLIENT_ID_HERE' --data-urlencode 'client_secret=CLIENT_SECRET_HERE'
Body parameter
grant_type: string
client_id: string
client_secret: string
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | true | none |
» grant_type | body | string | true | Specifies the grant type/flow. Currently only client_credentials is supported. |
» client_id | body | string | true | The client identifier, this is most likely your Partner identifier issued by ComeHome |
» client_secret | body | string | true | The shared secret key issued to you by ComeHome |
Example responses
200 Response
{
"access_token": "string",
"token": "string",
"ttl": 0,
"expires_in": 0,
"type": "string"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Token issued | Token |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
401 | Unauthorized | Invalid client ID or secret | None |
500 | Internal Server Error | Internal server error | None |
Listing
Requests related to listing references
Get a listing summary
Code samples
const headers = {
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/property/{chPropertyID}/listing',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.get('/v1/partner/property/{chPropertyID}/listing', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/property/{chPropertyID}/listing");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeGetRequest()
{
string url = "/v1/partner/property/{chPropertyID}/listing";
var result = await GetAsync(url);
}
/// Performs a GET Request
public async Task GetAsync(string url)
{
//Start the request
HttpResponseMessage response = await Client.GetAsync(url);
//Validate result
response.EnsureSuccessStatusCode();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.get '/v1/partner/property/{chPropertyID}/listing',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/v1/partner/property/{chPropertyID}/listing', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "/v1/partner/property/{chPropertyID}/listing", nil)
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /v1/partner/property/{chPropertyID}/listing
Returns listing information for a property reference
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
chPropertyID | path | string | true | Property reference identifier |
Example responses
200 Response
{
"propertyReference": {
"streetAddress": "string",
"unitNumber": "string",
"city": "string",
"state": "string",
"zipcode": "string"
},
"status": "ACTIVE",
"listPrice": 0,
"county": "string",
"yearBuilt": 0,
"propertyType": "condo",
"listDate": "string"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Listing information returned | Listing |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
401 | Unauthorized | Invalid or expired access token | None |
404 | Not Found | Property reference not found | None |
500 | Internal Server Error | Internal server error | None |
Property
Requests related to property references
Get a BPO
Code samples
const headers = {
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/property/{chPropertyID}/bpo',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.get('/v1/partner/property/{chPropertyID}/bpo', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/property/{chPropertyID}/bpo");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeGetRequest()
{
string url = "/v1/partner/property/{chPropertyID}/bpo";
var result = await GetAsync(url);
}
/// Performs a GET Request
public async Task GetAsync(string url)
{
//Start the request
HttpResponseMessage response = await Client.GetAsync(url);
//Validate result
response.EnsureSuccessStatusCode();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.get '/v1/partner/property/{chPropertyID}/bpo',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/v1/partner/property/{chPropertyID}/bpo', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "/v1/partner/property/{chPropertyID}/bpo", nil)
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /v1/partner/property/{chPropertyID}/bpo
Returns a formal broker price opinion (BPO) for a property, given a property reference identifier. This feature is available at an additional cost, and my not be available to all customers.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
chPropertyID | path | string | true | Property reference identifier |
Example responses
200 Response
{
"addressInfo": {
"address": "string",
"addressFull": "string",
"blockId": "string",
"blockgroupId": "string",
"city": "string",
"county": "string",
"countyFips": "string",
"geoPrecision": "string",
"lat": 0,
"lng": 0,
"metrodiv": "string",
"msa": "string",
"slug": "string",
"state": "string",
"unit": "string",
"zipcode": "string",
"zipcodePlus4": "string"
},
"assessment": {
"apn": "string",
"assessmentYear": 0,
"taxAmount": 0,
"taxYear": 0,
"totalAssessedValue": 0
},
"ltvDetails": {
"asOfMonth": "string",
"currentLiens": [
{
"armChangeDate": "string",
"armIndex": "string",
"dueDate": "string",
"grantee1": "string",
"grantee1Forenames": "string",
"grantee2": "string",
"grantee2Forenames": "string",
"grantor1": "string",
"grantor2": "string",
"heloc": true,
"interestRate": 0,
"isArm": true,
"lenderType": "string",
"lienAmount": 0,
"lienLengthMonths": 0,
"lienMonthsCompletedAsOfDate": 0,
"lienType": "string",
"monthlyPayment": 0,
"noticeIds": [
{}
],
"outstandingPrincipal": 0,
"principalPaidAsOfDate": 0,
"recordDate": "string",
"standAloneRefi": true
}
],
"fsd": 0,
"inDefault": true,
"lastDefaultDate": "2019-08-24T14:15:22Z",
"ltvLwr": 0,
"ltvMean": 0,
"ltvUpr": 0,
"propertyValueLwr": 0,
"propertyValueMean": 0,
"propertyValueUpr": 0,
"totalEquityLwr": 0,
"totalEquityMean": 0,
"totalEquityUpr": 0,
"totalLien": 0,
"totalMonthlyPayments": 0,
"totalNoticeIds": [
{}
]
},
"marketConditions": {
"details": {
"historical": {
"cagr10Years": 0,
"cagr1Year": 0,
"cagr20Years": 0,
"cagr5Years": 0,
"returns10Years": 0,
"returns1Year": 0,
"returns20Years": 0,
"returns5Years": 0
},
"multiFamily": {
"daysOnMarketMedian": 0,
"estimatedSalesTotal": 0,
"inventoryTotal": 0,
"marketActionMedian": 0,
"monthsOfInventoryMedian": 0,
"priceMedian": 0
},
"singleFamily": {
"daysOnMarketMedian": 0,
"estimatedSalesTotal": 0,
"inventoryTotal": 0,
"marketActionMedian": 0,
"monthsOfInventoryMedian": 0,
"priceMedian": 0
}
},
"marketGrade": "string"
},
"ownerOccupied": {
"ownerOccupied": true
},
"property": {
"airConditioning": "string",
"attic": true,
"basement": "string",
"buildingAreaSqFt": 0,
"buildingConditionScore": 0,
"buildingQualityScore": 0,
"constructionType": "string",
"disclaimer": "string",
"exteriorWalls": "string",
"fireplace": true,
"fullBathCount": 0,
"garageParkingOfCars": 0,
"garageTypeParking": "string",
"heating": "string",
"heatingFuelType": "string",
"hoaAmount": 0,
"hoaFrequency": "string",
"noOfBuildings": 0,
"noOfStories": 0,
"numberOfBedrooms": 0,
"numberOfUnits": 0,
"partialBathCount": 0,
"photo1": "string",
"photo2": "string",
"photo3": "string",
"pool": true,
"propertyDesc": "string",
"propertyType": "string",
"roofCover": "string",
"roofType": "string",
"sewer": "string",
"siteAreaAcres": 0,
"style": "string",
"subdivision": "string",
"totalBathCount": 0,
"totalNumberOfRooms": 0,
"water": "string",
"yearBuilt": 0,
"zoning": "string"
},
"salesHistory": [
{
"amount": 0,
"apn": "string",
"eventType": "string",
"fips": "string",
"grantee1": "string",
"grantee1Forenames": "string",
"grantee2": "string",
"grantee2Forenames": "string",
"grantor1": "string",
"grantor1Forenames": "string",
"grantor2": "string",
"grantor2Forenames": "string",
"recordBook": "string",
"recordDate": "string",
"recordDoc": "string",
"recordPage": "string"
}
],
"value": {
"fsd": 0,
"priceLower": 0,
"priceMean": 0,
"priceUpper": 0
},
"listDate": "string",
"listPrice": "string"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | BPO information returned | BPO |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
401 | Unauthorized | Invalid or expired access token | None |
404 | Not Found | Property reference not found | None |
500 | Internal Server Error | Internal server error | None |
Invite
Requests related to the creation of invites
Bulk-create invites
Code samples
const inputBody = '{
"invites": [
{
"invite_type": "owner",
"partner_user_id": "string",
"email": "string",
"first_name": "string",
"last_name": "string",
"phone": "string",
"buyer": {
"buyer_cities": [
"tempe, az",
"phoenix, az"
],
"home_price_min": 0,
"home_price_max": 0,
"beds": 0,
"baths": 0,
"property_type": [
"SFR"
]
},
"owner": {
"sell_price": 0,
"property_address": {
"street": "string",
"unit": "string",
"city": "string",
"state": "st",
"zipcode": "string"
}
}
}
],
"lo_id": "string",
"agent": {
"id": "string",
"license_number": "string",
"license_state": "string"
}
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/invites/',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.post('/v1/partner/invites/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/invites/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakePostRequest()
{
string url = "/v1/partner/invites/";
string json = @"{
""invites"": [
{
""invite_type"": ""owner"",
""partner_user_id"": ""string"",
""email"": ""string"",
""first_name"": ""string"",
""last_name"": ""string"",
""phone"": ""string"",
""buyer"": {
""buyer_cities"": [
""tempe, az"",
""phoenix, az""
],
""home_price_min"": 0,
""home_price_max"": 0,
""beds"": 0,
""baths"": 0,
""property_type"": [
""SFR""
]
},
""owner"": {
""sell_price"": 0,
""property_address"": {
""street"": ""string"",
""unit"": ""string"",
""city"": ""string"",
""state"": ""st"",
""zipcode"": ""string""
}
}
}
],
""lo_id"": ""string"",
""agent"": {
""id"": ""string"",
""license_number"": ""string"",
""license_state"": ""string""
}
}";
InvitesPostRequest content = JsonConvert.DeserializeObject(json);
await PostAsync(content, url);
}
/// Performs a POST Request
public async Task PostAsync(InvitesPostRequest content, string url)
{
//Serialize Object
StringContent jsonContent = SerializeObject(content);
//Execute POST request
HttpResponseMessage response = await Client.PostAsync(url, jsonContent);
}
/// Serialize an object to Json
private StringContent SerializeObject(InvitesPostRequest content)
{
//Serialize Object
string jsonObject = JsonConvert.SerializeObject(content);
//Create Json UTF8 String Content
return new StringContent(jsonObject, Encoding.UTF8, "application/json");
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.post '/v1/partner/invites/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/v1/partner/invites/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
body := `{
"invites": [
{
"invite_type": "owner",
"partner_user_id": "string",
"email": "string",
"first_name": "string",
"last_name": "string",
"phone": "string",
"buyer": {
"buyer_cities": [
"tempe, az",
"phoenix, az"
],
"home_price_min": 0,
"home_price_max": 0,
"beds": 0,
"baths": 0,
"property_type": [
"SFR"
]
},
"owner": {
"sell_price": 0,
"property_address": {
"street": "string",
"unit": "string",
"city": "string",
"state": "st",
"zipcode": "string"
}
}
}
],
"lo_id": "string",
"agent": {
"id": "string",
"license_number": "string",
"license_state": "string"
}
}`
req, err := http.NewRequest("POST", "/v1/partner/invites/", bytes.NewBuffer([]byte{body}))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /v1/partner/invites/
This endpoint accepts a JSON post request that contains an array of invites, and the response will be an array of invite creation responses that report on the success of each invite. A response will be returned for each invite, in the same order they were created.
Note that the value of the invite_type
property should correspond to the presence of either buyer
or owner
values on each invite. So, for example, if you set an invite_type
to owner
, we will expect to find a valid owner
object on the invite, and if you set invite_type
to buyer
, we'll expect to find a valid buyer
object.
Also, you may include identifying information for a loan officer and/or a real estate agent that will be associated with all invites passed in the request. This loan officer and/or agent will be incorporated into the user's ComeHome experience, as contracted.
Body parameter
{
"invites": [
{
"invite_type": "owner",
"partner_user_id": "string",
"email": "string",
"first_name": "string",
"last_name": "string",
"phone": "string",
"buyer": {
"buyer_cities": [
"tempe, az",
"phoenix, az"
],
"home_price_min": 0,
"home_price_max": 0,
"beds": 0,
"baths": 0,
"property_type": [
"SFR"
]
},
"owner": {
"sell_price": 0,
"property_address": {
"street": "string",
"unit": "string",
"city": "string",
"state": "st",
"zipcode": "string"
}
}
}
],
"lo_id": "string",
"agent": {
"id": "string",
"license_number": "string",
"license_state": "string"
}
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | InvitesPostRequest | false | Object that contains the invites to create, plus optional loan officer and agent identifiers. |
Example responses
201 Response
{
"results": [
{
"id": "string",
"message": "string",
"success": true,
"url": "string"
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | A report listing the statuses of all passed invites, noting whether they were successfully created or not. A unique identifier is included for all invites that were successfully created. | InvitesPostResponse |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | Content not found | None |
409 | Conflict | Conflict found with the passed invites | None |
500 | Internal Server Error | Internal server error | None |
Get invites
Code samples
const headers = {
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/invites/',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.get('/v1/partner/invites/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/invites/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeGetRequest()
{
string url = "/v1/partner/invites/";
var result = await GetAsync(url);
}
/// Performs a GET Request
public async Task GetAsync(string url)
{
//Start the request
HttpResponseMessage response = await Client.GetAsync(url);
//Validate result
response.EnsureSuccessStatusCode();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.get '/v1/partner/invites/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/v1/partner/invites/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "/v1/partner/invites/", nil)
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /v1/partner/invites/
Using a user ID, email, or the ID of a specific invite, fetch details for an invite.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
partner_user_id | query | string | false | The unique user id passed by the partner when creating the invite |
query | string | false | The email address used when creating the invite (note that if multiple invites share this email address, all will be returned) | |
invite_id | query | string | false | The ComeHome-provided invite ID that was returned when the invite was created |
Example responses
200 Response
{
"data": [
{
"accepted_date": "2019-08-24T14:15:22Z",
"agent_id": "string",
"buyer": {
"baths": 0,
"beds": 0,
"home_price_max": 0,
"home_price_min": 0,
"place_desc": "string",
"place_id": "string",
"property_type": [
"string"
]
},
"created": "2019-08-24T14:15:22Z",
"digest_email_paused": "2019-08-24T14:15:22Z",
"email": "string",
"email_approved": true,
"email_bounced": "2019-08-24T14:15:22Z",
"email_complained": "2019-08-24T14:15:22Z",
"email_enabled": true,
"email_unsubscribed": "2019-08-24T14:15:22Z",
"first_email_sent": "2019-08-24T14:15:22Z",
"first_name": "string",
"invite_id": "string",
"invite_type": "string",
"last_name": "string",
"loan_officer_lo_id": "string",
"owner": {
"address_id": 0,
"sell_price": 0
},
"owner_email_sent": "2019-08-24T14:15:22Z",
"partner_user_id": "string",
"phone": "string",
"segment_id": "string",
"updated": "2019-08-24T14:15:22Z"
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Returns all invites found that match the passed search criteria | InviteListResponse |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | No invites found matching the passed search criteria | None |
500 | Internal Server Error | Internal server error | None |
Delete an invite
Code samples
const headers = {
'Authorization':'API_KEY'
};
fetch('/v1/partner/invites/',
{
method: 'DELETE',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Authorization': 'API_KEY'
}
r = requests.delete('/v1/partner/invites/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/invites/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("DELETE");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeDeleteRequest()
{
int id = 1;
string url = "/v1/partner/invites/";
await DeleteAsync(id, url);
}
/// Performs a DELETE Request
public async Task DeleteAsync(int id, string url)
{
//Execute DELETE request
HttpResponseMessage response = await Client.DeleteAsync(url + $"/{id}");
//Return response
await DeserializeObject(response);
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Authorization' => 'API_KEY'
}
result = RestClient.delete '/v1/partner/invites/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('DELETE','/v1/partner/invites/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("DELETE", "/v1/partner/invites/", nil)
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
DELETE /v1/partner/invites/
Pass either a ComeHome-provided invite ID (returned when the invite was created) or the unique user ID used to create the invite, and the corresponding invite will be deleted, if found.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
invite_id | query | string | false | The ComeHome-provided invite ID that was returned when the invite was created |
partner_user_id | query | string | false | The unique user id passed by the partner when creating the invite |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | No content (invite was successfully deleted) | None |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | Invite not found | None |
500 | Internal Server Error | Internal server error | None |
Update an invite
Code samples
const inputBody = '{
"agent_id": "string",
"buyer": {
"baths": 0,
"beds": 0,
"buyer_cities": [
"string"
],
"home_price_max": 0,
"home_price_min": 0,
"property_type": [
"string"
]
},
"email": "string",
"email_approved": true,
"email_enabled": true,
"email_unsubscribed": "2019-08-24T14:15:22Z",
"first_name": "string",
"invite_type": "string",
"last_name": "string",
"loan_officer_lo_id": "string",
"owner": {
"property_address": {
"city": "string",
"state": "string",
"street": "string",
"unit": "string",
"zipcode": "string"
},
"sell_price": 0
},
"phone": "string",
"segment_id": "string"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/invites/',
{
method: 'PATCH',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.patch('/v1/partner/invites/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/invites/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PATCH");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.patch '/v1/partner/invites/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PATCH','/v1/partner/invites/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
body := `{
"agent_id": "string",
"buyer": {
"baths": 0,
"beds": 0,
"buyer_cities": [
"string"
],
"home_price_max": 0,
"home_price_min": 0,
"property_type": [
"string"
]
},
"email": "string",
"email_approved": true,
"email_enabled": true,
"email_unsubscribed": "2019-08-24T14:15:22Z",
"first_name": "string",
"invite_type": "string",
"last_name": "string",
"loan_officer_lo_id": "string",
"owner": {
"property_address": {
"city": "string",
"state": "string",
"street": "string",
"unit": "string",
"zipcode": "string"
},
"sell_price": 0
},
"phone": "string",
"segment_id": "string"
}`
req, err := http.NewRequest("PATCH", "/v1/partner/invites/", bytes.NewBuffer([]byte{body}))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
PATCH /v1/partner/invites/
Using a user ID or the ID of an invite (which was provided when the invite was created) to specify an invite, update the details for said invite.
Body parameter
{
"agent_id": "string",
"buyer": {
"baths": 0,
"beds": 0,
"buyer_cities": [
"string"
],
"home_price_max": 0,
"home_price_min": 0,
"property_type": [
"string"
]
},
"email": "string",
"email_approved": true,
"email_enabled": true,
"email_unsubscribed": "2019-08-24T14:15:22Z",
"first_name": "string",
"invite_type": "string",
"last_name": "string",
"loan_officer_lo_id": "string",
"owner": {
"property_address": {
"city": "string",
"state": "string",
"street": "string",
"unit": "string",
"zipcode": "string"
},
"sell_price": 0
},
"phone": "string",
"segment_id": "string"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
invite_id | query | string | false | The ComeHome-provided invite ID that was returned when the invite was created |
partner_user_id | query | string | false | The unique user id passed by the partner when creating the invite |
body | body | InvitePatchRequest | false | none |
Example responses
200 Response
{
"accepted_date": "2019-08-24T14:15:22Z",
"agent_id": "string",
"buyer": {
"baths": 0,
"beds": 0,
"home_price_max": 0,
"home_price_min": 0,
"place_desc": "string",
"place_id": "string",
"property_type": [
"string"
]
},
"created": "2019-08-24T14:15:22Z",
"digest_email_paused": "2019-08-24T14:15:22Z",
"email": "string",
"email_approved": true,
"email_bounced": "2019-08-24T14:15:22Z",
"email_complained": "2019-08-24T14:15:22Z",
"email_enabled": true,
"email_unsubscribed": "2019-08-24T14:15:22Z",
"first_email_sent": "2019-08-24T14:15:22Z",
"first_name": "string",
"invite_id": "string",
"invite_type": "string",
"last_name": "string",
"loan_officer_lo_id": "string",
"owner": {
"address_id": 0,
"sell_price": 0
},
"owner_email_sent": "2019-08-24T14:15:22Z",
"partner_user_id": "string",
"phone": "string",
"segment_id": "string",
"updated": "2019-08-24T14:15:22Z"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | The updated invite data | InviteResponse |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | Invite not found | None |
409 | Conflict | Conflict found with the passed invite data | None |
500 | Internal Server Error | Internal server error | None |
Equity
Requests related to the creation of user equity records
Provides an endpoint to create user equity records
Code samples
const inputBody = '{
"PartnerUserID": "string",
"CurrentBalance": 0,
"CurrentBalanceAsOfDate": "string",
"InterestRate": 0,
"OriginalLoanAmount": 0,
"OriginationDate": "string",
"MonthlyPaymentDueDate": "string",
"MonthlyPaymentPI": 0,
"MonthlyPaymentTI": 0,
"LenderDataTag": "string",
"LoanTerms": "string",
"SecondMortgageCurrentBalance": 0,
"SecondMortgageCurrentBalanceAsOfDate": "string",
"SecondMortgageInterestRate": 0,
"SecondMortgageLoanTerms": "string",
"SecondMortgageOriginationDate": "string",
"SecondMortgageOriginalLoanAmount": 0,
"SecondMortgageMonthlyPaymentDueDate": "string",
"SecondMortgageMonthlyPaymentPI": 0,
"SecondMortgageMonthlyPaymentTI": 0,
"StreetAddress": "string",
"Unit": "string",
"City": "string",
"State": "string",
"Zip": "string"
}';
const headers = {
'Content-Type':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/equity',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Content-Type': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.post('/v1/partner/equity', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/equity");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakePostRequest()
{
string url = "/v1/partner/equity";
string json = @"{
""PartnerUserID"": ""string"",
""CurrentBalance"": 0,
""CurrentBalanceAsOfDate"": ""string"",
""InterestRate"": 0,
""OriginalLoanAmount"": 0,
""OriginationDate"": ""string"",
""MonthlyPaymentDueDate"": ""string"",
""MonthlyPaymentPI"": 0,
""MonthlyPaymentTI"": 0,
""LenderDataTag"": ""string"",
""LoanTerms"": ""string"",
""SecondMortgageCurrentBalance"": 0,
""SecondMortgageCurrentBalanceAsOfDate"": ""string"",
""SecondMortgageInterestRate"": 0,
""SecondMortgageLoanTerms"": ""string"",
""SecondMortgageOriginationDate"": ""string"",
""SecondMortgageOriginalLoanAmount"": 0,
""SecondMortgageMonthlyPaymentDueDate"": ""string"",
""SecondMortgageMonthlyPaymentPI"": 0,
""SecondMortgageMonthlyPaymentTI"": 0,
""StreetAddress"": ""string"",
""Unit"": ""string"",
""City"": ""string"",
""State"": ""string"",
""Zip"": ""string""
}";
Equity content = JsonConvert.DeserializeObject(json);
await PostAsync(content, url);
}
/// Performs a POST Request
public async Task PostAsync(Equity content, string url)
{
//Serialize Object
StringContent jsonContent = SerializeObject(content);
//Execute POST request
HttpResponseMessage response = await Client.PostAsync(url, jsonContent);
}
/// Serialize an object to Json
private StringContent SerializeObject(Equity content)
{
//Serialize Object
string jsonObject = JsonConvert.SerializeObject(content);
//Create Json UTF8 String Content
return new StringContent(jsonObject, Encoding.UTF8, "application/json");
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.post '/v1/partner/equity',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/v1/partner/equity', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
body := `{
"PartnerUserID": "string",
"CurrentBalance": 0,
"CurrentBalanceAsOfDate": "string",
"InterestRate": 0,
"OriginalLoanAmount": 0,
"OriginationDate": "string",
"MonthlyPaymentDueDate": "string",
"MonthlyPaymentPI": 0,
"MonthlyPaymentTI": 0,
"LenderDataTag": "string",
"LoanTerms": "string",
"SecondMortgageCurrentBalance": 0,
"SecondMortgageCurrentBalanceAsOfDate": "string",
"SecondMortgageInterestRate": 0,
"SecondMortgageLoanTerms": "string",
"SecondMortgageOriginationDate": "string",
"SecondMortgageOriginalLoanAmount": 0,
"SecondMortgageMonthlyPaymentDueDate": "string",
"SecondMortgageMonthlyPaymentPI": 0,
"SecondMortgageMonthlyPaymentTI": 0,
"StreetAddress": "string",
"Unit": "string",
"City": "string",
"State": "string",
"Zip": "string"
}`
req, err := http.NewRequest("POST", "/v1/partner/equity", bytes.NewBuffer([]byte{body}))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /v1/partner/equity
This endpoint accepts a JSON object containing a single Equity object. The Equity object describes a single mortgage payment made by a Partner's user against a property that user is currently paying off. The endpoint will return a status code indicating whether or not the Equity was successfully saved.
Body parameter
{
"PartnerUserID": "string",
"CurrentBalance": 0,
"CurrentBalanceAsOfDate": "string",
"InterestRate": 0,
"OriginalLoanAmount": 0,
"OriginationDate": "string",
"MonthlyPaymentDueDate": "string",
"MonthlyPaymentPI": 0,
"MonthlyPaymentTI": 0,
"LenderDataTag": "string",
"LoanTerms": "string",
"SecondMortgageCurrentBalance": 0,
"SecondMortgageCurrentBalanceAsOfDate": "string",
"SecondMortgageInterestRate": 0,
"SecondMortgageLoanTerms": "string",
"SecondMortgageOriginationDate": "string",
"SecondMortgageOriginalLoanAmount": 0,
"SecondMortgageMonthlyPaymentDueDate": "string",
"SecondMortgageMonthlyPaymentPI": 0,
"SecondMortgageMonthlyPaymentTI": 0,
"StreetAddress": "string",
"Unit": "string",
"City": "string",
"State": "string",
"Zip": "string"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | Equity | false | The Equity object to save. |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | Equity created successfully | None |
400 | Bad Request | Bad request (e.g. a required field was missing) | None |
401 | Unauthorized | Invalid client ID or secret | None |
404 | Not Found | Given property address could not be found. | None |
Saved Homes
Requests related to homes that have been saved (or bookmarked) by users
Fetch saved homes
Code samples
const headers = {
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/users/{partner_user_id}/saved_homes/',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.get('/v1/partner/users/{partner_user_id}/saved_homes/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/users/{partner_user_id}/saved_homes/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeGetRequest()
{
string url = "/v1/partner/users/{partner_user_id}/saved_homes/";
var result = await GetAsync(url);
}
/// Performs a GET Request
public async Task GetAsync(string url)
{
//Start the request
HttpResponseMessage response = await Client.GetAsync(url);
//Validate result
response.EnsureSuccessStatusCode();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.get '/v1/partner/users/{partner_user_id}/saved_homes/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/v1/partner/users/{partner_user_id}/saved_homes/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "/v1/partner/users/{partner_user_id}/saved_homes/", nil)
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /v1/partner/users/{partner_user_id}/saved_homes/
This endpoint returns a list of all homes that have been saved by a user. The user is identified by the partner_user_id
provided by the partner, passed as part of the request path.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
partner_user_id | path | string | true | none |
Example responses
200 Response
[
{
"city": "string",
"created": "2019-08-24T14:15:22Z",
"slug": "string",
"state": "string",
"street": "string",
"unit": "string",
"updated": "2019-08-24T14:15:22Z",
"zipcode": "string"
}
]
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A list of all homes saved by the user. More information about a property may be requested using the property's slug identifier in the response. |
Inline |
400 | Bad Request | Bad request (e.g. a required field was missing) | None |
404 | Not Found | Given property address could not be found. | None |
500 | Internal Server Error | Internal server error | None |
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | [SavedHomeResponse] | false | none | none |
» city | string | false | none | none |
» created | string(date-time) | false | none | none |
» slug | string | false | none | none |
» state | string | false | none | none |
» street | string | false | none | none |
» unit | string | false | none | none |
» updated | string(date-time) | false | none | none |
» zipcode | string | false | none | none |
Save a new home
Code samples
const inputBody = '{
"city": "string",
"state": "string",
"street": "string",
"unit": "string",
"zipcode": "string"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/users/{partner_user_id}/saved_homes/',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.post('/v1/partner/users/{partner_user_id}/saved_homes/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/users/{partner_user_id}/saved_homes/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakePostRequest()
{
string url = "/v1/partner/users/{partner_user_id}/saved_homes/";
string json = @"{
""city"": ""string"",
""state"": ""string"",
""street"": ""string"",
""unit"": ""string"",
""zipcode"": ""string""
}";
AddressQueryValues content = JsonConvert.DeserializeObject(json);
await PostAsync(content, url);
}
/// Performs a POST Request
public async Task PostAsync(AddressQueryValues content, string url)
{
//Serialize Object
StringContent jsonContent = SerializeObject(content);
//Execute POST request
HttpResponseMessage response = await Client.PostAsync(url, jsonContent);
}
/// Serialize an object to Json
private StringContent SerializeObject(AddressQueryValues content)
{
//Serialize Object
string jsonObject = JsonConvert.SerializeObject(content);
//Create Json UTF8 String Content
return new StringContent(jsonObject, Encoding.UTF8, "application/json");
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.post '/v1/partner/users/{partner_user_id}/saved_homes/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/v1/partner/users/{partner_user_id}/saved_homes/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
body := `{
"city": "string",
"state": "string",
"street": "string",
"unit": "string",
"zipcode": "string"
}`
req, err := http.NewRequest("POST", "/v1/partner/users/{partner_user_id}/saved_homes/", bytes.NewBuffer([]byte{body}))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /v1/partner/users/{partner_user_id}/saved_homes/
Create a new saved home on behalf of a user. The new saved home will appear in the user's list of saved homes, and the user may receive notifications about the home, based on their settings.
A 404
will be returned if the address values passed in the request body cannot be matched to a known property.
Body parameter
{
"city": "string",
"state": "string",
"street": "string",
"unit": "string",
"zipcode": "string"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
partner_user_id | path | string | true | none |
body | body | AddressQueryValues | true | none |
Example responses
201 Response
{
"city": "string",
"created": "2019-08-24T14:15:22Z",
"slug": "string",
"state": "string",
"street": "string",
"unit": "string",
"updated": "2019-08-24T14:15:22Z",
"zipcode": "string"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | Saved home added successfully | SavedHomeResponse |
400 | Bad Request | Bad request (e.g. a required field was missing) | None |
404 | Not Found | User or property not found | None |
409 | Conflict | A conflicting saved home was found | None |
500 | Internal Server Error | Internal server error | None |
Remove a saved home
Code samples
const headers = {
'Authorization':'API_KEY'
};
fetch('/v1/partner/users/{partner_user_id}/saved_homes/{slug}',
{
method: 'DELETE',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Authorization': 'API_KEY'
}
r = requests.delete('/v1/partner/users/{partner_user_id}/saved_homes/{slug}', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/users/{partner_user_id}/saved_homes/{slug}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("DELETE");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeDeleteRequest()
{
int id = 1;
string url = "/v1/partner/users/{partner_user_id}/saved_homes/{slug}";
await DeleteAsync(id, url);
}
/// Performs a DELETE Request
public async Task DeleteAsync(int id, string url)
{
//Execute DELETE request
HttpResponseMessage response = await Client.DeleteAsync(url + $"/{id}");
//Return response
await DeserializeObject(response);
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Authorization' => 'API_KEY'
}
result = RestClient.delete '/v1/partner/users/{partner_user_id}/saved_homes/{slug}',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('DELETE','/v1/partner/users/{partner_user_id}/saved_homes/{slug}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("DELETE", "/v1/partner/users/{partner_user_id}/saved_homes/{slug}", nil)
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
DELETE /v1/partner/users/{partner_user_id}/saved_homes/{slug}
Remove a saved home from a user's list of saved homes, and stop any notifications the user may be receiving regarding the home.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
partner_user_id | path | string | true | none |
slug | path | string | true | none |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | Saved home removed successfully | None |
400 | Bad Request | Bad request (e.g. a required field was missing) | None |
404 | Not Found | User or property not found | None |
500 | Internal Server Error | Internal server error | None |
Claimed Property
Requests related to properties a user has claimed as a homeowner.
List claimed properties
Code samples
const headers = {
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/users/{partner_user_id}/claimed_properties/',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.get('/v1/partner/users/{partner_user_id}/claimed_properties/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/users/{partner_user_id}/claimed_properties/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeGetRequest()
{
string url = "/v1/partner/users/{partner_user_id}/claimed_properties/";
var result = await GetAsync(url);
}
/// Performs a GET Request
public async Task GetAsync(string url)
{
//Start the request
HttpResponseMessage response = await Client.GetAsync(url);
//Validate result
response.EnsureSuccessStatusCode();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.get '/v1/partner/users/{partner_user_id}/claimed_properties/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/v1/partner/users/{partner_user_id}/claimed_properties/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "/v1/partner/users/{partner_user_id}/claimed_properties/", nil)
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /v1/partner/users/{partner_user_id}/claimed_properties/
This endpoint returns a list of all homes that have been claimed by the user as a homeowner. The user is identified by the partner_user_id
provided by the partner, passed as part of the request path.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
partner_user_id | path | string | true | none |
Example responses
200 Response
[
{
"basement": true,
"baths_full": 0,
"baths_partial": 0,
"beds": 0,
"city": "string",
"condition": "string",
"created": "2019-08-24T14:15:22Z",
"failed_count": 0,
"garage_type": "string",
"interested_in_selling": "string",
"interested_in_selling_last_updated": "2019-08-24T14:15:22Z",
"invite_id": "string",
"last_failure": "2019-08-24T14:15:22Z",
"living_area": 0,
"lockout_date": "2019-08-24T14:15:22Z",
"lot_size": 0,
"opted_in_to_sell": true,
"pmi_modal_was_shown": true,
"pool": true,
"room_count": 0,
"sale_price": 0,
"slug": "string",
"state": "string",
"street": "string",
"unit": "string",
"updated": "2019-08-24T14:15:22Z",
"user_id": "string",
"verified": true,
"zipcode": "string"
}
]
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A list of all homes claimed by the user. More information about a property may be requested using the property's slug identifier in the response. |
Inline |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | No invites found matching the passed search criteria | None |
500 | Internal Server Error | Internal server error | None |
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | [ClaimedPropertyResponse] | false | none | none |
» basement | boolean | false | none | none |
» baths_full | integer | false | none | none |
» baths_partial | integer | false | none | none |
» beds | integer | false | none | none |
» city | string | false | none | none |
» condition | string | false | none | none |
» created | string(date-time) | false | none | none |
» failed_count | integer | false | none | none |
» garage_type | string | false | none | none |
» interested_in_selling | string | false | none | none |
» interested_in_selling_last_updated | string(date-time) | false | none | none |
» invite_id | string | false | none | none |
» last_failure | string(date-time) | false | none | none |
» living_area | integer | false | none | none |
» lockout_date | string(date-time) | false | none | none |
» lot_size | number | false | none | none |
» opted_in_to_sell | boolean | false | none | none |
» pmi_modal_was_shown | boolean | false | none | none |
» pool | boolean | false | none | none |
» room_count | integer | false | none | none |
» sale_price | integer | false | none | none |
» slug | string | false | none | none |
» state | string | false | none | none |
» street | string | false | none | none |
» unit | string | false | none | none |
» updated | string(date-time) | false | none | none |
» user_id | string | false | none | none |
» verified | boolean | false | none | none |
» zipcode | string | false | none | none |
Post a new property claim
Code samples
const inputBody = '{
"city": "string",
"state": "string",
"street": "string",
"unit": "string",
"zipcode": "string"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/users/{partner_user_id}/claimed_properties/',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.post('/v1/partner/users/{partner_user_id}/claimed_properties/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/users/{partner_user_id}/claimed_properties/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakePostRequest()
{
string url = "/v1/partner/users/{partner_user_id}/claimed_properties/";
string json = @"{
""city"": ""string"",
""state"": ""string"",
""street"": ""string"",
""unit"": ""string"",
""zipcode"": ""string""
}";
AddressQueryValues content = JsonConvert.DeserializeObject(json);
await PostAsync(content, url);
}
/// Performs a POST Request
public async Task PostAsync(AddressQueryValues content, string url)
{
//Serialize Object
StringContent jsonContent = SerializeObject(content);
//Execute POST request
HttpResponseMessage response = await Client.PostAsync(url, jsonContent);
}
/// Serialize an object to Json
private StringContent SerializeObject(AddressQueryValues content)
{
//Serialize Object
string jsonObject = JsonConvert.SerializeObject(content);
//Create Json UTF8 String Content
return new StringContent(jsonObject, Encoding.UTF8, "application/json");
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.post '/v1/partner/users/{partner_user_id}/claimed_properties/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/v1/partner/users/{partner_user_id}/claimed_properties/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
body := `{
"city": "string",
"state": "string",
"street": "string",
"unit": "string",
"zipcode": "string"
}`
req, err := http.NewRequest("POST", "/v1/partner/users/{partner_user_id}/claimed_properties/", bytes.NewBuffer([]byte{body}))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /v1/partner/users/{partner_user_id}/claimed_properties/
Create a new claimed home on behalf of a user. The new saved home will appear in the user's list of claimed homes in their homeowner experience, and the user may receive notifications about the home, based on their settings.
A 404
will be returned if the address values passed in the request body cannot be matched to a known property.
Body parameter
{
"city": "string",
"state": "string",
"street": "string",
"unit": "string",
"zipcode": "string"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
partner_user_id | path | string | true | none |
body | body | AddressQueryValues | true | none |
Example responses
201 Response
{
"basement": true,
"baths_full": 0,
"baths_partial": 0,
"beds": 0,
"city": "string",
"condition": "string",
"created": "2019-08-24T14:15:22Z",
"failed_count": 0,
"garage_type": "string",
"interested_in_selling": "string",
"interested_in_selling_last_updated": "2019-08-24T14:15:22Z",
"invite_id": "string",
"last_failure": "2019-08-24T14:15:22Z",
"living_area": 0,
"lockout_date": "2019-08-24T14:15:22Z",
"lot_size": 0,
"opted_in_to_sell": true,
"pmi_modal_was_shown": true,
"pool": true,
"room_count": 0,
"sale_price": 0,
"slug": "string",
"state": "string",
"street": "string",
"unit": "string",
"updated": "2019-08-24T14:15:22Z",
"user_id": "string",
"verified": true,
"zipcode": "string"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | Claimed property created successfully | ClaimedPropertyResponse |
400 | Bad Request | Bad request (e.g. a required field was missing) | None |
404 | Not Found | User or property not found | None |
409 | Conflict | A conflicting claimed property was found | None |
500 | Internal Server Error | Internal server error | None |
Fetch a property claim
Code samples
const headers = {
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/users/{partner_user_id}/claimed_properties/{slug}/',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.get('/v1/partner/users/{partner_user_id}/claimed_properties/{slug}/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/users/{partner_user_id}/claimed_properties/{slug}/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeGetRequest()
{
string url = "/v1/partner/users/{partner_user_id}/claimed_properties/{slug}/";
var result = await GetAsync(url);
}
/// Performs a GET Request
public async Task GetAsync(string url)
{
//Start the request
HttpResponseMessage response = await Client.GetAsync(url);
//Validate result
response.EnsureSuccessStatusCode();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.get '/v1/partner/users/{partner_user_id}/claimed_properties/{slug}/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/v1/partner/users/{partner_user_id}/claimed_properties/{slug}/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "/v1/partner/users/{partner_user_id}/claimed_properties/{slug}/", nil)
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /v1/partner/users/{partner_user_id}/claimed_properties/{slug}/
Returns data for a single property that the user has claimed, including information about the property and certain interactions the user has had with that property in their homeowner dashboard.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
partner_user_id | path | string | true | none |
slug | path | string | true | none |
Example responses
200 Response
{
"basement": true,
"baths_full": 0,
"baths_partial": 0,
"beds": 0,
"city": "string",
"condition": "string",
"created": "2019-08-24T14:15:22Z",
"failed_count": 0,
"garage_type": "string",
"interested_in_selling": "string",
"interested_in_selling_last_updated": "2019-08-24T14:15:22Z",
"invite_id": "string",
"last_failure": "2019-08-24T14:15:22Z",
"living_area": 0,
"lockout_date": "2019-08-24T14:15:22Z",
"lot_size": 0,
"opted_in_to_sell": true,
"pmi_modal_was_shown": true,
"pool": true,
"room_count": 0,
"sale_price": 0,
"slug": "string",
"state": "string",
"street": "string",
"unit": "string",
"updated": "2019-08-24T14:15:22Z",
"user_id": "string",
"verified": true,
"zipcode": "string"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Data about the relevant claimed property. | ClaimedPropertyResponse |
400 | Bad Request | Bad request (e.g. a required field was missing) | None |
404 | Not Found | User or property not found | None |
500 | Internal Server Error | Internal server error | None |
Delete a property claim
Code samples
const headers = {
'Authorization':'API_KEY'
};
fetch('/v1/partner/users/{partner_user_id}/claimed_properties/{slug}/',
{
method: 'DELETE',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Authorization': 'API_KEY'
}
r = requests.delete('/v1/partner/users/{partner_user_id}/claimed_properties/{slug}/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/users/{partner_user_id}/claimed_properties/{slug}/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("DELETE");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeDeleteRequest()
{
int id = 1;
string url = "/v1/partner/users/{partner_user_id}/claimed_properties/{slug}/";
await DeleteAsync(id, url);
}
/// Performs a DELETE Request
public async Task DeleteAsync(int id, string url)
{
//Execute DELETE request
HttpResponseMessage response = await Client.DeleteAsync(url + $"/{id}");
//Return response
await DeserializeObject(response);
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Authorization' => 'API_KEY'
}
result = RestClient.delete '/v1/partner/users/{partner_user_id}/claimed_properties/{slug}/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('DELETE','/v1/partner/users/{partner_user_id}/claimed_properties/{slug}/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("DELETE", "/v1/partner/users/{partner_user_id}/claimed_properties/{slug}/", nil)
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
DELETE /v1/partner/users/{partner_user_id}/claimed_properties/{slug}/
Remove a claimed home from a user's list of claimed homes in their homeowner dashboard, and stop any notifications the user may be receiving regarding the home.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
slug | path | string | true | none |
partner_user_id | path | string | true | none |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | Claimed property deleted successfully | None |
400 | Bad Request | Bad request (e.g. a required field was missing) | None |
404 | Not Found | User or property not found | None |
500 | Internal Server Error | Internal server error | None |
CTAs
Requests related to the management of custom calls-to-action (CTAs).
Create a new CTA
Code samples
const inputBody = '{
"cta_url": "string",
"lo_specific_url": "string",
"device": "string",
"image_alt_text": "string",
"image_url": "string",
"page": "string",
"tracking_id": "string",
"native_app_nav_key": "string"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/ctas/',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.post('/v1/partner/ctas/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/ctas/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakePostRequest()
{
string url = "/v1/partner/ctas/";
string json = @"{
""cta_url"": ""string"",
""lo_specific_url"": ""string"",
""device"": ""string"",
""image_alt_text"": ""string"",
""image_url"": ""string"",
""page"": ""string"",
""tracking_id"": ""string"",
""native_app_nav_key"": ""string""
}";
CTACreateRequest content = JsonConvert.DeserializeObject(json);
await PostAsync(content, url);
}
/// Performs a POST Request
public async Task PostAsync(CTACreateRequest content, string url)
{
//Serialize Object
StringContent jsonContent = SerializeObject(content);
//Execute POST request
HttpResponseMessage response = await Client.PostAsync(url, jsonContent);
}
/// Serialize an object to Json
private StringContent SerializeObject(CTACreateRequest content)
{
//Serialize Object
string jsonObject = JsonConvert.SerializeObject(content);
//Create Json UTF8 String Content
return new StringContent(jsonObject, Encoding.UTF8, "application/json");
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.post '/v1/partner/ctas/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/v1/partner/ctas/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
body := `{
"cta_url": "string",
"lo_specific_url": "string",
"device": "string",
"image_alt_text": "string",
"image_url": "string",
"page": "string",
"tracking_id": "string",
"native_app_nav_key": "string"
}`
req, err := http.NewRequest("POST", "/v1/partner/ctas/", bytes.NewBuffer([]byte{body}))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /v1/partner/ctas/
Creates a new CTA for the given device
and page
combination, using the given CTA details. Up to 100 total CTA variants may be created. If multiple CTAs are available for a given device/page combination, one of the CTAs will be chosen for display at random.
Note that the passed image_url
will be used to load the image and then copy it onto a ComeHome-controlled service, where it will then be served for ComeHome users.
If you want to use the same image dimensions on all CTA locations, you can use a standard 300w x 250h, but we also support larger images that fill the available space in each CTA location within ComeHome. These dimensions vary by page, but support the following dimensions:
Search Results Page (SRP) Card dimensions = 332 x 333 ("page": "property_search")
Property Details Page (PDP) Card dimensions = 350 x 275 ("page": "property_details")
Home Owner Dashboard (HOD) Card dimensions = 400 x 380 ("page": "homeowner")
Home Improvement Calculator (HIC) Card dimensions = 380 x 333 ("page": "home_improvement_calculator")
Note: For all locations/dimensions, we also support providing a higher-resolution image with the same pixel ratio (for example: 300x250; 600x500; 1200x1000, etc.). All images must be either a JPEG, PNG, or GIF, and must be less than 1MB in size.
Body parameter
{
"cta_url": "string",
"lo_specific_url": "string",
"device": "string",
"image_alt_text": "string",
"image_url": "string",
"page": "string",
"tracking_id": "string",
"native_app_nav_key": "string"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | CTACreateRequest | true | Data defining where the CTA should be displayed, what it will look like, and where the CTA will take users. |
Example responses
200 Response
{
"id": "string"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | The ComeHome-assigned unique identifier for the passed CTA. This identifier can be used to fetch or delete the CTA. | CTACreateResponse |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | Partner not found | None |
500 | Internal Server Error | Internal server error | None |
Get CTA details
Code samples
const headers = {
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/ctas/{ctaID}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.get('/v1/partner/ctas/{ctaID}', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/ctas/{ctaID}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeGetRequest()
{
string url = "/v1/partner/ctas/{ctaID}";
var result = await GetAsync(url);
}
/// Performs a GET Request
public async Task GetAsync(string url)
{
//Start the request
HttpResponseMessage response = await Client.GetAsync(url);
//Validate result
response.EnsureSuccessStatusCode();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.get '/v1/partner/ctas/{ctaID}',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/v1/partner/ctas/{ctaID}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "/v1/partner/ctas/{ctaID}", nil)
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /v1/partner/ctas/{ctaID}
Given a ComeHome-assigned CTA identifier, which was returned when the CTA was created, this endpoint will return all details for that CTA.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
ctaID | path | string | true | The ComeHome-assigned identifier for the CTA |
Example responses
200 Response
{
"cta_url": "string",
"lo_specific_url": "string",
"device": "string",
"id": "string",
"image_alt_text": "string",
"image_url": "string",
"original_image_url": "string",
"page": "string",
"tracking_id": "string",
"native_app_nav_key": "string"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | All details for the given CTA. | CTAResponse |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | Partner not found | None |
500 | Internal Server Error | Internal server error | None |
Update a CTA
Code samples
const inputBody = '{
"cta_url": "string",
"lo_specific_url": "string",
"device": "string",
"image_alt_text": "string",
"image_url": "string",
"page": "string",
"tracking_id": "string",
"native_app_nav_key": "string"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/ctas/{ctaID}',
{
method: 'PATCH',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.patch('/v1/partner/ctas/{ctaID}', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/ctas/{ctaID}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PATCH");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.patch '/v1/partner/ctas/{ctaID}',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PATCH','/v1/partner/ctas/{ctaID}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
body := `{
"cta_url": "string",
"lo_specific_url": "string",
"device": "string",
"image_alt_text": "string",
"image_url": "string",
"page": "string",
"tracking_id": "string",
"native_app_nav_key": "string"
}`
req, err := http.NewRequest("PATCH", "/v1/partner/ctas/{ctaID}", bytes.NewBuffer([]byte{body}))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
PATCH /v1/partner/ctas/{ctaID}
Patches a CTA. Any combination of fields may be passed, and only the passed fields will be updated.
Note that if a image_url
is passed, then the existing image will be deleted and the new image will be uploaded to a ComeHome-controlled service.
If you want to use the same image dimensions on all CTA locations, you can use a standard 300w x 250h, but we also support larger images that fill the available space in each CTA location within ComeHome. These dimensions vary by page, but support the following dimensions:
Search Results Page (SRP) Card dimensions = 332 x 333 ("page": "property_search")
Property Details Page (PDP) Card dimensions = 350 x 275 ("page": "property_details")
Home Owner Dashboard (HOD) Card dimensions = 400 x 380 ("page": "homeowner")
Home Improvement Calculator (HIC) Card dimensions = 380 x 333 ("page": "home_improvement_calculator")
Note: For all locations/dimensions, we also support providing a higher-resolution image with the same pixel ratio (for example: 300x250; 600x500; 1200x1000, etc.). All images must be either a JPEG, PNG, or GIF, and must be less than 1MB in size.
Body parameter
{
"cta_url": "string",
"lo_specific_url": "string",
"device": "string",
"image_alt_text": "string",
"image_url": "string",
"page": "string",
"tracking_id": "string",
"native_app_nav_key": "string"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | CTACreateRequest | true | Data defining where the CTA should be displayed, what it will look like, and where the CTA will take users. |
Example responses
200 Response
{
"id": "string"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | The ComeHome-assigned unique identifier for the passed CTA. This identifier can be used to fetch or delete the CTA. | CTACreateResponse |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | Partner not found | None |
500 | Internal Server Error | Internal server error | None |
Delete a CTA
Code samples
const headers = {
'Authorization':'API_KEY'
};
fetch('/v1/partner/ctas/{ctaID}',
{
method: 'DELETE',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Authorization': 'API_KEY'
}
r = requests.delete('/v1/partner/ctas/{ctaID}', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/ctas/{ctaID}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("DELETE");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeDeleteRequest()
{
int id = 1;
string url = "/v1/partner/ctas/{ctaID}";
await DeleteAsync(id, url);
}
/// Performs a DELETE Request
public async Task DeleteAsync(int id, string url)
{
//Execute DELETE request
HttpResponseMessage response = await Client.DeleteAsync(url + $"/{id}");
//Return response
await DeserializeObject(response);
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Authorization' => 'API_KEY'
}
result = RestClient.delete '/v1/partner/ctas/{ctaID}',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('DELETE','/v1/partner/ctas/{ctaID}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("DELETE", "/v1/partner/ctas/{ctaID}", nil)
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
DELETE /v1/partner/ctas/{ctaID}
Given a ComeHome-assigned CTA identifier, which was returned when the CTA was created, this endpoint will delete the CTA, and take it out of display circulation for users.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
ctaID | path | string | true | The ComeHome-assigned identifier for the CTA |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | Indicates the CTA data was received and deleted successfully | None |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | Partner not found | None |
500 | Internal Server Error | Internal server error | None |
Users
Requests related to fetching and updating user profile information and related data.
Get users matching search
Code samples
const headers = {
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/users/',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.get('/v1/partner/users/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/users/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeGetRequest()
{
string url = "/v1/partner/users/";
var result = await GetAsync(url);
}
/// Performs a GET Request
public async Task GetAsync(string url)
{
//Start the request
HttpResponseMessage response = await Client.GetAsync(url);
//Validate result
response.EnsureSuccessStatusCode();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.get '/v1/partner/users/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/v1/partner/users/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "/v1/partner/users/", nil)
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /v1/partner/users/
This endpoint returns information about users, based on search parameters passed to the request (as query parameters).
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
user_id | query | string | false | The unique identifier ComeHome generated for the user. |
partner_user_id | query | string | false | The unique identifier for the user that was supplied by the partner. |
updated_after | query | string | false | A date string in the format YYYY-MM-DDTHH:MM:SS that will return all users updated after the given date. |
cursor | query | string | false | A cursor value returned in a previous response. Passing this value will return all users after the user relevant to the cursor, up to limit entries. |
limit | query | integer | false | The maximum number of items returned in the response. The maximum value is 100. If no value is passed, the default limit is 10. |
Example responses
200 Response
{
"data": [
{
"active": true,
"city": "string",
"email": "string",
"email_bounced": "2019-08-24T14:15:22Z",
"email_complained": "2019-08-24T14:15:22Z",
"first_name": "string",
"id": "string",
"last_name": "string",
"partner_id": "string",
"partner_user_id": "string",
"phone": "string",
"register_application": "string",
"send_email": true,
"send_email_homeowner": true,
"send_email_search": true,
"send_mobile": true,
"send_mobile_search": true,
"state": "string",
"street_address": "string",
"terms_accepted": "2019-08-24T14:15:22Z",
"zip_code": "string"
}
],
"cursor": "string"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Returns users that match the passed search criteria | UserListResponse |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
500 | Internal Server Error | Internal server error | None |
Update a user
Code samples
const inputBody = '{
"active": true,
"agent_id": "string",
"city": "string",
"email": "string",
"first_name": "string",
"last_name": "string",
"loan_officer_id": "string",
"phone": "string",
"send_email": true,
"send_email_homeowner": true,
"send_email_search": true,
"send_mobile": true,
"send_mobile_search": true,
"state": "string",
"street_address": "string",
"zip_code": "string"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/users/',
{
method: 'PATCH',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.patch('/v1/partner/users/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/users/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PATCH");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.patch '/v1/partner/users/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PATCH','/v1/partner/users/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
body := `{
"active": true,
"agent_id": "string",
"city": "string",
"email": "string",
"first_name": "string",
"last_name": "string",
"loan_officer_id": "string",
"phone": "string",
"send_email": true,
"send_email_homeowner": true,
"send_email_search": true,
"send_mobile": true,
"send_mobile_search": true,
"state": "string",
"street_address": "string",
"zip_code": "string"
}`
req, err := http.NewRequest("PATCH", "/v1/partner/users/", bytes.NewBuffer([]byte{body}))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
PATCH /v1/partner/users/
Update a user's profile information and related data.
Body parameter
{
"active": true,
"agent_id": "string",
"city": "string",
"email": "string",
"first_name": "string",
"last_name": "string",
"loan_officer_id": "string",
"phone": "string",
"send_email": true,
"send_email_homeowner": true,
"send_email_search": true,
"send_mobile": true,
"send_mobile_search": true,
"state": "string",
"street_address": "string",
"zip_code": "string"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
user_id | query | string | false | The unique identifier ComeHome generated for the user. |
partner_user_id | query | string | false | The unique identifier for the user that was supplied by the partner. |
body | body | UserPatchRequest | true | none |
Example responses
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Returns the updated user data | None |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | User not found | None |
409 | Conflict | Conflicting data found | None |
500 | Internal Server Error | Internal server error | None |
Response Schema
Saved Searches
Requests related to saved searches created by, or on behalf of, users.
Get user's saved searches
Code samples
const headers = {
'Accept':'application/json'
};
fetch('/v1/partner/users/{partner_user_id}/saved_searches/',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/v1/partner/users/{partner_user_id}/saved_searches/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/users/{partner_user_id}/saved_searches/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeGetRequest()
{
string url = "/v1/partner/users/{partner_user_id}/saved_searches/";
var result = await GetAsync(url);
}
/// Performs a GET Request
public async Task GetAsync(string url)
{
//Start the request
HttpResponseMessage response = await Client.GetAsync(url);
//Validate result
response.EnsureSuccessStatusCode();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/v1/partner/users/{partner_user_id}/saved_searches/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/v1/partner/users/{partner_user_id}/saved_searches/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "/v1/partner/users/{partner_user_id}/saved_searches/", nil)
req.Header.Set("Accept", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /v1/partner/users/{partner_user_id}/saved_searches/
Users can save searches in ComeHome, enabling them to be notified when new homes appear in a specified area that match specific filters (both selected by the user). Use this endpoint to fetch data for each saved search that belongs to a user.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
partner_user_id | path | string | true | The unique identifier for the user that was supplied by the partner. |
Example responses
200 Response
[
{
"created": "2019-08-24T14:15:22Z",
"filters": {
"max_12mo_risk_of_decline": 0,
"max_avm_price": 0,
"max_best_high_school_percentile": 0,
"max_best_middle_school_percentile": 0,
"max_best_primary_school_percentile": 0,
"max_confident_list_to_avm_price": 0,
"max_confident_rental_avm_price": 0,
"max_crime_county_percentile": 0,
"max_hpi": 0,
"max_list_price": 0,
"max_lot_area": 0,
"max_market_grade": "string",
"max_price_per_sqft_50": 0,
"max_sqft": 0,
"max_year_built": 0,
"min_12mo_risk_of_decline": 0,
"min_avm_price": 0,
"min_baths": 0,
"min_beds": 0,
"min_best_high_school_percentile": 0,
"min_best_middle_school_percentile": 0,
"min_best_primary_school_percentile": 0,
"min_confident_rental_avm_price": 0,
"min_confident_rental_yield": 0,
"min_crime_county_percentile": 0,
"min_hpi": 0,
"min_list_age_days": 0,
"min_list_price": 0,
"min_lot_area": 0,
"min_market_grade": "string",
"min_price_per_sqft_50": 0,
"min_sqft": 0,
"min_year_built": 0,
"mls_state": [
"string"
],
"property_type": [
"string"
]
},
"id": 0,
"name": "string"
}
]
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | An array of all saved searches belonging to a user | Inline |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | User not found | None |
500 | Internal Server Error | Internal server error | None |
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | [SearchResponse] | false | none | none |
» created | string(date-time) | false | none | none |
» filters | object | false | none | none |
»» max_12mo_risk_of_decline | number | false | none | none |
»» max_avm_price | integer | false | none | none |
»» max_best_high_school_percentile | number | false | none | none |
»» max_best_middle_school_percentile | number | false | none | none |
»» max_best_primary_school_percentile | number | false | none | none |
»» max_confident_list_to_avm_price | number | false | none | none |
»» max_confident_rental_avm_price | integer | false | none | none |
»» max_crime_county_percentile | number | false | none | none |
»» max_hpi | number | false | none | none |
»» max_list_price | integer | false | none | none |
»» max_lot_area | integer | false | none | none |
»» max_market_grade | string | false | none | none |
»» max_price_per_sqft_50 | number | false | none | none |
»» max_sqft | integer | false | none | none |
»» max_year_built | integer | false | none | none |
»» min_12mo_risk_of_decline | number | false | none | none |
»» min_avm_price | integer | false | none | none |
»» min_baths | integer | false | none | none |
»» min_beds | integer | false | none | none |
»» min_best_high_school_percentile | number | false | none | none |
»» min_best_middle_school_percentile | number | false | none | none |
»» min_best_primary_school_percentile | number | false | none | none |
»» min_confident_rental_avm_price | integer | false | none | none |
»» min_confident_rental_yield | number | false | none | none |
»» min_crime_county_percentile | number | false | none | none |
»» min_hpi | number | false | none | none |
»» min_list_age_days | integer | false | none | none |
»» min_list_price | integer | false | none | none |
»» min_lot_area | integer | false | none | none |
»» min_market_grade | string | false | none | none |
»» min_price_per_sqft_50 | number | false | none | none |
»» min_sqft | integer | false | none | none |
»» min_year_built | integer | false | none | none |
»» mls_state | [string] | false | none | none |
»» property_type | [string] | false | none | none |
» id | integer | false | none | none |
» name | string | false | none | none |
Create new saved search
Code samples
const inputBody = '{
"city": "string",
"filters": {
"max_12mo_risk_of_decline": 0,
"max_avm_price": 0,
"max_best_high_school_percentile": 0,
"max_best_middle_school_percentile": 0,
"max_best_primary_school_percentile": 0,
"max_confident_list_to_avm_price": 0,
"max_confident_rental_avm_price": 0,
"max_crime_county_percentile": 0,
"max_hpi": 0,
"max_list_price": 0,
"max_lot_area": 0,
"max_market_grade": "string",
"max_price_per_sqft_50": 0,
"max_sqft": 0,
"max_year_built": 0,
"min_12mo_risk_of_decline": 0,
"min_avm_price": 0,
"min_baths": 0,
"min_beds": 0,
"min_best_high_school_percentile": 0,
"min_best_middle_school_percentile": 0,
"min_best_primary_school_percentile": 0,
"min_confident_rental_avm_price": 0,
"min_confident_rental_yield": 0,
"min_crime_county_percentile": 0,
"min_hpi": 0,
"min_list_age_days": 0,
"min_list_price": 0,
"min_lot_area": 0,
"min_market_grade": "string",
"min_price_per_sqft_50": 0,
"min_sqft": 0,
"min_year_built": 0,
"mls_state": [
"string"
],
"property_type": [
"string"
]
},
"zipcode": "string"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json'
};
fetch('/v1/partner/users/{partner_user_id}/saved_searches/',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
r = requests.post('/v1/partner/users/{partner_user_id}/saved_searches/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/users/{partner_user_id}/saved_searches/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakePostRequest()
{
string url = "/v1/partner/users/{partner_user_id}/saved_searches/";
string json = @"{
""city"": ""string"",
""filters"": {
""max_12mo_risk_of_decline"": 0,
""max_avm_price"": 0,
""max_best_high_school_percentile"": 0,
""max_best_middle_school_percentile"": 0,
""max_best_primary_school_percentile"": 0,
""max_confident_list_to_avm_price"": 0,
""max_confident_rental_avm_price"": 0,
""max_crime_county_percentile"": 0,
""max_hpi"": 0,
""max_list_price"": 0,
""max_lot_area"": 0,
""max_market_grade"": ""string"",
""max_price_per_sqft_50"": 0,
""max_sqft"": 0,
""max_year_built"": 0,
""min_12mo_risk_of_decline"": 0,
""min_avm_price"": 0,
""min_baths"": 0,
""min_beds"": 0,
""min_best_high_school_percentile"": 0,
""min_best_middle_school_percentile"": 0,
""min_best_primary_school_percentile"": 0,
""min_confident_rental_avm_price"": 0,
""min_confident_rental_yield"": 0,
""min_crime_county_percentile"": 0,
""min_hpi"": 0,
""min_list_age_days"": 0,
""min_list_price"": 0,
""min_lot_area"": 0,
""min_market_grade"": ""string"",
""min_price_per_sqft_50"": 0,
""min_sqft"": 0,
""min_year_built"": 0,
""mls_state"": [
""string""
],
""property_type"": [
""string""
]
},
""zipcode"": ""string""
}";
SearchRequest content = JsonConvert.DeserializeObject(json);
await PostAsync(content, url);
}
/// Performs a POST Request
public async Task PostAsync(SearchRequest content, string url)
{
//Serialize Object
StringContent jsonContent = SerializeObject(content);
//Execute POST request
HttpResponseMessage response = await Client.PostAsync(url, jsonContent);
}
/// Serialize an object to Json
private StringContent SerializeObject(SearchRequest content)
{
//Serialize Object
string jsonObject = JsonConvert.SerializeObject(content);
//Create Json UTF8 String Content
return new StringContent(jsonObject, Encoding.UTF8, "application/json");
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json'
}
result = RestClient.post '/v1/partner/users/{partner_user_id}/saved_searches/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/v1/partner/users/{partner_user_id}/saved_searches/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
body := `{
"city": "string",
"filters": {
"max_12mo_risk_of_decline": 0,
"max_avm_price": 0,
"max_best_high_school_percentile": 0,
"max_best_middle_school_percentile": 0,
"max_best_primary_school_percentile": 0,
"max_confident_list_to_avm_price": 0,
"max_confident_rental_avm_price": 0,
"max_crime_county_percentile": 0,
"max_hpi": 0,
"max_list_price": 0,
"max_lot_area": 0,
"max_market_grade": "string",
"max_price_per_sqft_50": 0,
"max_sqft": 0,
"max_year_built": 0,
"min_12mo_risk_of_decline": 0,
"min_avm_price": 0,
"min_baths": 0,
"min_beds": 0,
"min_best_high_school_percentile": 0,
"min_best_middle_school_percentile": 0,
"min_best_primary_school_percentile": 0,
"min_confident_rental_avm_price": 0,
"min_confident_rental_yield": 0,
"min_crime_county_percentile": 0,
"min_hpi": 0,
"min_list_age_days": 0,
"min_list_price": 0,
"min_lot_area": 0,
"min_market_grade": "string",
"min_price_per_sqft_50": 0,
"min_sqft": 0,
"min_year_built": 0,
"mls_state": [
"string"
],
"property_type": [
"string"
]
},
"zipcode": "string"
}`
req, err := http.NewRequest("POST", "/v1/partner/users/{partner_user_id}/saved_searches/", bytes.NewBuffer([]byte{body}))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /v1/partner/users/{partner_user_id}/saved_searches/
Create a new saved search for a user by specifying the zipcode of the search and all relevant filters.
Body parameter
{
"city": "string",
"filters": {
"max_12mo_risk_of_decline": 0,
"max_avm_price": 0,
"max_best_high_school_percentile": 0,
"max_best_middle_school_percentile": 0,
"max_best_primary_school_percentile": 0,
"max_confident_list_to_avm_price": 0,
"max_confident_rental_avm_price": 0,
"max_crime_county_percentile": 0,
"max_hpi": 0,
"max_list_price": 0,
"max_lot_area": 0,
"max_market_grade": "string",
"max_price_per_sqft_50": 0,
"max_sqft": 0,
"max_year_built": 0,
"min_12mo_risk_of_decline": 0,
"min_avm_price": 0,
"min_baths": 0,
"min_beds": 0,
"min_best_high_school_percentile": 0,
"min_best_middle_school_percentile": 0,
"min_best_primary_school_percentile": 0,
"min_confident_rental_avm_price": 0,
"min_confident_rental_yield": 0,
"min_crime_county_percentile": 0,
"min_hpi": 0,
"min_list_age_days": 0,
"min_list_price": 0,
"min_lot_area": 0,
"min_market_grade": "string",
"min_price_per_sqft_50": 0,
"min_sqft": 0,
"min_year_built": 0,
"mls_state": [
"string"
],
"property_type": [
"string"
]
},
"zipcode": "string"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
partner_user_id | path | string | true | The unique identifier for the user that was supplied by the partner. |
body | body | SearchRequest | true | none |
Example responses
201 Response
{
"created": "2019-08-24T14:15:22Z",
"filters": {
"max_12mo_risk_of_decline": 0,
"max_avm_price": 0,
"max_best_high_school_percentile": 0,
"max_best_middle_school_percentile": 0,
"max_best_primary_school_percentile": 0,
"max_confident_list_to_avm_price": 0,
"max_confident_rental_avm_price": 0,
"max_crime_county_percentile": 0,
"max_hpi": 0,
"max_list_price": 0,
"max_lot_area": 0,
"max_market_grade": "string",
"max_price_per_sqft_50": 0,
"max_sqft": 0,
"max_year_built": 0,
"min_12mo_risk_of_decline": 0,
"min_avm_price": 0,
"min_baths": 0,
"min_beds": 0,
"min_best_high_school_percentile": 0,
"min_best_middle_school_percentile": 0,
"min_best_primary_school_percentile": 0,
"min_confident_rental_avm_price": 0,
"min_confident_rental_yield": 0,
"min_crime_county_percentile": 0,
"min_hpi": 0,
"min_list_age_days": 0,
"min_list_price": 0,
"min_lot_area": 0,
"min_market_grade": "string",
"min_price_per_sqft_50": 0,
"min_sqft": 0,
"min_year_built": 0,
"mls_state": [
"string"
],
"property_type": [
"string"
]
},
"id": 0,
"name": "string"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | Saved search created successfully | SearchResponse |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | User not found | None |
500 | Internal Server Error | Internal server error | None |
Update a search.
Code samples
const inputBody = '{
"city": "string",
"filters": {
"max_12mo_risk_of_decline": 0,
"max_avm_price": 0,
"max_best_high_school_percentile": 0,
"max_best_middle_school_percentile": 0,
"max_best_primary_school_percentile": 0,
"max_confident_list_to_avm_price": 0,
"max_confident_rental_avm_price": 0,
"max_crime_county_percentile": 0,
"max_hpi": 0,
"max_list_price": 0,
"max_lot_area": 0,
"max_market_grade": "string",
"max_price_per_sqft_50": 0,
"max_sqft": 0,
"max_year_built": 0,
"min_12mo_risk_of_decline": 0,
"min_avm_price": 0,
"min_baths": 0,
"min_beds": 0,
"min_best_high_school_percentile": 0,
"min_best_middle_school_percentile": 0,
"min_best_primary_school_percentile": 0,
"min_confident_rental_avm_price": 0,
"min_confident_rental_yield": 0,
"min_crime_county_percentile": 0,
"min_hpi": 0,
"min_list_age_days": 0,
"min_list_price": 0,
"min_lot_area": 0,
"min_market_grade": "string",
"min_price_per_sqft_50": 0,
"min_sqft": 0,
"min_year_built": 0,
"mls_state": [
"string"
],
"property_type": [
"string"
]
},
"zipcode": "string"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json'
};
fetch('/v1/partner/users/{partner_user_id}/saved_searches/{search_id}/',
{
method: 'PUT',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
r = requests.put('/v1/partner/users/{partner_user_id}/saved_searches/{search_id}/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/users/{partner_user_id}/saved_searches/{search_id}/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PUT");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakePutRequest()
{
int id = 1;
string url = "/v1/partner/users/{partner_user_id}/saved_searches/{search_id}/";
string json = @"{
""city"": ""string"",
""filters"": {
""max_12mo_risk_of_decline"": 0,
""max_avm_price"": 0,
""max_best_high_school_percentile"": 0,
""max_best_middle_school_percentile"": 0,
""max_best_primary_school_percentile"": 0,
""max_confident_list_to_avm_price"": 0,
""max_confident_rental_avm_price"": 0,
""max_crime_county_percentile"": 0,
""max_hpi"": 0,
""max_list_price"": 0,
""max_lot_area"": 0,
""max_market_grade"": ""string"",
""max_price_per_sqft_50"": 0,
""max_sqft"": 0,
""max_year_built"": 0,
""min_12mo_risk_of_decline"": 0,
""min_avm_price"": 0,
""min_baths"": 0,
""min_beds"": 0,
""min_best_high_school_percentile"": 0,
""min_best_middle_school_percentile"": 0,
""min_best_primary_school_percentile"": 0,
""min_confident_rental_avm_price"": 0,
""min_confident_rental_yield"": 0,
""min_crime_county_percentile"": 0,
""min_hpi"": 0,
""min_list_age_days"": 0,
""min_list_price"": 0,
""min_lot_area"": 0,
""min_market_grade"": ""string"",
""min_price_per_sqft_50"": 0,
""min_sqft"": 0,
""min_year_built"": 0,
""mls_state"": [
""string""
],
""property_type"": [
""string""
]
},
""zipcode"": ""string""
}";
SearchRequest content = JsonConvert.DeserializeObject(json);
var result = await PutAsync(id, content, url);
}
/// Performs a PUT Request
public async Task PutAsync(int id, SearchRequest content, string url)
{
//Serialize Object
StringContent jsonContent = SerializeObject(content);
//Execute PUT request
HttpResponseMessage response = await Client.PutAsync(url + $"/{id}", jsonContent);
//Return response
return await DeserializeObject(response);
}
/// Serialize an object to Json
private StringContent SerializeObject(SearchRequest content)
{
//Serialize Object
string jsonObject = JsonConvert.SerializeObject(content);
//Create Json UTF8 String Content
return new StringContent(jsonObject, Encoding.UTF8, "application/json");
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json'
}
result = RestClient.put '/v1/partner/users/{partner_user_id}/saved_searches/{search_id}/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PUT','/v1/partner/users/{partner_user_id}/saved_searches/{search_id}/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
body := `{
"city": "string",
"filters": {
"max_12mo_risk_of_decline": 0,
"max_avm_price": 0,
"max_best_high_school_percentile": 0,
"max_best_middle_school_percentile": 0,
"max_best_primary_school_percentile": 0,
"max_confident_list_to_avm_price": 0,
"max_confident_rental_avm_price": 0,
"max_crime_county_percentile": 0,
"max_hpi": 0,
"max_list_price": 0,
"max_lot_area": 0,
"max_market_grade": "string",
"max_price_per_sqft_50": 0,
"max_sqft": 0,
"max_year_built": 0,
"min_12mo_risk_of_decline": 0,
"min_avm_price": 0,
"min_baths": 0,
"min_beds": 0,
"min_best_high_school_percentile": 0,
"min_best_middle_school_percentile": 0,
"min_best_primary_school_percentile": 0,
"min_confident_rental_avm_price": 0,
"min_confident_rental_yield": 0,
"min_crime_county_percentile": 0,
"min_hpi": 0,
"min_list_age_days": 0,
"min_list_price": 0,
"min_lot_area": 0,
"min_market_grade": "string",
"min_price_per_sqft_50": 0,
"min_sqft": 0,
"min_year_built": 0,
"mls_state": [
"string"
],
"property_type": [
"string"
]
},
"zipcode": "string"
}`
req, err := http.NewRequest("PUT", "/v1/partner/users/{partner_user_id}/saved_searches/{search_id}/", bytes.NewBuffer([]byte{body}))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
PUT /v1/partner/users/{partner_user_id}/saved_searches/{search_id}/
Update a saved search for a user. Searches created either by the user or by the partner (via API) can be updated.
Body parameter
{
"city": "string",
"filters": {
"max_12mo_risk_of_decline": 0,
"max_avm_price": 0,
"max_best_high_school_percentile": 0,
"max_best_middle_school_percentile": 0,
"max_best_primary_school_percentile": 0,
"max_confident_list_to_avm_price": 0,
"max_confident_rental_avm_price": 0,
"max_crime_county_percentile": 0,
"max_hpi": 0,
"max_list_price": 0,
"max_lot_area": 0,
"max_market_grade": "string",
"max_price_per_sqft_50": 0,
"max_sqft": 0,
"max_year_built": 0,
"min_12mo_risk_of_decline": 0,
"min_avm_price": 0,
"min_baths": 0,
"min_beds": 0,
"min_best_high_school_percentile": 0,
"min_best_middle_school_percentile": 0,
"min_best_primary_school_percentile": 0,
"min_confident_rental_avm_price": 0,
"min_confident_rental_yield": 0,
"min_crime_county_percentile": 0,
"min_hpi": 0,
"min_list_age_days": 0,
"min_list_price": 0,
"min_lot_area": 0,
"min_market_grade": "string",
"min_price_per_sqft_50": 0,
"min_sqft": 0,
"min_year_built": 0,
"mls_state": [
"string"
],
"property_type": [
"string"
]
},
"zipcode": "string"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
partner_user_id | path | string | true | The unique identifier for the user that was supplied by the partner. |
search_id | path | integer | true | The unique identifier for the search, returned when the search was created or by fetching all searches for a user. |
body | body | SearchRequest | true | none |
Example responses
200 Response
{
"created": "2019-08-24T14:15:22Z",
"filters": {
"max_12mo_risk_of_decline": 0,
"max_avm_price": 0,
"max_best_high_school_percentile": 0,
"max_best_middle_school_percentile": 0,
"max_best_primary_school_percentile": 0,
"max_confident_list_to_avm_price": 0,
"max_confident_rental_avm_price": 0,
"max_crime_county_percentile": 0,
"max_hpi": 0,
"max_list_price": 0,
"max_lot_area": 0,
"max_market_grade": "string",
"max_price_per_sqft_50": 0,
"max_sqft": 0,
"max_year_built": 0,
"min_12mo_risk_of_decline": 0,
"min_avm_price": 0,
"min_baths": 0,
"min_beds": 0,
"min_best_high_school_percentile": 0,
"min_best_middle_school_percentile": 0,
"min_best_primary_school_percentile": 0,
"min_confident_rental_avm_price": 0,
"min_confident_rental_yield": 0,
"min_crime_county_percentile": 0,
"min_hpi": 0,
"min_list_age_days": 0,
"min_list_price": 0,
"min_lot_area": 0,
"min_market_grade": "string",
"min_price_per_sqft_50": 0,
"min_sqft": 0,
"min_year_built": 0,
"mls_state": [
"string"
],
"property_type": [
"string"
]
},
"id": 0,
"name": "string"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | The updated state for the saved search | SearchResponse |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | User or search not found | None |
500 | Internal Server Error | Internal server error | None |
Remove a saved search for a user.
Code samples
const headers = {
'Authorization':'API_KEY'
};
fetch('/v1/partner/users/{partner_user_id}/saved_searches/{search_id}/',
{
method: 'DELETE',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Authorization': 'API_KEY'
}
r = requests.delete('/v1/partner/users/{partner_user_id}/saved_searches/{search_id}/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/users/{partner_user_id}/saved_searches/{search_id}/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("DELETE");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeDeleteRequest()
{
int id = 1;
string url = "/v1/partner/users/{partner_user_id}/saved_searches/{search_id}/";
await DeleteAsync(id, url);
}
/// Performs a DELETE Request
public async Task DeleteAsync(int id, string url)
{
//Execute DELETE request
HttpResponseMessage response = await Client.DeleteAsync(url + $"/{id}");
//Return response
await DeserializeObject(response);
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Authorization' => 'API_KEY'
}
result = RestClient.delete '/v1/partner/users/{partner_user_id}/saved_searches/{search_id}/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('DELETE','/v1/partner/users/{partner_user_id}/saved_searches/{search_id}/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("DELETE", "/v1/partner/users/{partner_user_id}/saved_searches/{search_id}/", nil)
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
DELETE /v1/partner/users/{partner_user_id}/saved_searches/{search_id}/
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
partner_user_id | path | string | true | The unique identifier for the user that was supplied by the partner. |
search_id | path | integer | true | none |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | none | None |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | User or search not found | None |
500 | Internal Server Error | Internal server error | None |
Agents
Contract permitting, ComeHome can integrate real estate agent information into the experience of your users. Use these endpoints to create, update, and delete agent records, and ask your client success contact for more information about agent data in ComeHome.
Get list of all agents
Code samples
const headers = {
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/agents/',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.get('/v1/partner/agents/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/agents/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeGetRequest()
{
string url = "/v1/partner/agents/";
var result = await GetAsync(url);
}
/// Performs a GET Request
public async Task GetAsync(string url)
{
//Start the request
HttpResponseMessage response = await Client.GetAsync(url);
//Validate result
response.EnsureSuccessStatusCode();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.get '/v1/partner/agents/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/v1/partner/agents/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "/v1/partner/agents/", nil)
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /v1/partner/agents/
Use this endpoint to retrieve a list of all agents ComeHome has record of for the given partner.
This endpoint returns paginated responses. Each agent item in the response includes a cursor
value, and passing one of the cursor
values as an after
query parameter will offset the response to include all agents after the one relevant to that cursor, up to the pagination limit.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
limit | query | integer | false | The maximum number of items returned in the response. The maximum value is 100. If no value is passed, the default limit is 10. |
before | query | string | false | Pass a cursor value to this parameter to get all items ordered before the item relevant to the cursor, up to the max item limit for a response. |
after | query | string | false | Pass a cursor value to this parameter to get all items ordered after the item relevant to the cursor, up to the max item limit for a response. If there are no items ordered after the relevant item, no data will be returned. |
Example responses
200 Response
{
"data": [
{
"cursor": "string",
"item": {
"address_line1": "string",
"address_line2": "string",
"brokerage_email": "string",
"brokerage_license_number": "string",
"brokerage_name": "string",
"brokerage_phone": "string",
"city": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"id": "string",
"last_name": "string",
"license_held": "string",
"license_number": "string",
"license_state": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"zipcode": "string"
}
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A list of all available agents | AgentLookupListResponse |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | Partner not found | None |
500 | Internal Server Error | Internal server error | None |
Create a new agent record
Code samples
const inputBody = '{
"address_line1": "string",
"address_line2": "string",
"brokerage_email": "string",
"brokerage_license_number": "string",
"brokerage_name": "string",
"brokerage_phone": "string",
"city": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"last_name": "string",
"license_held": "string",
"license_number": "string",
"license_state": "string",
"lo_id": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"zipcode": "string"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/agents/',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.post('/v1/partner/agents/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/agents/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakePostRequest()
{
string url = "/v1/partner/agents/";
string json = @"{
""address_line1"": ""string"",
""address_line2"": ""string"",
""brokerage_email"": ""string"",
""brokerage_license_number"": ""string"",
""brokerage_name"": ""string"",
""brokerage_phone"": ""string"",
""city"": ""string"",
""email"": ""string"",
""first_name"": ""string"",
""headshot"": ""string"",
""last_name"": ""string"",
""license_held"": ""string"",
""license_number"": ""string"",
""license_state"": ""string"",
""lo_id"": ""string"",
""phone"": ""string"",
""service_area_zips"": [
""string""
],
""state"": ""string"",
""zipcode"": ""string""
}";
AgentCreateRequest content = JsonConvert.DeserializeObject(json);
await PostAsync(content, url);
}
/// Performs a POST Request
public async Task PostAsync(AgentCreateRequest content, string url)
{
//Serialize Object
StringContent jsonContent = SerializeObject(content);
//Execute POST request
HttpResponseMessage response = await Client.PostAsync(url, jsonContent);
}
/// Serialize an object to Json
private StringContent SerializeObject(AgentCreateRequest content)
{
//Serialize Object
string jsonObject = JsonConvert.SerializeObject(content);
//Create Json UTF8 String Content
return new StringContent(jsonObject, Encoding.UTF8, "application/json");
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.post '/v1/partner/agents/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/v1/partner/agents/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
body := `{
"address_line1": "string",
"address_line2": "string",
"brokerage_email": "string",
"brokerage_license_number": "string",
"brokerage_name": "string",
"brokerage_phone": "string",
"city": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"last_name": "string",
"license_held": "string",
"license_number": "string",
"license_state": "string",
"lo_id": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"zipcode": "string"
}`
req, err := http.NewRequest("POST", "/v1/partner/agents/", bytes.NewBuffer([]byte{body}))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /v1/partner/agents/
This endpoint accepts a JSON object containing data about a single agent. This agent will then be displayed where appropriate in the ComeHome experience.
Body parameter
{
"address_line1": "string",
"address_line2": "string",
"brokerage_email": "string",
"brokerage_license_number": "string",
"brokerage_name": "string",
"brokerage_phone": "string",
"city": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"last_name": "string",
"license_held": "string",
"license_number": "string",
"license_state": "string",
"lo_id": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"zipcode": "string"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | AgentCreateRequest | false | none |
Example responses
201 Response
{
"id": "string"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | Indicates the agent data was received successfully. The returned agentId value can be used to update or delete this agent in subsequent calls. |
AgentCreateResponse |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | Partner or agent not found | None |
500 | Internal Server Error | Internal server error | None |
Lookup an agent
Code samples
const headers = {
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/agents/lookup',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.get('/v1/partner/agents/lookup', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/agents/lookup");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeGetRequest()
{
string url = "/v1/partner/agents/lookup";
var result = await GetAsync(url);
}
/// Performs a GET Request
public async Task GetAsync(string url)
{
//Start the request
HttpResponseMessage response = await Client.GetAsync(url);
//Validate result
response.EnsureSuccessStatusCode();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.get '/v1/partner/agents/lookup',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/v1/partner/agents/lookup', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "/v1/partner/agents/lookup", nil)
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /v1/partner/agents/lookup
Use this endpoint to look up an agent that was passed to ComeHome via POST request or other means. Lookups can be performed by passing an id
or email
query parameter to this request.
For email lookups, please use the email address that was used when the agent was created. id
refers to the ComeHome-assigned UUID that was returned when the agent was created.
Note that email
(etc) query parameters must use URL encoding (ex. username+test@housecanary.com
would be username%2Btest%40housecanary.com
).
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | query | string | false | The ComeHome-assigned UUID for the agent, returned when the agent was created. |
query | string | false | The email address for the agent, provided by the partner when the agent was created. URL encoding required. |
Example responses
200 Response
{
"address_line1": "string",
"address_line2": "string",
"brokerage_email": "string",
"brokerage_license_number": "string",
"brokerage_name": "string",
"brokerage_phone": "string",
"city": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"id": "string",
"last_name": "string",
"license_held": "string",
"license_number": "string",
"license_state": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"zipcode": "string"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Returns the requested agent, if found | AgentLookup |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | Partner or agent not found | None |
500 | Internal Server Error | Internal server error | None |
Update an agent record
Code samples
const inputBody = '{
"address_line1": "string",
"address_line2": "string",
"brokerage_email": "string",
"brokerage_license_number": "string",
"brokerage_name": "string",
"brokerage_phone": "string",
"city": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"last_name": "string",
"license_held": "string",
"license_number": "string",
"license_state": "string",
"lo_id": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"zipcode": "string"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/agents/{agentId}/',
{
method: 'PUT',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.put('/v1/partner/agents/{agentId}/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/agents/{agentId}/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PUT");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakePutRequest()
{
int id = 1;
string url = "/v1/partner/agents/{agentId}/";
string json = @"{
""address_line1"": ""string"",
""address_line2"": ""string"",
""brokerage_email"": ""string"",
""brokerage_license_number"": ""string"",
""brokerage_name"": ""string"",
""brokerage_phone"": ""string"",
""city"": ""string"",
""email"": ""string"",
""first_name"": ""string"",
""headshot"": ""string"",
""last_name"": ""string"",
""license_held"": ""string"",
""license_number"": ""string"",
""license_state"": ""string"",
""lo_id"": ""string"",
""phone"": ""string"",
""service_area_zips"": [
""string""
],
""state"": ""string"",
""zipcode"": ""string""
}";
AgentUpdateRequest content = JsonConvert.DeserializeObject(json);
var result = await PutAsync(id, content, url);
}
/// Performs a PUT Request
public async Task PutAsync(int id, AgentUpdateRequest content, string url)
{
//Serialize Object
StringContent jsonContent = SerializeObject(content);
//Execute PUT request
HttpResponseMessage response = await Client.PutAsync(url + $"/{id}", jsonContent);
//Return response
return await DeserializeObject(response);
}
/// Serialize an object to Json
private StringContent SerializeObject(AgentUpdateRequest content)
{
//Serialize Object
string jsonObject = JsonConvert.SerializeObject(content);
//Create Json UTF8 String Content
return new StringContent(jsonObject, Encoding.UTF8, "application/json");
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.put '/v1/partner/agents/{agentId}/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PUT','/v1/partner/agents/{agentId}/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
body := `{
"address_line1": "string",
"address_line2": "string",
"brokerage_email": "string",
"brokerage_license_number": "string",
"brokerage_name": "string",
"brokerage_phone": "string",
"city": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"last_name": "string",
"license_held": "string",
"license_number": "string",
"license_state": "string",
"lo_id": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"zipcode": "string"
}`
req, err := http.NewRequest("PUT", "/v1/partner/agents/{agentId}/", bytes.NewBuffer([]byte{body}))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
PUT /v1/partner/agents/{agentId}/
Update the data for an existing agent, using the agentId
returned to you when the agent was created.
Body parameter
{
"address_line1": "string",
"address_line2": "string",
"brokerage_email": "string",
"brokerage_license_number": "string",
"brokerage_name": "string",
"brokerage_phone": "string",
"city": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"last_name": "string",
"license_held": "string",
"license_number": "string",
"license_state": "string",
"lo_id": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"zipcode": "string"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
agentId | path | string | true | none |
body | body | AgentUpdateRequest | false | none |
Example responses
200 Response
{
"address_line1": "string",
"address_line2": "string",
"brokerage_email": "string",
"brokerage_license_number": "string",
"brokerage_name": "string",
"brokerage_phone": "string",
"city": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"id": "string",
"last_name": "string",
"license_held": "string",
"license_number": "string",
"license_state": "string",
"lo_id": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"zipcode": "string"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Indicates the agent data was updated successfully, and returns the current data for the agent in ComeHome. | AgentUpdateResponse |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | Partner or agent not found | None |
500 | Internal Server Error | Internal server error | None |
Delete an agent record
Code samples
const headers = {
'Authorization':'API_KEY'
};
fetch('/v1/partner/agents/{agentId}/',
{
method: 'DELETE',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Authorization': 'API_KEY'
}
r = requests.delete('/v1/partner/agents/{agentId}/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/agents/{agentId}/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("DELETE");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeDeleteRequest()
{
int id = 1;
string url = "/v1/partner/agents/{agentId}/";
await DeleteAsync(id, url);
}
/// Performs a DELETE Request
public async Task DeleteAsync(int id, string url)
{
//Execute DELETE request
HttpResponseMessage response = await Client.DeleteAsync(url + $"/{id}");
//Return response
await DeserializeObject(response);
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Authorization' => 'API_KEY'
}
result = RestClient.delete '/v1/partner/agents/{agentId}/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('DELETE','/v1/partner/agents/{agentId}/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("DELETE", "/v1/partner/agents/{agentId}/", nil)
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
DELETE /v1/partner/agents/{agentId}/
Delete an existing agent from ComeHome, using the agentId
returned to you when the agent was created.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
agentId | path | string | true | none |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | Indicates the agent data was received and deleted successfully | None |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | Partner or agent not found | None |
500 | Internal Server Error | Internal server error | None |
Loan Officers
Contract permitting, ComeHome can integrate loan officer information into the experience of your users. Use these endpoints to create, update, and delete loan officer records, and ask your client success contact for more information about loan officer data in ComeHome.
Get list of all loan officers
Code samples
const headers = {
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/loanofficer/',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.get('/v1/partner/loanofficer/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/loanofficer/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeGetRequest()
{
string url = "/v1/partner/loanofficer/";
var result = await GetAsync(url);
}
/// Performs a GET Request
public async Task GetAsync(string url)
{
//Start the request
HttpResponseMessage response = await Client.GetAsync(url);
//Validate result
response.EnsureSuccessStatusCode();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.get '/v1/partner/loanofficer/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/v1/partner/loanofficer/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "/v1/partner/loanofficer/", nil)
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /v1/partner/loanofficer/
Use this endpoint to retrieve a list of all loan officers ComeHome has record of for the given partner.
This endpoint returns paginated responses. Each loan officer item in the response includes a cursor
value, and passing one of the cursor
values as an after
query parameter will offset the response to include all loan officers after the one relevant to that cursor, up to the pagination limit.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
limit | query | integer | false | The maximum number of items returned in the response. The maximum value is 100. If no value is passed, the default limit is 10. |
before | query | string | false | Pass a cursor value to this parameter to get all items ordered before the item relevant to the cursor, up to the max item limit for a response. |
after | query | string | false | Pass a cursor value to this parameter to get all items ordered after the item relevant to the cursor, up to the max item limit for a response. If there are no items ordered after the relevant item, no data will be returned. |
Example responses
200 Response
{
"data": [
{
"cursor": "string",
"item": {
"active": true,
"address_line1": "string",
"address_line2": "string",
"branch_nmls": "string",
"city": "string",
"cost_center": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"id": "string",
"last_name": "string",
"lo_id": "string",
"nmls_id": "string",
"oh_mlo": "string",
"partner_id": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"website": "string",
"zipcode": "string"
}
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Returns a list of all known loan officers for the relevant partner. If more loan officers are found than can be returned in a single response, a cursor is included for inclusion in future paginated calls to this endpoint (see before and after parameters in the above description). |
LoListResponse |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | Partner not found | None |
500 | Internal Server Error | Internal server error | None |
Create a new loan officer
Code samples
const inputBody = '{
"active": true,
"address_line1": "string",
"address_line2": "string",
"branch_nmls": "string",
"city": "string",
"cost_center": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"last_name": "string",
"lo_id": "string",
"nmls_id": "string",
"oh_mlo": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"website": "string",
"zipcode": "string"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/loanofficer/',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.post('/v1/partner/loanofficer/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/loanofficer/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakePostRequest()
{
string url = "/v1/partner/loanofficer/";
string json = @"{
""active"": true,
""address_line1"": ""string"",
""address_line2"": ""string"",
""branch_nmls"": ""string"",
""city"": ""string"",
""cost_center"": ""string"",
""email"": ""string"",
""first_name"": ""string"",
""headshot"": ""string"",
""last_name"": ""string"",
""lo_id"": ""string"",
""nmls_id"": ""string"",
""oh_mlo"": ""string"",
""phone"": ""string"",
""service_area_zips"": [
""string""
],
""state"": ""string"",
""website"": ""string"",
""zipcode"": ""string""
}";
LOCreateRequest content = JsonConvert.DeserializeObject(json);
await PostAsync(content, url);
}
/// Performs a POST Request
public async Task PostAsync(LOCreateRequest content, string url)
{
//Serialize Object
StringContent jsonContent = SerializeObject(content);
//Execute POST request
HttpResponseMessage response = await Client.PostAsync(url, jsonContent);
}
/// Serialize an object to Json
private StringContent SerializeObject(LOCreateRequest content)
{
//Serialize Object
string jsonObject = JsonConvert.SerializeObject(content);
//Create Json UTF8 String Content
return new StringContent(jsonObject, Encoding.UTF8, "application/json");
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.post '/v1/partner/loanofficer/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/v1/partner/loanofficer/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
body := `{
"active": true,
"address_line1": "string",
"address_line2": "string",
"branch_nmls": "string",
"city": "string",
"cost_center": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"last_name": "string",
"lo_id": "string",
"nmls_id": "string",
"oh_mlo": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"website": "string",
"zipcode": "string"
}`
req, err := http.NewRequest("POST", "/v1/partner/loanofficer/", bytes.NewBuffer([]byte{body}))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /v1/partner/loanofficer/
This endpoint accepts a JSON object containing data about a single loan officer. This loan officer will then be displayed where appropriate in the ComeHome experience.
A successful response will contain an id
field. This is the UUID that you should use to update or delete this loan officer via the ComeHome partner API.
Note that the following fields are required to be non-null: active
, email
, first_name
, last_name
, and lo_id
. Additionally, email
and lo_id
must be unique, and not shared with other loan officers passed to ComeHome.
Body parameter
{
"active": true,
"address_line1": "string",
"address_line2": "string",
"branch_nmls": "string",
"city": "string",
"cost_center": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"last_name": "string",
"lo_id": "string",
"nmls_id": "string",
"oh_mlo": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"website": "string",
"zipcode": "string"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | LOCreateRequest | true | An object containing required details about the loan officer. |
Example responses
201 Response
{
"active": true,
"address_line1": "string",
"address_line2": "string",
"branch_nmls": "string",
"city": "string",
"cost_center": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"id": "string",
"last_name": "string",
"lo_id": "string",
"nmls_id": "string",
"oh_mlo": "string",
"partner_id": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"website": "string",
"zipcode": "string"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | Indicates the loan officer data was received successfully. The id field of the returned object can be used to update or delete this loan officer in subsequent calls. |
LoanOfficer |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | Partner or loan officer not found | None |
500 | Internal Server Error | Internal server error | None |
Lookup a loan officer
Code samples
const headers = {
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/loanofficer/lookup',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.get('/v1/partner/loanofficer/lookup', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/loanofficer/lookup");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeGetRequest()
{
string url = "/v1/partner/loanofficer/lookup";
var result = await GetAsync(url);
}
/// Performs a GET Request
public async Task GetAsync(string url)
{
//Start the request
HttpResponseMessage response = await Client.GetAsync(url);
//Validate result
response.EnsureSuccessStatusCode();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.get '/v1/partner/loanofficer/lookup',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/v1/partner/loanofficer/lookup', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "/v1/partner/loanofficer/lookup", nil)
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /v1/partner/loanofficer/lookup
Use this endpoint to look up a loan officer that was passed to ComeHome via POST request or other means. Lookups can be performed by passing an id
, loid
, or email
query parameter to this request.
For email
lookups, please use the email address that was used when the LO was created. id
refers to the ComeHome-assigned UUID that was returned when the LO was created, and loid
refers to the unique identifier supplied by the partner when the loan officer was created.
Note that email
(etc) query parameters must use URL encoding (ex. username+test@housecanary.com
would be username%2Btest%40housecanary.com
).
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | query | string | false | The ComeHome-assigned UUID for the loan officer, returned when the loan officer was created. |
loid | query | string | false | The partner-assigned unique identifier for the loan officer, provided by the partner when the loan officer was created. |
query | string | false | The email address for the loan officer, provided by the partner when the loan officer was created. URL encoding required. |
Example responses
200 Response
{
"active": true,
"address_line1": "string",
"address_line2": "string",
"branch_nmls": "string",
"city": "string",
"cost_center": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"id": "string",
"last_name": "string",
"lo_id": "string",
"nmls_id": "string",
"oh_mlo": "string",
"partner_id": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"website": "string",
"zipcode": "string"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Returns the requested loan officer, if found | LoanOfficer |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | Partner or loan officer not found | None |
500 | Internal Server Error | Internal server error | None |
Update a loan officer
Code samples
const inputBody = '{
"active": true,
"address_line1": "string",
"address_line2": "string",
"branch_nmls": "string",
"city": "string",
"cost_center": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"last_name": "string",
"lo_id": "string",
"nmls_id": "string",
"oh_mlo": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"website": "string",
"zipcode": "string"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/loanofficer/{id}/',
{
method: 'PUT',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.put('/v1/partner/loanofficer/{id}/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/loanofficer/{id}/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PUT");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakePutRequest()
{
int id = 1;
string url = "/v1/partner/loanofficer/{id}/";
string json = @"{
""active"": true,
""address_line1"": ""string"",
""address_line2"": ""string"",
""branch_nmls"": ""string"",
""city"": ""string"",
""cost_center"": ""string"",
""email"": ""string"",
""first_name"": ""string"",
""headshot"": ""string"",
""last_name"": ""string"",
""lo_id"": ""string"",
""nmls_id"": ""string"",
""oh_mlo"": ""string"",
""phone"": ""string"",
""service_area_zips"": [
""string""
],
""state"": ""string"",
""website"": ""string"",
""zipcode"": ""string""
}";
LOUpdateRequest content = JsonConvert.DeserializeObject(json);
var result = await PutAsync(id, content, url);
}
/// Performs a PUT Request
public async Task PutAsync(int id, LOUpdateRequest content, string url)
{
//Serialize Object
StringContent jsonContent = SerializeObject(content);
//Execute PUT request
HttpResponseMessage response = await Client.PutAsync(url + $"/{id}", jsonContent);
//Return response
return await DeserializeObject(response);
}
/// Serialize an object to Json
private StringContent SerializeObject(LOUpdateRequest content)
{
//Serialize Object
string jsonObject = JsonConvert.SerializeObject(content);
//Create Json UTF8 String Content
return new StringContent(jsonObject, Encoding.UTF8, "application/json");
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.put '/v1/partner/loanofficer/{id}/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PUT','/v1/partner/loanofficer/{id}/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
body := `{
"active": true,
"address_line1": "string",
"address_line2": "string",
"branch_nmls": "string",
"city": "string",
"cost_center": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"last_name": "string",
"lo_id": "string",
"nmls_id": "string",
"oh_mlo": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"website": "string",
"zipcode": "string"
}`
req, err := http.NewRequest("PUT", "/v1/partner/loanofficer/{id}/", bytes.NewBuffer([]byte{body}))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
PUT /v1/partner/loanofficer/{id}/
Update the data for an existing loan officer, using the id
returned to you when the loan officer was created. You need only pass the fields that should be updated - omitted fields will not be modified.
Note that the following fields may not be set to null: active
, email
, first_name
, last_name
, and lo_id
. Omitting any of these fields will leave them unmodified (and non-null) in ComeHome.
Body parameter
{
"active": true,
"address_line1": "string",
"address_line2": "string",
"branch_nmls": "string",
"city": "string",
"cost_center": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"last_name": "string",
"lo_id": "string",
"nmls_id": "string",
"oh_mlo": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"website": "string",
"zipcode": "string"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | string | true | The UUID of the loan officer that was returned when the loan officer was created (id ). |
body | body | LOUpdateRequest | true | An object containing required details about the loan officer. |
Example responses
200 Response
{
"active": true,
"address_line1": "string",
"address_line2": "string",
"branch_nmls": "string",
"city": "string",
"cost_center": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"id": "string",
"last_name": "string",
"lo_id": "string",
"nmls_id": "string",
"oh_mlo": "string",
"partner_id": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"website": "string",
"zipcode": "string"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Indicates the loan officer data was updated successfully, and returns the current data for the loan officer in ComeHome. | LoanOfficer |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | Partner or loan officer not found | None |
500 | Internal Server Error | Internal server error | None |
Delete a loan officer
Code samples
const headers = {
'Authorization':'API_KEY'
};
fetch('/v1/partner/loanofficer/{id}/',
{
method: 'DELETE',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Authorization': 'API_KEY'
}
r = requests.delete('/v1/partner/loanofficer/{id}/', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/loanofficer/{id}/");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("DELETE");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeDeleteRequest()
{
int id = 1;
string url = "/v1/partner/loanofficer/{id}/";
await DeleteAsync(id, url);
}
/// Performs a DELETE Request
public async Task DeleteAsync(int id, string url)
{
//Execute DELETE request
HttpResponseMessage response = await Client.DeleteAsync(url + $"/{id}");
//Return response
await DeserializeObject(response);
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Authorization' => 'API_KEY'
}
result = RestClient.delete '/v1/partner/loanofficer/{id}/',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('DELETE','/v1/partner/loanofficer/{id}/', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("DELETE", "/v1/partner/loanofficer/{id}/", nil)
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
DELETE /v1/partner/loanofficer/{id}/
Delete an existing loan officer from ComeHome, using the id
returned to you when the loan officer was created.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | string | true | The UUID of the loan officer that was returned when the loan officer was created (id ). |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | Indicates the loan officer data was received and deleted successfully | None |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | Partner or loan officer not found | None |
500 | Internal Server Error | Internal server error | None |
OAuth
Requests related to OAuth configuration.
By leveraging our Partner API and the OAuth 2.0/OpenID Connect standard, ComeHome partners can now enable single-sign-on functionality via OAuth for their users with minimal configuration and out-of-the-box support. In order to configure the integration, partners must pass OAuth credentials and implementation details to our system via the endpoint detailed below.
OAuth Configuration Data
Code samples
const inputBody = '{
"authorize_url": "https://my.company.host/auth",
"basic_auth": true,
"client_id": "my-client-id-12345",
"client_secret": "my-secret-key-67890",
"pkce": false,
"scopes": "openid email profile",
"token_url": "https://oauth2.googleapis.com/token",
"user_info_mapping": {
"email": "string",
"family_name": "string",
"given_name": "string",
"sub": "string",
"phone_number": "string"
},
"user_info_url": "https://www.googleapis.com/oauth2/v3/userinfo",
"standard": "oauth2"
}';
const headers = {
'Content-Type':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/oauth',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Content-Type': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.post('/v1/partner/oauth', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/oauth");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakePostRequest()
{
string url = "/v1/partner/oauth";
string json = @"{
""authorize_url"": ""https://my.company.host/auth"",
""basic_auth"": true,
""client_id"": ""my-client-id-12345"",
""client_secret"": ""my-secret-key-67890"",
""pkce"": false,
""scopes"": ""openid email profile"",
""token_url"": ""https://oauth2.googleapis.com/token"",
""user_info_mapping"": {
""email"": ""string"",
""family_name"": ""string"",
""given_name"": ""string"",
""sub"": ""string"",
""phone_number"": ""string""
},
""user_info_url"": ""https://www.googleapis.com/oauth2/v3/userinfo"",
""standard"": ""oauth2""
}";
OAuthRequest content = JsonConvert.DeserializeObject(json);
await PostAsync(content, url);
}
/// Performs a POST Request
public async Task PostAsync(OAuthRequest content, string url)
{
//Serialize Object
StringContent jsonContent = SerializeObject(content);
//Execute POST request
HttpResponseMessage response = await Client.PostAsync(url, jsonContent);
}
/// Serialize an object to Json
private StringContent SerializeObject(OAuthRequest content)
{
//Serialize Object
string jsonObject = JsonConvert.SerializeObject(content);
//Create Json UTF8 String Content
return new StringContent(jsonObject, Encoding.UTF8, "application/json");
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.post '/v1/partner/oauth',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/v1/partner/oauth', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
body := `{
"authorize_url": "https://my.company.host/auth",
"basic_auth": true,
"client_id": "my-client-id-12345",
"client_secret": "my-secret-key-67890",
"pkce": false,
"scopes": "openid email profile",
"token_url": "https://oauth2.googleapis.com/token",
"user_info_mapping": {
"email": "string",
"family_name": "string",
"given_name": "string",
"sub": "string",
"phone_number": "string"
},
"user_info_url": "https://www.googleapis.com/oauth2/v3/userinfo",
"standard": "oauth2"
}`
req, err := http.NewRequest("POST", "/v1/partner/oauth", bytes.NewBuffer([]byte{body}))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /v1/partner/oauth
Use this endpoint to send configuration settings for your OAuth integration to ComeHome. See the documentation for the OAuthRequest object below for details on the specific fields needed, but at a high-level, we need client credentials, URL endpoints to authorize the exchange, pull an access token, and fetch user-info, a mapping that defines how user-info should be parsed, and some specifics around auth and the use of PKCE.
See OAuthRequest in the "Parameters" section below for more details.
Body parameter
{
"authorize_url": "https://my.company.host/auth",
"basic_auth": true,
"client_id": "my-client-id-12345",
"client_secret": "my-secret-key-67890",
"pkce": false,
"scopes": "openid email profile",
"token_url": "https://oauth2.googleapis.com/token",
"user_info_mapping": {
"email": "string",
"family_name": "string",
"given_name": "string",
"sub": "string",
"phone_number": "string"
},
"user_info_url": "https://www.googleapis.com/oauth2/v3/userinfo",
"standard": "oauth2"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | OAuthRequest | false | none |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | Indicates the configuration data was received successfully | None |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | Partner or configuration not found | None |
500 | Internal Server Error | Internal server error | None |
SAML
Requests related to SAML configuration.
Our SAML integration is based on industry standards, and geared specifically towards identity providers (IdP) like Okta and Auth0. At a high-level, the setup flow should look like this: first, you'll need to obtain a client-ID and client-secret for our Partner API (your client success contact at ComeHome can help you with this). Using those credentials, you can access the /v1/partner/token
Partner API endpoint to obtain an auth token, which you'll use to authenticate further calls to our API.
Next, you'll use the three SAML-related endpoints outlined below to set up your SAML integration. You'll transfer to ComeHome a public key (which we'll use to validate the signature of the SAML responses we receive from your system), and SAML metadata (which outlines various specifics about the data we'll receive in each SAML response, endpoint information for service-provider (SP) initiated flows, and other details, per the SAML standard). You'll also fetch from ComeHome a public key that you'll use to encrypt the assertion values in each SAML response (we'll use the corresponding private key to decrypt the assertions). See below for details on each endpoint.
Finally, when the time comes to log a user into ComeHome via SAML, either via an SP- or IdP-initiated flow, SAML responses should be sent to our /entry
endpoint specific to you client-ID, outlined below (note that the client-ID provided by ComeHome and the partnerID referenced below are equivalent in this context). We will use the Subject.NameID
field in the response to uniquely identify the user in ComeHome, and will attempt to match that identifier with any relevant invites that may exist for this user (see documentation on ComeHome invites above). If this is the first time the user has accessed ComeHome, an account will be created for the user based on the data passed in the SAML response, and they will then be redirected to your ComeHome subdomain and automatically logged in.
SAML IdP Public Key
Code samples
const inputBody = '{
"cert": "string"
}';
const headers = {
'Content-Type':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/saml/cert',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Content-Type': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.post('/v1/partner/saml/cert', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/saml/cert");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakePostRequest()
{
string url = "/v1/partner/saml/cert";
string json = @"{
""cert"": ""string""
}";
SAMLCertRequest content = JsonConvert.DeserializeObject(json);
await PostAsync(content, url);
}
/// Performs a POST Request
public async Task PostAsync(SAMLCertRequest content, string url)
{
//Serialize Object
StringContent jsonContent = SerializeObject(content);
//Execute POST request
HttpResponseMessage response = await Client.PostAsync(url, jsonContent);
}
/// Serialize an object to Json
private StringContent SerializeObject(SAMLCertRequest content)
{
//Serialize Object
string jsonObject = JsonConvert.SerializeObject(content);
//Create Json UTF8 String Content
return new StringContent(jsonObject, Encoding.UTF8, "application/json");
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.post '/v1/partner/saml/cert',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/v1/partner/saml/cert', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
body := `{
"cert": "string"
}`
req, err := http.NewRequest("POST", "/v1/partner/saml/cert", bytes.NewBuffer([]byte{body}))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /v1/partner/saml/cert
Use this endpoint to provide ComeHome with the public key for the x509 certificate that will be used to sign SAML responses. We will use this public key to validate that SAML responses we receive were provided by your system (the Identity Provider), and that the response has not been tampered with.
Body parameter
{
"cert": "string"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | SAMLCertRequest | false | none |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | Indicates that the public key was received successfully. | None |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | Partner or configuration not found | None |
500 | Internal Server Error | Internal server error | None |
SAML IdP Metadata
Code samples
const inputBody = '{
"metadata": "string"
}';
const headers = {
'Content-Type':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/saml/metadata',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Content-Type': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.post('/v1/partner/saml/metadata', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/saml/metadata");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakePostRequest()
{
string url = "/v1/partner/saml/metadata";
string json = @"{
""metadata"": ""string""
}";
SAMLMetadataRequest content = JsonConvert.DeserializeObject(json);
await PostAsync(content, url);
}
/// Performs a POST Request
public async Task PostAsync(SAMLMetadataRequest content, string url)
{
//Serialize Object
StringContent jsonContent = SerializeObject(content);
//Execute POST request
HttpResponseMessage response = await Client.PostAsync(url, jsonContent);
}
/// Serialize an object to Json
private StringContent SerializeObject(SAMLMetadataRequest content)
{
//Serialize Object
string jsonObject = JsonConvert.SerializeObject(content);
//Create Json UTF8 String Content
return new StringContent(jsonObject, Encoding.UTF8, "application/json");
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.post '/v1/partner/saml/metadata',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/v1/partner/saml/metadata', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
body := `{
"metadata": "string"
}`
req, err := http.NewRequest("POST", "/v1/partner/saml/metadata", bytes.NewBuffer([]byte{body}))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /v1/partner/saml/metadata
Use this endpoint to provide ComeHome with XML-formatted SAML metadata that details the specifics of your identity-provider (IdP) service.
We leverage the industry-standard SAML metadata format to ensure that our partner SAML integrations work as expected with minimal configuration. To read more about the standard, see here: SAML metadata - Identity Provider. Most identity providers, like Okta or Auth0, provide ready-made metadata for client use, which should be accessible in your account portal for those services.
Body parameter
{
"metadata": "string"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | SAMLMetadataRequest | false | none |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | Indicates that the metadata was received successfully. | None |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | Partner or configuration not found | None |
500 | Internal Server Error | Internal server error | None |
SAML SP Public Key (ComeHome)
Code samples
const headers = {
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/saml/public-cert',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.get('/v1/partner/saml/public-cert', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/saml/public-cert");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeGetRequest()
{
string url = "/v1/partner/saml/public-cert";
var result = await GetAsync(url);
}
/// Performs a GET Request
public async Task GetAsync(string url)
{
//Start the request
HttpResponseMessage response = await Client.GetAsync(url);
//Validate result
response.EnsureSuccessStatusCode();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.get '/v1/partner/saml/public-cert',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/v1/partner/saml/public-cert', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "/v1/partner/saml/public-cert", nil)
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /v1/partner/saml/public-cert
Use this endpoint to fetch the public key for our x509 certificate. This public key should be used to encrypt the assertions included in the SAML response. We will use the corresponding private key to decrypt these assertions upon receipt, and then use them to authenticate your users into ComeHome.
Example responses
200 Response
{
"cert": "string"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Indicates that the metadata was received successfully. | SAMLPublicCertResponse |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | Partner or configuration not found | None |
500 | Internal Server Error | Internal server error | None |
SAML response entry
Code samples
const inputBody = '{
"SAMLResponse": "string",
"RelayState": "string"
}';
const headers = {
'Content-Type':'application/x-www-form-urlencoded'
};
fetch('/v1/partner/{partnerID}/entry',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
r = requests.post('/v1/partner/{partnerID}/entry', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/{partnerID}/entry");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakePostRequest()
{
string url = "/v1/partner/{partnerID}/entry";
await PostAsync(null, url);
}
/// Performs a POST Request
public async Task PostAsync(undefined content, string url)
{
//Serialize Object
StringContent jsonContent = SerializeObject(content);
//Execute POST request
HttpResponseMessage response = await Client.PostAsync(url, jsonContent);
}
/// Serialize an object to Json
private StringContent SerializeObject(undefined content)
{
//Serialize Object
string jsonObject = JsonConvert.SerializeObject(content);
//Create Json UTF8 String Content
return new StringContent(jsonObject, Encoding.UTF8, "application/json");
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/x-www-form-urlencoded'
}
result = RestClient.post '/v1/partner/{partnerID}/entry',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/x-www-form-urlencoded',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/v1/partner/{partnerID}/entry', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
body := `{
"SAMLResponse": "string",
"RelayState": "string"
}`
req, err := http.NewRequest("POST", "/v1/partner/{partnerID}/entry", bytes.NewBuffer([]byte{body}))
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /v1/partner/{partnerID}/entry
SAML identity providers should post SAML response data to this endpoint. SAML responses should be formatted per the SAML standard, and included as form data under SAMLResponse.
The exact endpoint will contain the partnerID (aka client-id) provided to you by ComeHome (this is the same client-id you'll use to fetch a token for the Partner API). For example, if your partnerID/client-id is abcd-1234-efgh-5678
, then this entry endpoint will be /v1/partner/abcd-1234-efgh-5678/entry
.
RelayState
When using SAML IDP flow to link users into the Comehome experience, you have the option to provide a RelayState
URL parameter to influence what page the user will land on.
The relaystate parameter must be a json value containing a value called "screen", as described below:
Search
If "screen" is "search_results" then the user will be dropped to the search screen, and additional filters can be specified to the search they see:
- "minBeds" specifies minimum beds
- "minBaths" specifies minimum bathrooms
- "borrowingPower" specifies max price
- "coordinates" specifies a bounding box for where the map will start, as described by two sets of coordinates.
- "zip" specifies a zipcode as a search area (cannot be combined with "coordinates")
Example:
{
"screen": "search_results",
"minBeds": "2",
"minBaths": "2.5",
"borrowingPower": "500000",
"zip": "94107"
}
or
{
"screen": "search_results",
"minBeds": "2",
"minBaths": "2.5",
"borrowingPower": "500000",
"coordinates": "40.0,-75.0,40.1,-75.1"
}
Saved Search
If "screen" is "saved_searches" then the user will see the results of their most recent saved search.
Example:
{
"screen": "saved_searches"
}
Property Detail
If "screen" is "detail" then the user will be dropped to the details page for the property specified in the "propertySlug" field.
Example:
{
"screen": "detail",
"propertySlug": "123-Main-St-San-Francisco-CA-94107"
}
Alerts
If "screen" is "alerts" then the user will be dropped to the "alerts" page at <subdomain>.comehome.com/alerts/
Example:
{
"screen": "alerts"
}
Claimed Homes
If "screen" is "claimed_homes" then the user will be dropped to the "alerts" page at <subdomain>.comehome.com/homeowner/claimed-homes
Example:
{
"screen": "claimed_homes"
}
Watchlist
If "screen" is "saved_properties" then the user will be dropped to the watchlist page at <subdomain>.comehome.com/watchlist/
Example:
{
"screen": "saved_properties"
}
Body parameter
SAMLResponse: string
RelayState: string
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | true | none |
» SAMLResponse | body | string | true | XML-formatted SAML response. |
» RelayState | body | string | false | JSON document to control where the user lands. |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | Partner or configuration not found | None |
500 | Internal Server Error | Internal server error | None |
Analytics
Returns key usage data
Code samples
const headers = {
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/analytics/activities',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.get('/v1/partner/analytics/activities', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/analytics/activities");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeGetRequest()
{
string url = "/v1/partner/analytics/activities";
var result = await GetAsync(url);
}
/// Performs a GET Request
public async Task GetAsync(string url)
{
//Start the request
HttpResponseMessage response = await Client.GetAsync(url);
//Validate result
response.EnsureSuccessStatusCode();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.get '/v1/partner/analytics/activities',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/v1/partner/analytics/activities', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "/v1/partner/analytics/activities", nil)
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /v1/partner/analytics/activities
Provides a stable, consistent view into user activity on ComeHome across a collection of high-value actions, or activities. This data may be filtered by a variety of ComeHome- and partner-provided metrics, and has more generous data retention policies than our legacy /analytics
endpoint.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
lo_id | query | string | false | Filter by users that are associated with this loan officer. |
limit | query | integer | false | Set the maximum number of events that will be returned in a single page. The maximum allowed value is 1000 events. |
start_date | query | string | false | Set the earliest date/time for which events should be returned. UTC formatting (ex. 2006-01-02T15:04:05 ). Partners may request data from up to 30 days in the past. |
end_date | query | string | false | Set the latest date/time for which events should be returned. UTC formatting (ex. 2006-01-02T15:04:05 ). Must be no more than 24hrs after start_date . |
partner_user_id | query | string | false | Filter by a single user that can be identified by this partner-supplied identifier. |
agent_id | query | string | false | Filter by users that are associated with this agent. |
activity_type | query | string | false | Filter by a single activity type. List of activity types: claim_home , find_pro , home_improvement_calculator , lender_ctas , lo_contacts , mortgage_calculator , pdp_views , property_saves , realestate_agent_contacts , refi_calculator , searches_performed , searches_saved , visits . |
event_name | query | string | false | Filter by a single or multiple event names |
cursor | query | string | false | Use this field to page through query responses, using the cursor field supplied in each response. |
Maps the activity types to event names
Activity Type | Event Names |
---|---|
claim_home | click_home_insurance_homeowner_pdp, click_home_verification_submit_cta, click_owner_claim_select_address, click_owner_edit_beds, click_owner_edit_close, click_owner_edit_details, click_owner_edit_full_baths, click_owner_edit_half_baths, click_owner_edit_living_area, click_owner_edit_loan_amount, click_owner_edit_lot_size, click_owner_edit_rate, click_owner_edit_sale_date, click_owner_edit_sale_price, click_owner_edit_save, click_owner_edit_sqft, click_owner_edit_terms, click_owner_edit_total_rooms, click_owner_equity, click_owner_manage_dashboard_remove, click_owner_verify_cta, click_owner_verify_success, click_property_details_owner_promo |
find_pro | click_owner_profinder_submit |
home_improvement_calculator | click_owner_improvement_state_update |
lender_ctas | click_buyer_loan_options_submit, click_grant_header_cta, click_grant_info_srp_card, click_grant_modal_cta, click_grant_pdp_cta, click_lender_brokerage_page_cta, click_lender_cta, click_lender_nav_link_1, click_lender_nav_link_2, click_lender_nav_link_3, click_loan_details_refi_calc_cta |
lo_contacts | click_ad_cta, click_buyer-lo-contact, click_buyer_lo_modal_cta, click_buyer_lo_modal_cta_success, click_buyer_loan_options, click_buyer_pdp_contact, click_lender_cta_owner, click_lender_cta_see_loan_options, click_lo_contact_call, click_lo_contact_email, click_owner_lo_contact, click_owner_loan_options, click_owner_loan_options_submit, click_url_cta_pdp, click_url_cta_srp, click_your_team_button, click_your_team_close_button, click_your_team_lender_no_lo_contact_button, click_your_team_lo_contact_button_1, click_your_team_lo_contact_button_2, click_your_team_lo_contact_button_3, click_your_team_lo_contact_button_4, click_your_team_lo_contact_button_5, click_your_team_lo_lender_cta, click_your_team_lo_send_button, click_your_team_lo_send_error, click_your_team_lo_send_success, click_your_team_no_lo_lender_cta |
mortgage_calculator | click_property_details_mortgage_calculator, click_property_details_update_mortgage_calc_details |
pdp_views | click_pdp_share, property_details_page_view |
property_saves | click_alerts_watch, click_property_details_unwatch_confirm, click_property_details_watch, click_search_list_watch, click_watch_property_success |
realestate_agent_contacts | click_concierge_team_cta_1, click_concierge_team_cta_2, click_concierge_team_cta_3, click_concierge_team_cta_4, click_find_agent_banner_pdp, click_find_agent_buyer_comments, click_find_agent_buyer_email, click_find_agent_buyer_first_name, click_find_agent_buyer_last_name, click_find_agent_buyer_phone, click_find_agent_buyer_pre_approved_no, click_find_agent_buyer_pre_approved_yes, click_find_agent_buyer_submit, click_find_agent_card_ho, click_find_agent_header, click_find_agent_header_buying_button, click_find_agent_header_comments, click_find_agent_header_email, click_find_agent_header_first_name, click_find_agent_header_last_name, click_find_agent_header_phone, click_find_agent_header_pre_approved_no, click_find_agent_header_pre_approved_yes, click_find_agent_header_preferred_price, click_find_agent_header_selling_button, click_find_agent_header_submit, click_find_agent_ho_banner, click_find_agent_seller_comments, click_find_agent_seller_email, click_find_agent_seller_first_name, click_find_agent_seller_last_name, click_find_agent_seller_phone, click_find_agent_seller_preferred_price, click_find_agent_seller_submit, click_nav_homepage_find_agent_component, click_property_details_contact_agent, click_talk_to_agent_top_agents_ranked, click_your_team_choose_another_agent_confirmation_page, click_your_team_choose_another_agent_question_page, click_your_team_find_an_agent_tab, click_your_team_get_paired_with_an_agent, click_your_team_re_agent_contact_button_1, click_your_team_re_agent_contact_button_2, click_your_team_re_agent_contact_button_3, click_your_team_re_agent_contact_button_4, click_your_team_re_agent_contact_button_5, click_your_team_re_agent_lender_cta, click_your_team_re_agent_send_button, click_your_team_re_agent_send_error, click_your_team_re_agent_send_success, click_your_team_use_this_agent_button_lender_recommended_agent, click_your_team_use_this_agent_button_previous_agent |
refi_calculator | click_loan_details_refi_calc_mortgage, click_owner_refi_calc_terms |
searches_performed | click_search_field, search_state_update |
searches_saved | click_save_search_cta_list_view, click_save_search_cta_map_view, click_save_search_cta_mobile_filters, click_save_search_success, click_settings_save_search_delete |
selling_options | click_discount_cta, click_discount_read_more, click_fsbo_cta, click_fsbo_read_more, click_ibuyer_cta, click_ibuyer_read_more, click_traditional_cta, click_traditional_read_more, input_address_id_ts |
visits | signup_complete, visit |
Example responses
200 Response
{
"data": [
{
"activity_detail": {},
"activity_type": "string",
"agent_id": "string",
"browser": "string",
"cookie_id": "string",
"event_id": "string",
"event_ts": "string",
"id": "string",
"ip": "string",
"lo_id": "string",
"partner_user_id": "string",
"url": "string",
"visit_id": "string"
}
],
"next_cursor": "string"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Paged analytics data relevant to the request query | ActivityListResponse |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
404 | Not Found | Partner or configuration not found | None |
500 | Internal Server Error | Internal server error | None |
Analytics Webhooks
View existing analytics webhooks
Code samples
const headers = {
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/webhooks/analytics',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.get('/v1/partner/webhooks/analytics', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/webhooks/analytics");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeGetRequest()
{
string url = "/v1/partner/webhooks/analytics";
var result = await GetAsync(url);
}
/// Performs a GET Request
public async Task GetAsync(string url)
{
//Start the request
HttpResponseMessage response = await Client.GetAsync(url);
//Validate result
response.EnsureSuccessStatusCode();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.get '/v1/partner/webhooks/analytics',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/v1/partner/webhooks/analytics', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "/v1/partner/webhooks/analytics", nil)
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /v1/partner/webhooks/analytics
View registered analytics webhooks, the filters for activity types and event names, and whether they are set to active.
Use to gather the IDs if you want to perform further actions such as updating or deleting, via PATCH and DELETE, respectively.
Example responses
200 Response
{
"data": [
{
"id": "string",
"url": "string",
"basic_auth": {
"set_on": "string"
},
"signed_v1_auth": {
"set_on": "string"
},
"activity_types": [
"string"
],
"event_names": [
"string"
],
"created": "string",
"is_active": true
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | List of analytics webhooks | AnalyticsWebhookList |
500 | Internal Server Error | Internal server error | None |
Create analytics webhook
Code samples
const inputBody = '{
"url": "string",
"basic_auth": {
"user_id": "string",
"password": "string"
},
"signed_v1_auth": {
"key": "string"
},
"activity_types": [
"string"
],
"event_names": [
"string"
]
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/webhooks/analytics',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.post('/v1/partner/webhooks/analytics', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/webhooks/analytics");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakePostRequest()
{
string url = "/v1/partner/webhooks/analytics";
string json = @"{
""url"": ""string"",
""basic_auth"": {
""user_id"": ""string"",
""password"": ""string""
},
""signed_v1_auth"": {
""key"": ""string""
},
""activity_types"": [
""string""
],
""event_names"": [
""string""
]
}";
AnalyticsWebhookCreateRequest content = JsonConvert.DeserializeObject(json);
await PostAsync(content, url);
}
/// Performs a POST Request
public async Task PostAsync(AnalyticsWebhookCreateRequest content, string url)
{
//Serialize Object
StringContent jsonContent = SerializeObject(content);
//Execute POST request
HttpResponseMessage response = await Client.PostAsync(url, jsonContent);
}
/// Serialize an object to Json
private StringContent SerializeObject(AnalyticsWebhookCreateRequest content)
{
//Serialize Object
string jsonObject = JsonConvert.SerializeObject(content);
//Create Json UTF8 String Content
return new StringContent(jsonObject, Encoding.UTF8, "application/json");
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.post '/v1/partner/webhooks/analytics',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/v1/partner/webhooks/analytics', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
body := `{
"url": "string",
"basic_auth": {
"user_id": "string",
"password": "string"
},
"signed_v1_auth": {
"key": "string"
},
"activity_types": [
"string"
],
"event_names": [
"string"
]
}`
req, err := http.NewRequest("POST", "/v1/partner/webhooks/analytics", bytes.NewBuffer([]byte{body}))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /v1/partner/webhooks/analytics
Set up an analytics webhook in order to receive data for your ComeHome instance instead of polling our API for events. One of "basic_auth" or "signed_v1_auth" must be provided.
Body parameter
{
"url": "string",
"basic_auth": {
"user_id": "string",
"password": "string"
},
"signed_v1_auth": {
"key": "string"
},
"activity_types": [
"string"
],
"event_names": [
"string"
]
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | AnalyticsWebhookCreateRequest | true | Object containing the analytics webhook to create |
Example responses
200 Response
{
"data": [
{
"id": "string",
"url": "string",
"basic_auth": {
"set_on": "string"
},
"signed_v1_auth": {
"set_on": "string"
},
"activity_types": [
"string"
],
"event_names": [
"string"
],
"created": "string",
"is_active": true
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Created analytics webhook | AnalyticsWebhookList |
400 | Bad Request | Bad request due to invalid input or too many existing registered webhooks (limit reached) | None |
409 | Conflict | Conflict found with an existing analytics webhook (URL must be unique) | None |
500 | Internal Server Error | Internal server error | None |
View an existing analytics webhook
Code samples
const headers = {
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/webhooks/analytics/{id}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.get('/v1/partner/webhooks/analytics/{id}', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/webhooks/analytics/{id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeGetRequest()
{
string url = "/v1/partner/webhooks/analytics/{id}";
var result = await GetAsync(url);
}
/// Performs a GET Request
public async Task GetAsync(string url)
{
//Start the request
HttpResponseMessage response = await Client.GetAsync(url);
//Validate result
response.EnsureSuccessStatusCode();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.get '/v1/partner/webhooks/analytics/{id}',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/v1/partner/webhooks/analytics/{id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "/v1/partner/webhooks/analytics/{id}", nil)
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /v1/partner/webhooks/analytics/{id}
View a registered analytics webhooks, the filters for activity types and event names, and whether it is set to active.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | string | true | Webhook ID |
Example responses
200 Response
{
"data": [
{
"id": "string",
"url": "string",
"basic_auth": {
"set_on": "string"
},
"signed_v1_auth": {
"set_on": "string"
},
"activity_types": [
"string"
],
"event_names": [
"string"
],
"created": "string",
"is_active": true
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | List of analytics webhooks | AnalyticsWebhookList |
404 | Not Found | Specified webhook ID was not found | None |
500 | Internal Server Error | Internal server error | None |
Update an existing analytics webhook
Code samples
const inputBody = '{
"url": "string",
"basic_auth": {
"user_id": "string",
"password": "string"
},
"signed_v1_auth": {
"key": "string"
},
"activity_types": [
"string"
],
"event_names": [
"string"
],
"is_active": true
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/webhooks/analytics/{id}',
{
method: 'PATCH',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.patch('/v1/partner/webhooks/analytics/{id}', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/webhooks/analytics/{id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PATCH");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.patch '/v1/partner/webhooks/analytics/{id}',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PATCH','/v1/partner/webhooks/analytics/{id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
body := `{
"url": "string",
"basic_auth": {
"user_id": "string",
"password": "string"
},
"signed_v1_auth": {
"key": "string"
},
"activity_types": [
"string"
],
"event_names": [
"string"
],
"is_active": true
}`
req, err := http.NewRequest("PATCH", "/v1/partner/webhooks/analytics/{id}", bytes.NewBuffer([]byte{body}))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
PATCH /v1/partner/webhooks/analytics/{id}
Update an analytics webhook via ID.
Body parameter
{
"url": "string",
"basic_auth": {
"user_id": "string",
"password": "string"
},
"signed_v1_auth": {
"key": "string"
},
"activity_types": [
"string"
],
"event_names": [
"string"
],
"is_active": true
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | string | true | Webhook ID |
body | body | AnalyticsWebhookUpdateRequest | true | Object containing the analytics webhook to create |
Example responses
200 Response
{
"data": [
{
"id": "string",
"url": "string",
"basic_auth": {
"set_on": "string"
},
"signed_v1_auth": {
"set_on": "string"
},
"activity_types": [
"string"
],
"event_names": [
"string"
],
"created": "string",
"is_active": true
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Successfully updated analytics webhook | AnalyticsWebhookList |
400 | Bad Request | Bad request due to invalid input or too many existing registered webhooks (limit reached) | None |
404 | Not Found | Specified webhook ID was not found | None |
409 | Conflict | Conflict found with an existing analytics webhook (URL must be unique) | None |
500 | Internal Server Error | Internal server error | None |
Delete an analytics webhook
Code samples
const headers = {
'Authorization':'API_KEY'
};
fetch('/v1/partner/webhooks/analytics/{id}',
{
method: 'DELETE',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Authorization': 'API_KEY'
}
r = requests.delete('/v1/partner/webhooks/analytics/{id}', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/webhooks/analytics/{id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("DELETE");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeDeleteRequest()
{
int id = 1;
string url = "/v1/partner/webhooks/analytics/{id}";
await DeleteAsync(id, url);
}
/// Performs a DELETE Request
public async Task DeleteAsync(int id, string url)
{
//Execute DELETE request
HttpResponseMessage response = await Client.DeleteAsync(url + $"/{id}");
//Return response
await DeserializeObject(response);
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Authorization' => 'API_KEY'
}
result = RestClient.delete '/v1/partner/webhooks/analytics/{id}',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('DELETE','/v1/partner/webhooks/analytics/{id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("DELETE", "/v1/partner/webhooks/analytics/{id}", nil)
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
DELETE /v1/partner/webhooks/analytics/{id}
Permanently delete an analytics webhook via ID.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | string | true | Webhook ID |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | Webhook was successfully deleted | None |
400 | Bad Request | Bad request | None |
404 | Not Found | Analytics webhook not found | None |
500 | Internal Server Error | Internal server error | None |
Callouts Webhooks
View existing callouts webhooks
Code samples
const headers = {
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/webhooks/callouts',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.get('/v1/partner/webhooks/callouts', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/webhooks/callouts");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeGetRequest()
{
string url = "/v1/partner/webhooks/callouts";
var result = await GetAsync(url);
}
/// Performs a GET Request
public async Task GetAsync(string url)
{
//Start the request
HttpResponseMessage response = await Client.GetAsync(url);
//Validate result
response.EnsureSuccessStatusCode();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.get '/v1/partner/webhooks/callouts',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/v1/partner/webhooks/callouts', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "/v1/partner/webhooks/callouts", nil)
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /v1/partner/webhooks/callouts
View registered callouts webhooks.
Use to gather the IDs if you want to perform further actions such as updating or deleting, via PATCH and DELETE, respectively.
Example responses
200 Response
{
"data": [
{
"id": "string",
"url": "string",
"basic_auth": {
"set_on": "string"
},
"signed_v1_auth": {
"set_on": "string"
},
"created": "string",
"is_active": true
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | List of callouts webhooks | CalloutsWebhookList |
500 | Internal Server Error | Internal server error | None |
Create callouts webhook
Code samples
const inputBody = '{
"url": "string",
"basic_auth": {
"user_id": "string",
"password": "string"
},
"signed_v1_auth": {
"key": "string"
}
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/webhooks/callouts',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.post('/v1/partner/webhooks/callouts', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/webhooks/callouts");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakePostRequest()
{
string url = "/v1/partner/webhooks/callouts";
string json = @"{
""url"": ""string"",
""basic_auth"": {
""user_id"": ""string"",
""password"": ""string""
},
""signed_v1_auth"": {
""key"": ""string""
}
}";
CalloutsWebhookCreateRequest content = JsonConvert.DeserializeObject(json);
await PostAsync(content, url);
}
/// Performs a POST Request
public async Task PostAsync(CalloutsWebhookCreateRequest content, string url)
{
//Serialize Object
StringContent jsonContent = SerializeObject(content);
//Execute POST request
HttpResponseMessage response = await Client.PostAsync(url, jsonContent);
}
/// Serialize an object to Json
private StringContent SerializeObject(CalloutsWebhookCreateRequest content)
{
//Serialize Object
string jsonObject = JsonConvert.SerializeObject(content);
//Create Json UTF8 String Content
return new StringContent(jsonObject, Encoding.UTF8, "application/json");
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.post '/v1/partner/webhooks/callouts',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/v1/partner/webhooks/callouts', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
body := `{
"url": "string",
"basic_auth": {
"user_id": "string",
"password": "string"
},
"signed_v1_auth": {
"key": "string"
}
}`
req, err := http.NewRequest("POST", "/v1/partner/webhooks/callouts", bytes.NewBuffer([]byte{body}))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /v1/partner/webhooks/callouts
Set up a callouts webhook in order to receive notifications for your users. One of "basic_auth" or "signed_v1_auth" must be provided.
Body parameter
{
"url": "string",
"basic_auth": {
"user_id": "string",
"password": "string"
},
"signed_v1_auth": {
"key": "string"
}
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | CalloutsWebhookCreateRequest | true | Object describing the callouts webhook to create |
Example responses
200 Response
{
"data": [
{
"id": "string",
"url": "string",
"basic_auth": {
"set_on": "string"
},
"signed_v1_auth": {
"set_on": "string"
},
"created": "string",
"is_active": true
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Created callouts webhook | CalloutsWebhookList |
400 | Bad Request | Bad request due to invalid input or too many existing webhooks (limit is 10 webhooks) | None |
409 | Conflict | Conflict found with an existing callouts webhook (URL must be unique) | None |
500 | Internal Server Error | Internal server error | None |
View an existing callouts webhook
Code samples
const headers = {
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/webhooks/callouts/{id}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.get('/v1/partner/webhooks/callouts/{id}', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/webhooks/callouts/{id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeGetRequest()
{
string url = "/v1/partner/webhooks/callouts/{id}";
var result = await GetAsync(url);
}
/// Performs a GET Request
public async Task GetAsync(string url)
{
//Start the request
HttpResponseMessage response = await Client.GetAsync(url);
//Validate result
response.EnsureSuccessStatusCode();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.get '/v1/partner/webhooks/callouts/{id}',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/v1/partner/webhooks/callouts/{id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "/v1/partner/webhooks/callouts/{id}", nil)
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /v1/partner/webhooks/callouts/{id}
View a registered callouts webhook.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | string | true | Webhook ID |
Example responses
200 Response
{
"data": [
{
"id": "string",
"url": "string",
"basic_auth": {
"set_on": "string"
},
"signed_v1_auth": {
"set_on": "string"
},
"created": "string",
"is_active": true
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | List of callouts webhooks | CalloutsWebhookList |
404 | Not Found | Specified webhook ID was not found | None |
500 | Internal Server Error | Internal server error | None |
Update an existing callouts webhook
Code samples
const inputBody = '{
"url": "string",
"basic_auth": {
"user_id": "string",
"password": "string"
},
"signed_v1_auth": {
"key": "string"
},
"is_active": true
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/webhooks/callouts/{id}',
{
method: 'PATCH',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.patch('/v1/partner/webhooks/callouts/{id}', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/webhooks/callouts/{id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PATCH");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.patch '/v1/partner/webhooks/callouts/{id}',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PATCH','/v1/partner/webhooks/callouts/{id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
body := `{
"url": "string",
"basic_auth": {
"user_id": "string",
"password": "string"
},
"signed_v1_auth": {
"key": "string"
},
"is_active": true
}`
req, err := http.NewRequest("PATCH", "/v1/partner/webhooks/callouts/{id}", bytes.NewBuffer([]byte{body}))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
PATCH /v1/partner/webhooks/callouts/{id}
Update a callouts webhook via ID.
You can update the auth fields or the destination URL.
Body parameter
{
"url": "string",
"basic_auth": {
"user_id": "string",
"password": "string"
},
"signed_v1_auth": {
"key": "string"
},
"is_active": true
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | string | true | Webhook ID |
body | body | CalloutsWebhookUpdateRequest | true | Object describing the callouts webhook to update |
Example responses
200 Response
{
"data": [
{
"id": "string",
"url": "string",
"basic_auth": {
"set_on": "string"
},
"signed_v1_auth": {
"set_on": "string"
},
"created": "string",
"is_active": true
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Successfully updated callouts webhook | CalloutsWebhookList |
400 | Bad Request | Bad request due to invalid input | None |
409 | Conflict | Conflict found with an existing callouts webhook (URL must be unique) | None |
500 | Internal Server Error | Internal server error | None |
Delete a callouts webhook
Code samples
const headers = {
'Authorization':'API_KEY'
};
fetch('/v1/partner/webhooks/callouts/{id}',
{
method: 'DELETE',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Authorization': 'API_KEY'
}
r = requests.delete('/v1/partner/webhooks/callouts/{id}', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/webhooks/callouts/{id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("DELETE");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeDeleteRequest()
{
int id = 1;
string url = "/v1/partner/webhooks/callouts/{id}";
await DeleteAsync(id, url);
}
/// Performs a DELETE Request
public async Task DeleteAsync(int id, string url)
{
//Execute DELETE request
HttpResponseMessage response = await Client.DeleteAsync(url + $"/{id}");
//Return response
await DeserializeObject(response);
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Authorization' => 'API_KEY'
}
result = RestClient.delete '/v1/partner/webhooks/callouts/{id}',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('DELETE','/v1/partner/webhooks/callouts/{id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("DELETE", "/v1/partner/webhooks/callouts/{id}", nil)
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
DELETE /v1/partner/webhooks/callouts/{id}
Permanently delete a callouts webhook via ID.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | string | true | Webhook ID |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | Webhook was successfully deleted | None |
400 | Bad Request | Bad request | None |
404 | Not Found | Callouts webhook not found | None |
500 | Internal Server Error | Internal server error | None |
List ignored partner_user_ids
Code samples
const headers = {
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/webhooks/callouts/ignored',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.get('/v1/partner/webhooks/callouts/ignored', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/webhooks/callouts/ignored");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeGetRequest()
{
string url = "/v1/partner/webhooks/callouts/ignored";
var result = await GetAsync(url);
}
/// Performs a GET Request
public async Task GetAsync(string url)
{
//Start the request
HttpResponseMessage response = await Client.GetAsync(url);
//Validate result
response.EnsureSuccessStatusCode();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.get '/v1/partner/webhooks/callouts/ignored',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/v1/partner/webhooks/callouts/ignored', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "/v1/partner/webhooks/callouts/ignored", nil)
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /v1/partner/webhooks/callouts/ignored
View the list of partner_user_ids that are currently ignored by the callouts webhook.
Example responses
200 Response
[
"string"
]
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | List of callouts ignored webhooks | CalloutsWebhookIgnoredList |
500 | Internal Server Error | Internal server error | None |
Add a partner_user_id to the ignore list
Code samples
const headers = {
'Authorization':'API_KEY'
};
fetch('/v1/partner/webhooks/callouts/ignored/{partner_user_id}',
{
method: 'PUT',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Authorization': 'API_KEY'
}
r = requests.put('/v1/partner/webhooks/callouts/ignored/{partner_user_id}', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/webhooks/callouts/ignored/{partner_user_id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PUT");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakePutRequest()
{
int id = 1;
string url = "/v1/partner/webhooks/callouts/ignored/{partner_user_id}";
var result = await PutAsync(id, null, url);
}
/// Performs a PUT Request
public async Task PutAsync(int id, undefined content, string url)
{
//Serialize Object
StringContent jsonContent = SerializeObject(content);
//Execute PUT request
HttpResponseMessage response = await Client.PutAsync(url + $"/{id}", jsonContent);
//Return response
return await DeserializeObject(response);
}
/// Serialize an object to Json
private StringContent SerializeObject(undefined content)
{
//Serialize Object
string jsonObject = JsonConvert.SerializeObject(content);
//Create Json UTF8 String Content
return new StringContent(jsonObject, Encoding.UTF8, "application/json");
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Authorization' => 'API_KEY'
}
result = RestClient.put '/v1/partner/webhooks/callouts/ignored/{partner_user_id}',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PUT','/v1/partner/webhooks/callouts/ignored/{partner_user_id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("PUT", "/v1/partner/webhooks/callouts/ignored/{partner_user_id}", nil)
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
PUT /v1/partner/webhooks/callouts/ignored/{partner_user_id}
Set a partner_user_id to be ignored by the callouts webhook.
Any invite or user with a matching partner_user_id will not trigger a callout to the webhook.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | Partner user ID added to ignored list | None |
204 | No Content | Partner user ID already in ignored list | None |
404 | Not Found | No invite or user matches the provided partner_user_id | None |
500 | Internal Server Error | Internal server error | None |
Remove a partner_user_id from ignored list
Code samples
const headers = {
'Authorization':'API_KEY'
};
fetch('/v1/partner/webhooks/callouts/ignored/{partner_user_id}',
{
method: 'DELETE',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Authorization': 'API_KEY'
}
r = requests.delete('/v1/partner/webhooks/callouts/ignored/{partner_user_id}', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/webhooks/callouts/ignored/{partner_user_id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("DELETE");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeDeleteRequest()
{
int id = 1;
string url = "/v1/partner/webhooks/callouts/ignored/{partner_user_id}";
await DeleteAsync(id, url);
}
/// Performs a DELETE Request
public async Task DeleteAsync(int id, string url)
{
//Execute DELETE request
HttpResponseMessage response = await Client.DeleteAsync(url + $"/{id}");
//Return response
await DeserializeObject(response);
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Authorization' => 'API_KEY'
}
result = RestClient.delete '/v1/partner/webhooks/callouts/ignored/{partner_user_id}',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('DELETE','/v1/partner/webhooks/callouts/ignored/{partner_user_id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("DELETE", "/v1/partner/webhooks/callouts/ignored/{partner_user_id}", nil)
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
DELETE /v1/partner/webhooks/callouts/ignored/{partner_user_id}
Stop ignoring a partner_user_id for the callouts webhook.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | Partner user ID removed from ignored list | None |
404 | Not Found | The provided partner_user_id is not in the ignored list | None |
500 | Internal Server Error | Internal server error | None |
CHDirect
Get clients under loan officer
Code samples
const headers = {
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/ch-direct/{lo_user_id}/clients',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.get('/v1/partner/ch-direct/{lo_user_id}/clients', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/ch-direct/{lo_user_id}/clients");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakeGetRequest()
{
string url = "/v1/partner/ch-direct/{lo_user_id}/clients";
var result = await GetAsync(url);
}
/// Performs a GET Request
public async Task GetAsync(string url)
{
//Start the request
HttpResponseMessage response = await Client.GetAsync(url);
//Validate result
response.EnsureSuccessStatusCode();
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.get '/v1/partner/ch-direct/{lo_user_id}/clients',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/v1/partner/ch-direct/{lo_user_id}/clients', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "/v1/partner/ch-direct/{lo_user_id}/clients", nil)
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /v1/partner/ch-direct/{lo_user_id}/clients
Retrieve a list of clients that are assigned to the loan officer specified by loan officer's user ID.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
lo_user_id | path | string | true | User ID belonging to the Loan Officer |
Example responses
200 Response
{
"data": [
{
"id": "string",
"first_name": "string",
"last_name": "string",
"email": "string",
"phone": "string",
"is_buyer": true,
"slug": "string",
"buying_price_point": 0,
"address": {
"street_address": "string",
"unit": "string",
"city": "string",
"state": "string",
"zipcode": "string"
}
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | An array of all clients under the specified loan officer | CHDirectClientsGetResponse |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
500 | Internal Server Error | Internal server error | None |
Add clients under loan officer
Code samples
const inputBody = '{
"data": [
{
"first_name": "string",
"last_name": "string",
"email": "string",
"phone": "string",
"is_buyer": true,
"buying_price_point": 0,
"loan_amount": 0,
"address": {
"street_address": "string",
"unit": "string",
"city": "string",
"state": "string",
"zipcode": "string"
}
}
]
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'API_KEY'
};
fetch('/v1/partner/ch-direct/{lo_user_id}/clients',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'API_KEY'
}
r = requests.post('/v1/partner/ch-direct/{lo_user_id}/clients', headers = headers)
print(r.json())
URL obj = new URL("/v1/partner/ch-direct/{lo_user_id}/clients");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
/// <<summary>>
/// Example of Http Client
/// <</summary>>
public class HttpExample
{
private HttpClient Client { get; set; }
/// <<summary>>
/// Setup http client
/// <</summary>>
public HttpExample()
{
Client = new HttpClient();
}
/// Make a dummy request
public async Task MakePostRequest()
{
string url = "/v1/partner/ch-direct/{lo_user_id}/clients";
string json = @"{
""data"": [
{
""first_name"": ""string"",
""last_name"": ""string"",
""email"": ""string"",
""phone"": ""string"",
""is_buyer"": true,
""buying_price_point"": 0,
""loan_amount"": 0,
""address"": {
""street_address"": ""string"",
""unit"": ""string"",
""city"": ""string"",
""state"": ""string"",
""zipcode"": ""string""
}
}
]
}";
CHDirectClientsCreateRequest content = JsonConvert.DeserializeObject(json);
await PostAsync(content, url);
}
/// Performs a POST Request
public async Task PostAsync(CHDirectClientsCreateRequest content, string url)
{
//Serialize Object
StringContent jsonContent = SerializeObject(content);
//Execute POST request
HttpResponseMessage response = await Client.PostAsync(url, jsonContent);
}
/// Serialize an object to Json
private StringContent SerializeObject(CHDirectClientsCreateRequest content)
{
//Serialize Object
string jsonObject = JsonConvert.SerializeObject(content);
//Create Json UTF8 String Content
return new StringContent(jsonObject, Encoding.UTF8, "application/json");
}
/// Deserialize object from request response
private async Task DeserializeObject(HttpResponseMessage response)
{
//Read body
string responseBody = await response.Content.ReadAsStringAsync();
//Deserialize Body to object
var result = JsonConvert.DeserializeObject(responseBody);
}
}
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY'
}
result = RestClient.post '/v1/partner/ch-direct/{lo_user_id}/clients',
params: {
}, headers: headers
p JSON.parse(result)
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'API_KEY',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/v1/partner/ch-direct/{lo_user_id}/clients', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
package main
import (
"bytes"
"net/http"
)
func main() {
body := `{
"data": [
{
"first_name": "string",
"last_name": "string",
"email": "string",
"phone": "string",
"is_buyer": true,
"buying_price_point": 0,
"loan_amount": 0,
"address": {
"street_address": "string",
"unit": "string",
"city": "string",
"state": "string",
"zipcode": "string"
}
}
]
}`
req, err := http.NewRequest("POST", "/v1/partner/ch-direct/{lo_user_id}/clients", bytes.NewBuffer([]byte{body}))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
req.Header.Set("Authorization", "API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /v1/partner/ch-direct/{lo_user_id}/clients
Add new CHDirect clients under the loan officer (specified by loan officer's user ID) and send out invitations to the clients to join the ComeHome platform under your organization.
Body parameter
{
"data": [
{
"first_name": "string",
"last_name": "string",
"email": "string",
"phone": "string",
"is_buyer": true,
"buying_price_point": 0,
"loan_amount": 0,
"address": {
"street_address": "string",
"unit": "string",
"city": "string",
"state": "string",
"zipcode": "string"
}
}
]
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
lo_user_id | path | string | true | User ID belonging to the Loan Officer |
body | body | CHDirectClientsCreateRequest | true | none |
Example responses
201 Response
{
"clients": [
{
"id": "string",
"first_name": "string",
"last_name": "string",
"email": "string",
"phone": "string",
"is_buyer": true,
"slug": "string",
"buying_price_point": 0,
"address": {
"street_address": "string",
"unit": "string",
"city": "string",
"state": "string",
"zipcode": "string"
}
}
],
"invalid": [
{
"message": "string",
"id": {
"value": "string",
"error": "string"
},
"first_name": {
"value": "string",
"error": "string"
},
"last_name": {
"value": "string",
"error": "string"
},
"email": {
"value": "string",
"error": "string"
},
"phone": {
"value": "string",
"error": "string"
},
"slug": {
"value": "string",
"error": "string"
},
"is_buyer": {
"value": true,
"error": "string"
},
"buying_price_point": {
"value": 0,
"error": "string"
},
"loan_amount": {
"value": 0,
"error": "string"
},
"address": {
"value": {
"street_address": "string",
"unit": "string",
"city": "string",
"state": "string",
"zipcode": "string"
},
"error": "string"
}
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | Refer to the "clients" response field for the list of clients that have been created successfully; check "invalid" response field for any errors | CHDirectClientsCreateResponse |
400 | Bad Request | Bad request (e.g. invalid content-type) | None |
500 | Internal Server Error | Internal server error | None |
Schemas
OAuthRequest
{
"authorize_url": "https://my.company.host/auth",
"basic_auth": true,
"client_id": "my-client-id-12345",
"client_secret": "my-secret-key-67890",
"pkce": false,
"scopes": "openid email profile",
"token_url": "https://oauth2.googleapis.com/token",
"user_info_mapping": {
"email": "string",
"family_name": "string",
"given_name": "string",
"sub": "string",
"phone_number": "string"
},
"user_info_url": "https://www.googleapis.com/oauth2/v3/userinfo",
"standard": "oauth2"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
authorize_url | string | false | none | The endpoint our system will access to initiate the OAuth transaction. |
basic_auth | boolean | false | none | A flag indicating whether or not we should use HTTP Basic Authentication when accessing the token_url. |
client_id | string | false | none | An identifier for our app, provided by the authorization server. |
client_secret | string | false | none | API secret for our app, provided by the authorization server. |
pkce | boolean | false | none | A flag indicating whether or not we should leverage the Proof Key for Code Exchange (PKCE) standard during the OAuth transaction. |
scopes | string | false | none | The scopes we will request about the resource owner. |
token_url | string | false | none | The endpoint our system will access to retrieve an access token for the user_info_url. |
user_info_mapping | OAuthUserInfoOpenIDMapping | false | none | none |
user_info_url | string | false | none | The endpoint our system will access in order to retrieve information about the user, including the partner_user_id (i.e. the unique identifier held by the partner for this user), their email, phone number, and their first/last name. |
standard | string | false | none | The type of OAuth implementation your application will be using to communicate with ComeHome, we support OAuth2 and OIDC. If no value is set we will default to OIDC. |
OAuthUserInfoOpenIDMapping
{
"email": "string",
"family_name": "string",
"given_name": "string",
"sub": "string",
"phone_number": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
string | false | none | none | |
family_name | string | false | none | none |
given_name | string | false | none | none |
sub | string | false | none | none |
phone_number | string | false | none | none |
SAMLPublicCertResponse
{
"cert": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
cert | string | false | none | none |
SAMLMetadataRequest
{
"metadata": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
metadata | string | false | none | none |
SAMLCertRequest
{
"cert": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
cert | string | false | none | none |
Invite
{
"invite_type": "owner",
"partner_user_id": "string",
"email": "string",
"first_name": "string",
"last_name": "string",
"phone": "string",
"buyer": {
"buyer_cities": [
"tempe, az",
"phoenix, az"
],
"home_price_min": 0,
"home_price_max": 0,
"beds": 0,
"baths": 0,
"property_type": [
"SFR"
]
},
"owner": {
"sell_price": 0,
"property_address": {
"street": "string",
"unit": "string",
"city": "string",
"state": "st",
"zipcode": "string"
}
}
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
invite_type | string | true | none | none |
partner_user_id | string | true | none | Unique identifier the partner uses for this user. |
string | true | none | Email address of invitee, does not have to be unique (unlike id) | |
first_name | string | true | none | none |
last_name | string | true | none | none |
phone | string | false | none | none |
buyer | InfoBuyer | false | none | Parameters for invitee's home search. |
owner | InfoOwner | false | none | Details around the invitee's home. |
Enumerated Values
Property | Value |
---|---|
invite_type | owner |
invite_type | buyer |
InviteAgent
{
"id": "string",
"license_number": "string",
"license_state": "string"
}
Identifying information for a real estate agent that will be associated with all invites in this request. The passed information (which can be a ComeHome-provided identifier, or agent license data) will be used to look up an agent in ComeHome's list of known agents provided by the partner. If no matches are found, an error will be returned.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | none | Optionally, you may pass the ComeHome-generated identifier for the agent that was provided in the API response when this agent was added to ComeHome. |
license_number | string | false | none | The license number for the agent. |
license_state | string | false | none | The state in which the agent is licensed. |
InfoBuyer
{
"buyer_cities": [
"tempe, az",
"phoenix, az"
],
"home_price_min": 0,
"home_price_max": 0,
"beds": 0,
"baths": 0,
"property_type": [
"SFR"
]
}
Parameters for invitee's home search.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
buyer_cities | [string] | true | none | An array of city and states the buyer is searching for a home, the first item will be used when the user lands in home search. (ex. ["tempe, az", "phoenix, az"]) |
home_price_min | integer | false | none | none |
home_price_max | integer | false | none | none |
beds | integer | false | none | Minimum number of bedrooms |
baths | integer | false | none | Minimum number of baths |
property_type | [string] | false | none | Type of property the buyer is interested purchasing, if omitted all types are included. Can include multiple selections. |
InfoOwner
{
"sell_price": 0,
"property_address": {
"street": "string",
"unit": "string",
"city": "string",
"state": "st",
"zipcode": "string"
}
}
Details around the invitee's home.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
sell_price | integer | false | none | The desired price, if the invitee is looking to sell their home. |
property_address | object | true | none | The address of a property |
» street | string | true | none | Street address. |
» unit | string | false | none | Unit number (if applicable). |
» city | string | true | none | City |
» state | string | true | none | 2 character state abbreviation |
» zipcode | string | true | none | Zip code |
InviteInfoBuyerRequest
{
"baths": 0,
"beds": 0,
"buyer_cities": [
"string"
],
"home_price_max": 0,
"home_price_min": 0,
"property_type": [
"string"
]
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
baths | integer | false | none | none |
beds | integer | false | none | none |
buyer_cities | [string] | false | none | none |
home_price_max | integer | false | none | none |
home_price_min | integer | false | none | none |
property_type | [string] | false | none | none |
InviteInfoBuyerResponse
{
"baths": 0,
"beds": 0,
"home_price_max": 0,
"home_price_min": 0,
"place_desc": "string",
"place_id": "string",
"property_type": [
"string"
]
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
baths | integer | false | none | none |
beds | integer | false | none | none |
home_price_max | integer | false | none | none |
home_price_min | integer | false | none | none |
place_desc | string | false | none | none |
place_id | string | false | none | none |
property_type | [string] | false | none | none |
InviteInfoOwnerRequest
{
"property_address": {
"city": "string",
"state": "string",
"street": "string",
"unit": "string",
"zipcode": "string"
},
"sell_price": 0
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
property_address | Address | false | none | none |
sell_price | integer | false | none | none |
InviteInfoOwnerResponse
{
"address_id": 0,
"sell_price": 0
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
address_id | integer | false | none | none |
sell_price | integer | false | none | none |
InviteListResponse
{
"data": [
{
"accepted_date": "2019-08-24T14:15:22Z",
"agent_id": "string",
"buyer": {
"baths": 0,
"beds": 0,
"home_price_max": 0,
"home_price_min": 0,
"place_desc": "string",
"place_id": "string",
"property_type": [
"string"
]
},
"created": "2019-08-24T14:15:22Z",
"digest_email_paused": "2019-08-24T14:15:22Z",
"email": "string",
"email_approved": true,
"email_bounced": "2019-08-24T14:15:22Z",
"email_complained": "2019-08-24T14:15:22Z",
"email_enabled": true,
"email_unsubscribed": "2019-08-24T14:15:22Z",
"first_email_sent": "2019-08-24T14:15:22Z",
"first_name": "string",
"invite_id": "string",
"invite_type": "string",
"last_name": "string",
"loan_officer_lo_id": "string",
"owner": {
"address_id": 0,
"sell_price": 0
},
"owner_email_sent": "2019-08-24T14:15:22Z",
"partner_user_id": "string",
"phone": "string",
"segment_id": "string",
"updated": "2019-08-24T14:15:22Z"
}
]
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
data | [InviteResponse] | false | none | none |
InvitePatchRequest
{
"agent_id": "string",
"buyer": {
"baths": 0,
"beds": 0,
"buyer_cities": [
"string"
],
"home_price_max": 0,
"home_price_min": 0,
"property_type": [
"string"
]
},
"email": "string",
"email_approved": true,
"email_enabled": true,
"email_unsubscribed": "2019-08-24T14:15:22Z",
"first_name": "string",
"invite_type": "string",
"last_name": "string",
"loan_officer_lo_id": "string",
"owner": {
"property_address": {
"city": "string",
"state": "string",
"street": "string",
"unit": "string",
"zipcode": "string"
},
"sell_price": 0
},
"phone": "string",
"segment_id": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
agent_id | string | false | none | none |
buyer | InviteInfoBuyerRequest | false | none | none |
string | false | none | none | |
email_approved | boolean | false | none | none |
email_enabled | boolean | false | none | none |
email_unsubscribed | string(date-time) | false | none | none |
first_name | string | false | none | none |
invite_type | string | false | none | none |
last_name | string | false | none | none |
loan_officer_lo_id | string | false | none | none |
owner | InviteInfoOwnerRequest | false | none | none |
phone | string | false | none | none |
segment_id | string | false | none | none |
InviteResponse
{
"accepted_date": "2019-08-24T14:15:22Z",
"agent_id": "string",
"buyer": {
"baths": 0,
"beds": 0,
"home_price_max": 0,
"home_price_min": 0,
"place_desc": "string",
"place_id": "string",
"property_type": [
"string"
]
},
"created": "2019-08-24T14:15:22Z",
"digest_email_paused": "2019-08-24T14:15:22Z",
"email": "string",
"email_approved": true,
"email_bounced": "2019-08-24T14:15:22Z",
"email_complained": "2019-08-24T14:15:22Z",
"email_enabled": true,
"email_unsubscribed": "2019-08-24T14:15:22Z",
"first_email_sent": "2019-08-24T14:15:22Z",
"first_name": "string",
"invite_id": "string",
"invite_type": "string",
"last_name": "string",
"loan_officer_lo_id": "string",
"owner": {
"address_id": 0,
"sell_price": 0
},
"owner_email_sent": "2019-08-24T14:15:22Z",
"partner_user_id": "string",
"phone": "string",
"segment_id": "string",
"updated": "2019-08-24T14:15:22Z"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
accepted_date | string(date-time) | false | none | none |
agent_id | string | false | none | none |
buyer | InviteInfoBuyerResponse | false | none | none |
created | string(date-time) | false | none | none |
digest_email_paused | string(date-time) | false | none | none |
string | false | none | none | |
email_approved | boolean | false | none | none |
email_bounced | string(date-time) | false | none | none |
email_complained | string(date-time) | false | none | none |
email_enabled | boolean | false | none | none |
email_unsubscribed | string(date-time) | false | none | none |
first_email_sent | string(date-time) | false | none | none |
first_name | string | false | none | none |
invite_id | string | false | none | none |
invite_type | string | false | none | none |
last_name | string | false | none | none |
loan_officer_lo_id | string | false | none | none |
owner | InviteInfoOwnerResponse | false | none | none |
owner_email_sent | string(date-time) | false | none | none |
partner_user_id | string | false | none | none |
phone | string | false | none | none |
segment_id | string | false | none | none |
updated | string(date-time) | false | none | none |
InvitesPostRequest
{
"invites": [
{
"invite_type": "owner",
"partner_user_id": "string",
"email": "string",
"first_name": "string",
"last_name": "string",
"phone": "string",
"buyer": {
"buyer_cities": [
"tempe, az",
"phoenix, az"
],
"home_price_min": 0,
"home_price_max": 0,
"beds": 0,
"baths": 0,
"property_type": [
"SFR"
]
},
"owner": {
"sell_price": 0,
"property_address": {
"street": "string",
"unit": "string",
"city": "string",
"state": "st",
"zipcode": "string"
}
}
}
],
"lo_id": "string",
"agent": {
"id": "string",
"license_number": "string",
"license_state": "string"
}
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
invites | [Invite] | false | none | none |
lo_id | string | false | none | A unique identifier for a loan officer that will be associated with all invites in this request. This identifier will be used to look up a loan officer in ComeHome's list of known loan officers provided by the partner. If no matches are found, an error will be returned. |
agent | AgentRequest | false | none | none |
AgentRequest
{
"id": "string",
"license_number": "string",
"license_state": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | none | none |
license_number | string | false | none | none |
license_state | string | false | none | none |
InvitesPostResponse
{
"results": [
{
"id": "string",
"message": "string",
"success": true,
"url": "string"
}
]
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
results | [BulkCreateResult] | false | none | none |
BulkCreateResult
{
"id": "string",
"message": "string",
"success": true,
"url": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | none | none |
message | string | false | none | none |
success | boolean | false | none | none |
url | string | false | none | none |
Address
{
"city": "string",
"state": "string",
"street": "string",
"unit": "string",
"zipcode": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
city | string | false | none | none |
state | string | false | none | none |
street | string | false | none | none |
unit | string | false | none | none |
zipcode | string | false | none | none |
TokenRequest
{
"grantType": "string",
"clientId": "string",
"clientSecret": "string"
}
This object describes the request to the token endpoint when using application/json instead of application/x-www-form-urlencoded.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
grantType | string | true | none | Specifies the grant type/flow. Currently only client_credentials is supported. |
clientId | string | true | none | The client identifier, this is most likely your Partner identifier issued by ComeHome |
clientSecret | string | true | none | The shared secret key issued to you by ComeHome |
Token
{
"access_token": "string",
"token": "string",
"ttl": 0,
"expires_in": 0,
"type": "string"
}
This object describes an access token issued by ComeHome
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
access_token | string | false | none | The JWT access token. |
token | string | false | none | The JWT access token. |
ttl | integer | false | none | The access token time-to-live (in seconds). |
expires_in | integer | false | none | The access token time-to-live (in seconds). |
type | string | false | none | The type of access token issued (currently only Bearer tokens are supported). |
BPO
{
"addressInfo": {
"address": "string",
"addressFull": "string",
"blockId": "string",
"blockgroupId": "string",
"city": "string",
"county": "string",
"countyFips": "string",
"geoPrecision": "string",
"lat": 0,
"lng": 0,
"metrodiv": "string",
"msa": "string",
"slug": "string",
"state": "string",
"unit": "string",
"zipcode": "string",
"zipcodePlus4": "string"
},
"assessment": {
"apn": "string",
"assessmentYear": 0,
"taxAmount": 0,
"taxYear": 0,
"totalAssessedValue": 0
},
"ltvDetails": {
"asOfMonth": "string",
"currentLiens": [
{
"armChangeDate": "string",
"armIndex": "string",
"dueDate": "string",
"grantee1": "string",
"grantee1Forenames": "string",
"grantee2": "string",
"grantee2Forenames": "string",
"grantor1": "string",
"grantor2": "string",
"heloc": true,
"interestRate": 0,
"isArm": true,
"lenderType": "string",
"lienAmount": 0,
"lienLengthMonths": 0,
"lienMonthsCompletedAsOfDate": 0,
"lienType": "string",
"monthlyPayment": 0,
"noticeIds": [
{}
],
"outstandingPrincipal": 0,
"principalPaidAsOfDate": 0,
"recordDate": "string",
"standAloneRefi": true
}
],
"fsd": 0,
"inDefault": true,
"lastDefaultDate": "2019-08-24T14:15:22Z",
"ltvLwr": 0,
"ltvMean": 0,
"ltvUpr": 0,
"propertyValueLwr": 0,
"propertyValueMean": 0,
"propertyValueUpr": 0,
"totalEquityLwr": 0,
"totalEquityMean": 0,
"totalEquityUpr": 0,
"totalLien": 0,
"totalMonthlyPayments": 0,
"totalNoticeIds": [
{}
]
},
"marketConditions": {
"details": {
"historical": {
"cagr10Years": 0,
"cagr1Year": 0,
"cagr20Years": 0,
"cagr5Years": 0,
"returns10Years": 0,
"returns1Year": 0,
"returns20Years": 0,
"returns5Years": 0
},
"multiFamily": {
"daysOnMarketMedian": 0,
"estimatedSalesTotal": 0,
"inventoryTotal": 0,
"marketActionMedian": 0,
"monthsOfInventoryMedian": 0,
"priceMedian": 0
},
"singleFamily": {
"daysOnMarketMedian": 0,
"estimatedSalesTotal": 0,
"inventoryTotal": 0,
"marketActionMedian": 0,
"monthsOfInventoryMedian": 0,
"priceMedian": 0
}
},
"marketGrade": "string"
},
"ownerOccupied": {
"ownerOccupied": true
},
"property": {
"airConditioning": "string",
"attic": true,
"basement": "string",
"buildingAreaSqFt": 0,
"buildingConditionScore": 0,
"buildingQualityScore": 0,
"constructionType": "string",
"disclaimer": "string",
"exteriorWalls": "string",
"fireplace": true,
"fullBathCount": 0,
"garageParkingOfCars": 0,
"garageTypeParking": "string",
"heating": "string",
"heatingFuelType": "string",
"hoaAmount": 0,
"hoaFrequency": "string",
"noOfBuildings": 0,
"noOfStories": 0,
"numberOfBedrooms": 0,
"numberOfUnits": 0,
"partialBathCount": 0,
"photo1": "string",
"photo2": "string",
"photo3": "string",
"pool": true,
"propertyDesc": "string",
"propertyType": "string",
"roofCover": "string",
"roofType": "string",
"sewer": "string",
"siteAreaAcres": 0,
"style": "string",
"subdivision": "string",
"totalBathCount": 0,
"totalNumberOfRooms": 0,
"water": "string",
"yearBuilt": 0,
"zoning": "string"
},
"salesHistory": [
{
"amount": 0,
"apn": "string",
"eventType": "string",
"fips": "string",
"grantee1": "string",
"grantee1Forenames": "string",
"grantee2": "string",
"grantee2Forenames": "string",
"grantor1": "string",
"grantor1Forenames": "string",
"grantor2": "string",
"grantor2Forenames": "string",
"recordBook": "string",
"recordDate": "string",
"recordDoc": "string",
"recordPage": "string"
}
],
"value": {
"fsd": 0,
"priceLower": 0,
"priceMean": 0,
"priceUpper": 0
},
"listDate": "string",
"listPrice": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
addressInfo | AddressInfo | false | none | none |
assessment | Assessment | false | none | none |
ltvDetails | LtvDetails | false | none | none |
marketConditions | MarketConditions | false | none | none |
ownerOccupied | OwnerOccupied | false | none | none |
property | Property | false | none | none |
salesHistory | [SalesHistory] | false | none | none |
value | Avm | false | none | none |
listDate | string | false | none | Date the property was listed for sale. Format: YYYY-MM-DD |
listPrice | string | false | none | Price for the property listing. |
SalesHistory
{
"amount": 0,
"apn": "string",
"eventType": "string",
"fips": "string",
"grantee1": "string",
"grantee1Forenames": "string",
"grantee2": "string",
"grantee2Forenames": "string",
"grantor1": "string",
"grantor1Forenames": "string",
"grantor2": "string",
"grantor2Forenames": "string",
"recordBook": "string",
"recordDate": "string",
"recordDoc": "string",
"recordPage": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
amount | integer | false | none | none |
apn | string | false | none | none |
eventType | string | false | none | none |
fips | string | false | none | none |
grantee1 | string | false | none | none |
grantee1Forenames | string | false | none | none |
grantee2 | string | false | none | none |
grantee2Forenames | string | false | none | none |
grantor1 | string | false | none | none |
grantor1Forenames | string | false | none | none |
grantor2 | string | false | none | none |
grantor2Forenames | string | false | none | none |
recordBook | string | false | none | none |
recordDate | string | false | none | none |
recordDoc | string | false | none | none |
recordPage | string | false | none | none |
Property
{
"airConditioning": "string",
"attic": true,
"basement": "string",
"buildingAreaSqFt": 0,
"buildingConditionScore": 0,
"buildingQualityScore": 0,
"constructionType": "string",
"disclaimer": "string",
"exteriorWalls": "string",
"fireplace": true,
"fullBathCount": 0,
"garageParkingOfCars": 0,
"garageTypeParking": "string",
"heating": "string",
"heatingFuelType": "string",
"hoaAmount": 0,
"hoaFrequency": "string",
"noOfBuildings": 0,
"noOfStories": 0,
"numberOfBedrooms": 0,
"numberOfUnits": 0,
"partialBathCount": 0,
"photo1": "string",
"photo2": "string",
"photo3": "string",
"pool": true,
"propertyDesc": "string",
"propertyType": "string",
"roofCover": "string",
"roofType": "string",
"sewer": "string",
"siteAreaAcres": 0,
"style": "string",
"subdivision": "string",
"totalBathCount": 0,
"totalNumberOfRooms": 0,
"water": "string",
"yearBuilt": 0,
"zoning": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
airConditioning | string | false | none | none |
attic | boolean | false | none | none |
basement | string | false | none | none |
buildingAreaSqFt | integer | false | none | none |
buildingConditionScore | integer | false | none | none |
buildingQualityScore | integer | false | none | none |
constructionType | string | false | none | none |
disclaimer | string | false | none | none |
exteriorWalls | string | false | none | none |
fireplace | boolean | false | none | none |
fullBathCount | integer | false | none | none |
garageParkingOfCars | integer | false | none | none |
garageTypeParking | string | false | none | none |
heating | string | false | none | none |
heatingFuelType | string | false | none | none |
hoaAmount | integer | false | none | none |
hoaFrequency | string | false | none | none |
noOfBuildings | integer | false | none | none |
noOfStories | integer | false | none | none |
numberOfBedrooms | integer | false | none | none |
numberOfUnits | integer | false | none | none |
partialBathCount | integer | false | none | none |
photo1 | string | false | none | none |
photo2 | string | false | none | none |
photo3 | string | false | none | none |
pool | boolean | false | none | none |
propertyDesc | string | false | none | none |
propertyType | string | false | none | none |
roofCover | string | false | none | none |
roofType | string | false | none | none |
sewer | string | false | none | none |
siteAreaAcres | number | false | none | none |
style | string | false | none | none |
subdivision | string | false | none | none |
totalBathCount | number | false | none | none |
totalNumberOfRooms | integer | false | none | none |
water | string | false | none | none |
yearBuilt | integer | false | none | none |
zoning | string | false | none | none |
OwnerOccupied
{
"ownerOccupied": true
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
ownerOccupied | boolean | false | none | none |
LOCreateRequest
{
"active": true,
"address_line1": "string",
"address_line2": "string",
"branch_nmls": "string",
"city": "string",
"cost_center": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"last_name": "string",
"lo_id": "string",
"nmls_id": "string",
"oh_mlo": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"website": "string",
"zipcode": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
active | boolean | false | none | none |
address_line1 | string | false | none | none |
address_line2 | string | false | none | none |
branch_nmls | string | false | none | none |
city | string | false | none | none |
cost_center | string | false | none | none |
string | false | none | none | |
first_name | string | false | none | none |
headshot | string | false | none | none |
last_name | string | false | none | none |
lo_id | string | false | none | none |
nmls_id | string | false | none | none |
oh_mlo | string | false | none | none |
phone | string | false | none | none |
service_area_zips | [string] | false | none | none |
state | string | false | none | none |
website | string | false | none | none |
zipcode | string | false | none | none |
LOUpdateRequest
{
"active": true,
"address_line1": "string",
"address_line2": "string",
"branch_nmls": "string",
"city": "string",
"cost_center": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"last_name": "string",
"lo_id": "string",
"nmls_id": "string",
"oh_mlo": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"website": "string",
"zipcode": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
active | boolean | false | none | none |
address_line1 | string | false | none | none |
address_line2 | string | false | none | none |
branch_nmls | string | false | none | none |
city | string | false | none | none |
cost_center | string | false | none | none |
string | false | none | none | |
first_name | string | false | none | none |
headshot | string | false | none | none |
last_name | string | false | none | none |
lo_id | string | false | none | none |
nmls_id | string | false | none | none |
oh_mlo | string | false | none | none |
phone | string | false | none | none |
service_area_zips | [string] | false | none | none |
state | string | false | none | none |
website | string | false | none | none |
zipcode | string | false | none | none |
LoListResponse
{
"data": [
{
"cursor": "string",
"item": {
"active": true,
"address_line1": "string",
"address_line2": "string",
"branch_nmls": "string",
"city": "string",
"cost_center": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"id": "string",
"last_name": "string",
"lo_id": "string",
"nmls_id": "string",
"oh_mlo": "string",
"partner_id": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"website": "string",
"zipcode": "string"
}
}
]
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
data | [LoanOfficerWithCursor] | false | none | none |
LoanOfficerWithCursor
{
"cursor": "string",
"item": {
"active": true,
"address_line1": "string",
"address_line2": "string",
"branch_nmls": "string",
"city": "string",
"cost_center": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"id": "string",
"last_name": "string",
"lo_id": "string",
"nmls_id": "string",
"oh_mlo": "string",
"partner_id": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"website": "string",
"zipcode": "string"
}
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
cursor | string | false | none | none |
item | LoanOfficer | false | none | none |
LoanOfficer
{
"active": true,
"address_line1": "string",
"address_line2": "string",
"branch_nmls": "string",
"city": "string",
"cost_center": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"id": "string",
"last_name": "string",
"lo_id": "string",
"nmls_id": "string",
"oh_mlo": "string",
"partner_id": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"website": "string",
"zipcode": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
active | boolean | false | none | none |
address_line1 | string | false | none | none |
address_line2 | string | false | none | none |
branch_nmls | string | false | none | none |
city | string | false | none | none |
cost_center | string | false | none | none |
string | false | none | none | |
first_name | string | false | none | none |
headshot | string | false | none | none |
id | string | false | none | none |
last_name | string | false | none | none |
lo_id | string | false | none | none |
nmls_id | string | false | none | none |
oh_mlo | string | false | none | none |
partner_id | string | false | none | none |
phone | string | false | none | none |
service_area_zips | [string] | false | none | none |
state | string | false | none | none |
website | string | false | none | none |
zipcode | string | false | none | none |
SavedHomeResponse
{
"city": "string",
"created": "2019-08-24T14:15:22Z",
"slug": "string",
"state": "string",
"street": "string",
"unit": "string",
"updated": "2019-08-24T14:15:22Z",
"zipcode": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
city | string | false | none | none |
created | string(date-time) | false | none | none |
slug | string | false | none | none |
state | string | false | none | none |
street | string | false | none | none |
unit | string | false | none | none |
updated | string(date-time) | false | none | none |
zipcode | string | false | none | none |
AgentLookupListResponse
{
"data": [
{
"cursor": "string",
"item": {
"address_line1": "string",
"address_line2": "string",
"brokerage_email": "string",
"brokerage_license_number": "string",
"brokerage_name": "string",
"brokerage_phone": "string",
"city": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"id": "string",
"last_name": "string",
"license_held": "string",
"license_number": "string",
"license_state": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"zipcode": "string"
}
}
]
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
data | [AgentLookupWithCursor] | false | none | none |
AgentLookupWithCursor
{
"cursor": "string",
"item": {
"address_line1": "string",
"address_line2": "string",
"brokerage_email": "string",
"brokerage_license_number": "string",
"brokerage_name": "string",
"brokerage_phone": "string",
"city": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"id": "string",
"last_name": "string",
"license_held": "string",
"license_number": "string",
"license_state": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"zipcode": "string"
}
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
cursor | string | false | none | none |
item | AgentLookup | false | none | none |
AgentLookup
{
"address_line1": "string",
"address_line2": "string",
"brokerage_email": "string",
"brokerage_license_number": "string",
"brokerage_name": "string",
"brokerage_phone": "string",
"city": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"id": "string",
"last_name": "string",
"license_held": "string",
"license_number": "string",
"license_state": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"zipcode": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
address_line1 | string | false | none | none |
address_line2 | string | false | none | none |
brokerage_email | string | false | none | none |
brokerage_license_number | string | false | none | none |
brokerage_name | string | false | none | none |
brokerage_phone | string | false | none | none |
city | string | false | none | none |
string | false | none | none | |
first_name | string | false | none | none |
headshot | string | false | none | none |
id | string | false | none | none |
last_name | string | false | none | none |
license_held | string | false | none | none |
license_number | string | false | none | none |
license_state | string | false | none | none |
phone | string | false | none | none |
service_area_zips | [string] | false | none | none |
state | string | false | none | none |
zipcode | string | false | none | none |
AgentCreateRequest
{
"address_line1": "string",
"address_line2": "string",
"brokerage_email": "string",
"brokerage_license_number": "string",
"brokerage_name": "string",
"brokerage_phone": "string",
"city": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"last_name": "string",
"license_held": "string",
"license_number": "string",
"license_state": "string",
"lo_id": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"zipcode": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
address_line1 | string | false | none | none |
address_line2 | string | false | none | none |
brokerage_email | string | false | none | none |
brokerage_license_number | string | false | none | none |
brokerage_name | string | false | none | none |
brokerage_phone | string | false | none | none |
city | string | false | none | none |
string | false | none | none | |
first_name | string | false | none | none |
headshot | string | false | none | none |
last_name | string | false | none | none |
license_held | string | false | none | none |
license_number | string | false | none | none |
license_state | string | false | none | none |
lo_id | string | false | none | lo_id is the identifier to associate an agent with a loan officer. The loan officer must be created first via the LO endpoint. LoanOfficer |
phone | string | false | none | none |
service_area_zips | [string] | false | none | none |
state | string | false | none | none |
zipcode | string | false | none | none |
AgentCreateResponse
{
"id": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | none | none |
AgentUpdateRequest
{
"address_line1": "string",
"address_line2": "string",
"brokerage_email": "string",
"brokerage_license_number": "string",
"brokerage_name": "string",
"brokerage_phone": "string",
"city": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"last_name": "string",
"license_held": "string",
"license_number": "string",
"license_state": "string",
"lo_id": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"zipcode": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
address_line1 | string | false | none | none |
address_line2 | string | false | none | none |
brokerage_email | string | false | none | none |
brokerage_license_number | string | false | none | none |
brokerage_name | string | false | none | none |
brokerage_phone | string | false | none | none |
city | string | false | none | none |
string | false | none | none | |
first_name | string | false | none | none |
headshot | string | false | none | none |
last_name | string | false | none | none |
license_held | string | false | none | none |
license_number | string | false | none | none |
license_state | string | false | none | none |
lo_id | string | false | none | lo_id is the identifier to associate an agent with a loan officer. The loan officer must be created first via the LO endpoint. LoanOfficer |
phone | string | false | none | none |
service_area_zips | [string] | false | none | none |
state | string | false | none | none |
zipcode | string | false | none | none |
AgentUpdateResponse
{
"address_line1": "string",
"address_line2": "string",
"brokerage_email": "string",
"brokerage_license_number": "string",
"brokerage_name": "string",
"brokerage_phone": "string",
"city": "string",
"email": "string",
"first_name": "string",
"headshot": "string",
"id": "string",
"last_name": "string",
"license_held": "string",
"license_number": "string",
"license_state": "string",
"lo_id": "string",
"phone": "string",
"service_area_zips": [
"string"
],
"state": "string",
"zipcode": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
address_line1 | string | false | none | none |
address_line2 | string | false | none | none |
brokerage_email | string | false | none | none |
brokerage_license_number | string | false | none | none |
brokerage_name | string | false | none | none |
brokerage_phone | string | false | none | none |
city | string | false | none | none |
string | false | none | none | |
first_name | string | false | none | none |
headshot | string | false | none | none |
id | string | false | none | none |
last_name | string | false | none | none |
license_held | string | false | none | none |
license_number | string | false | none | none |
license_state | string | false | none | none |
lo_id | string | false | none | none |
phone | string | false | none | none |
service_area_zips | [string] | false | none | none |
state | string | false | none | none |
zipcode | string | false | none | none |
MarketConditions
{
"details": {
"historical": {
"cagr10Years": 0,
"cagr1Year": 0,
"cagr20Years": 0,
"cagr5Years": 0,
"returns10Years": 0,
"returns1Year": 0,
"returns20Years": 0,
"returns5Years": 0
},
"multiFamily": {
"daysOnMarketMedian": 0,
"estimatedSalesTotal": 0,
"inventoryTotal": 0,
"marketActionMedian": 0,
"monthsOfInventoryMedian": 0,
"priceMedian": 0
},
"singleFamily": {
"daysOnMarketMedian": 0,
"estimatedSalesTotal": 0,
"inventoryTotal": 0,
"marketActionMedian": 0,
"monthsOfInventoryMedian": 0,
"priceMedian": 0
}
},
"marketGrade": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
details | ZipDetails | false | none | none |
marketGrade | string | false | none | none |
ZipDetails
{
"historical": {
"cagr10Years": 0,
"cagr1Year": 0,
"cagr20Years": 0,
"cagr5Years": 0,
"returns10Years": 0,
"returns1Year": 0,
"returns20Years": 0,
"returns5Years": 0
},
"multiFamily": {
"daysOnMarketMedian": 0,
"estimatedSalesTotal": 0,
"inventoryTotal": 0,
"marketActionMedian": 0,
"monthsOfInventoryMedian": 0,
"priceMedian": 0
},
"singleFamily": {
"daysOnMarketMedian": 0,
"estimatedSalesTotal": 0,
"inventoryTotal": 0,
"marketActionMedian": 0,
"monthsOfInventoryMedian": 0,
"priceMedian": 0
}
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
historical | Historical | false | none | none |
multiFamily | FamilyInfo | false | none | none |
singleFamily | FamilyInfo | false | none | none |
Historical
{
"cagr10Years": 0,
"cagr1Year": 0,
"cagr20Years": 0,
"cagr5Years": 0,
"returns10Years": 0,
"returns1Year": 0,
"returns20Years": 0,
"returns5Years": 0
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
cagr10Years | number | false | none | none |
cagr1Year | number | false | none | none |
cagr20Years | number | false | none | none |
cagr5Years | number | false | none | none |
returns10Years | number | false | none | none |
returns1Year | number | false | none | none |
returns20Years | number | false | none | none |
returns5Years | number | false | none | none |
FamilyInfo
{
"daysOnMarketMedian": 0,
"estimatedSalesTotal": 0,
"inventoryTotal": 0,
"marketActionMedian": 0,
"monthsOfInventoryMedian": 0,
"priceMedian": 0
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
daysOnMarketMedian | number | false | none | none |
estimatedSalesTotal | number | false | none | none |
inventoryTotal | number | false | none | none |
marketActionMedian | number | false | none | none |
monthsOfInventoryMedian | number | false | none | none |
priceMedian | number | false | none | none |
AddressInfo
{
"address": "string",
"addressFull": "string",
"blockId": "string",
"blockgroupId": "string",
"city": "string",
"county": "string",
"countyFips": "string",
"geoPrecision": "string",
"lat": 0,
"lng": 0,
"metrodiv": "string",
"msa": "string",
"slug": "string",
"state": "string",
"unit": "string",
"zipcode": "string",
"zipcodePlus4": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
address | string | false | none | none |
addressFull | string | false | none | none |
blockId | string | false | none | none |
blockgroupId | string | false | none | none |
city | string | false | none | none |
county | string | false | none | none |
countyFips | string | false | none | none |
geoPrecision | string | false | none | none |
lat | number | false | none | none |
lng | number | false | none | none |
metrodiv | string | false | none | none |
msa | string | false | none | none |
slug | string | false | none | none |
state | string | false | none | none |
unit | string | false | none | none |
zipcode | string | false | none | none |
zipcodePlus4 | string | false | none | none |
Assessment
{
"apn": "string",
"assessmentYear": 0,
"taxAmount": 0,
"taxYear": 0,
"totalAssessedValue": 0
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
apn | string | false | none | none |
assessmentYear | integer | false | none | none |
taxAmount | number | false | none | none |
taxYear | integer | false | none | none |
totalAssessedValue | integer | false | none | none |
Avm
{
"fsd": 0,
"priceLower": 0,
"priceMean": 0,
"priceUpper": 0
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
fsd | number | false | none | none |
priceLower | integer | false | none | none |
priceMean | integer | false | none | none |
priceUpper | integer | false | none | none |
LtvDetails
{
"asOfMonth": "string",
"currentLiens": [
{
"armChangeDate": "string",
"armIndex": "string",
"dueDate": "string",
"grantee1": "string",
"grantee1Forenames": "string",
"grantee2": "string",
"grantee2Forenames": "string",
"grantor1": "string",
"grantor2": "string",
"heloc": true,
"interestRate": 0,
"isArm": true,
"lenderType": "string",
"lienAmount": 0,
"lienLengthMonths": 0,
"lienMonthsCompletedAsOfDate": 0,
"lienType": "string",
"monthlyPayment": 0,
"noticeIds": [
{}
],
"outstandingPrincipal": 0,
"principalPaidAsOfDate": 0,
"recordDate": "string",
"standAloneRefi": true
}
],
"fsd": 0,
"inDefault": true,
"lastDefaultDate": "2019-08-24T14:15:22Z",
"ltvLwr": 0,
"ltvMean": 0,
"ltvUpr": 0,
"propertyValueLwr": 0,
"propertyValueMean": 0,
"propertyValueUpr": 0,
"totalEquityLwr": 0,
"totalEquityMean": 0,
"totalEquityUpr": 0,
"totalLien": 0,
"totalMonthlyPayments": 0,
"totalNoticeIds": [
{}
]
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
asOfMonth | string | false | none | none |
currentLiens | [CurrentLien] | false | none | none |
fsd | number | false | none | none |
inDefault | boolean | false | none | none |
lastDefaultDate | string(date-time) | false | none | none |
ltvLwr | number | false | none | none |
ltvMean | number | false | none | none |
ltvUpr | number | false | none | none |
propertyValueLwr | integer | false | none | none |
propertyValueMean | integer | false | none | none |
propertyValueUpr | integer | false | none | none |
totalEquityLwr | integer | false | none | none |
totalEquityMean | integer | false | none | none |
totalEquityUpr | integer | false | none | none |
totalLien | integer | false | none | none |
totalMonthlyPayments | integer | false | none | none |
totalNoticeIds | [nillabletypes_String] | false | none | none |
CurrentLien
{
"armChangeDate": "string",
"armIndex": "string",
"dueDate": "string",
"grantee1": "string",
"grantee1Forenames": "string",
"grantee2": "string",
"grantee2Forenames": "string",
"grantor1": "string",
"grantor2": "string",
"heloc": true,
"interestRate": 0,
"isArm": true,
"lenderType": "string",
"lienAmount": 0,
"lienLengthMonths": 0,
"lienMonthsCompletedAsOfDate": 0,
"lienType": "string",
"monthlyPayment": 0,
"noticeIds": [
{}
],
"outstandingPrincipal": 0,
"principalPaidAsOfDate": 0,
"recordDate": "string",
"standAloneRefi": true
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
armChangeDate | string | false | none | none |
armIndex | string | false | none | none |
dueDate | string | false | none | none |
grantee1 | string | false | none | none |
grantee1Forenames | string | false | none | none |
grantee2 | string | false | none | none |
grantee2Forenames | string | false | none | none |
grantor1 | string | false | none | none |
grantor2 | string | false | none | none |
heloc | boolean | false | none | none |
interestRate | number | false | none | none |
isArm | boolean | false | none | none |
lenderType | string | false | none | none |
lienAmount | integer | false | none | none |
lienLengthMonths | integer | false | none | none |
lienMonthsCompletedAsOfDate | integer | false | none | none |
lienType | string | false | none | none |
monthlyPayment | integer | false | none | none |
noticeIds | [nillabletypes_String] | false | none | none |
outstandingPrincipal | integer | false | none | none |
principalPaidAsOfDate | integer | false | none | none |
recordDate | string | false | none | none |
standAloneRefi | boolean | false | none | none |
nillabletypes_String
{}
Properties
None
Listing
{
"propertyReference": {
"streetAddress": "string",
"unitNumber": "string",
"city": "string",
"state": "string",
"zipcode": "string"
},
"status": "ACTIVE",
"listPrice": 0,
"county": "string",
"yearBuilt": 0,
"propertyType": "condo",
"listDate": "string"
}
A Property Reference's listing
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
propertyReference | PropertyReference | false | none | Information about a property. |
status | string | false | none | The status of the listing |
listPrice | integer | false | none | The property reference listing price. |
county | string | false | none | The county associated with the property, if one can be resolved. |
yearBuilt | number | false | none | The year the property in question was built. |
propertyType | string | false | none | The type of property. |
listDate | string | false | none | Date the property was listed for sale. Format: YYYY-MM-DD |
Enumerated Values
Property | Value |
---|---|
status | ACTIVE |
status | PENDING |
status | CONTINGENT |
status | OFF_MARKET |
status | SOLD |
propertyType | condo |
propertyType | manufactured |
propertyType | other |
propertyType | commercial |
propertyType | coop |
propertyType | single_family_detached |
propertyType | single_family_attached |
propertyType | vacant_lot |
propertyType | multi_family |
propertyType | timeshare |
PropertyReference
{
"streetAddress": "string",
"unitNumber": "string",
"city": "string",
"state": "string",
"zipcode": "string"
}
Information about a property.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
streetAddress | string | false | none | The street address of the property being viewed. This may be absent for listings that have a hidden address. |
unitNumber | string | false | none | The unit number of the property being viewed. This may be absent for listings that have a hidden address or do not have a unit number. |
city | string | false | none | The address city of the property being viewed. This may be absent for listings that have a hidden address. |
state | string | false | none | The address state of the property being viewed. This may be absent for listings that have a hidden address. |
zipcode | string | false | none | The address zip code of the property being viewed. This may be absent for listings that have a hidden address. |
Equity
{
"PartnerUserID": "string",
"CurrentBalance": 0,
"CurrentBalanceAsOfDate": "string",
"InterestRate": 0,
"OriginalLoanAmount": 0,
"OriginationDate": "string",
"MonthlyPaymentDueDate": "string",
"MonthlyPaymentPI": 0,
"MonthlyPaymentTI": 0,
"LenderDataTag": "string",
"LoanTerms": "string",
"SecondMortgageCurrentBalance": 0,
"SecondMortgageCurrentBalanceAsOfDate": "string",
"SecondMortgageInterestRate": 0,
"SecondMortgageLoanTerms": "string",
"SecondMortgageOriginationDate": "string",
"SecondMortgageOriginalLoanAmount": 0,
"SecondMortgageMonthlyPaymentDueDate": "string",
"SecondMortgageMonthlyPaymentPI": 0,
"SecondMortgageMonthlyPaymentTI": 0,
"StreetAddress": "string",
"Unit": "string",
"City": "string",
"State": "string",
"Zip": "string"
}
A single Equity object.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
PartnerUserID | string | true | none | The user ID as represented in the Partner's system. |
CurrentBalance | number | true | none | The current balance of the user's first mortgage. |
CurrentBalanceAsOfDate | string | true | none | The date corresponding to the current balance of the user's first mortgage, in YYYY-MM-DD format. |
InterestRate | number | true | none | The interest rate of the user's first loan. |
OriginalLoanAmount | number | true | none | The original amount the user was loaned. |
OriginationDate | string | true | none | The date the user's first mortgage was created, in YYYY-MM-DD format. |
MonthlyPaymentDueDate | string | true | none | The date the user's current loan payment is due, in YYYY-MM-DD format. |
MonthlyPaymentPI | number | true | none | The combined principal and interest the user owes for this payment of their first loan. |
MonthlyPaymentTI | number | true | none | The combined taxes and insurance the user owes for this payment of their first loan. |
LenderDataTag | string | false | none | Any additional data the lender wants to associate with this Equity. |
LoanTerms | string | false | none | Clients should use one of the following encoded values (below) that correspond to specific loan products: m-1JbOVo7dSremUQDbywBnpjQezhc (30 Year Fixed) m-1JbOVkqliLvyUeXRqdjDl8xlpII (20 Year Fixed) m-1JbOVja0zXchJtxu8WnSzILKGyC (15 Year Fixed) m-1JbOVk2IGN15CHv35efSp65oaYY (10 Year Fixed) m-1Rf4zK7SyZQ5uNeiFE4sGngMR3E (5/1 ARM) m-1Rf4zLWGGnUw80ZGbMVkImnecIM (7/1 ARM) |
SecondMortgageCurrentBalance | number | false | none | The current balance of the user's second mortgage. |
SecondMortgageCurrentBalanceAsOfDate | string | false | none | The date corresponding to the current balance of the user's second mortgage, in YYYY-MM-DD format. |
SecondMortgageInterestRate | number | false | none | The interest rate of the user's second mortgage. |
SecondMortgageLoanTerms | string | false | none | The number of years present on the loan, as well as whether the loan is a fixed or floating rate. |
SecondMortgageOriginationDate | string | false | none | The date the user's second mortgage was created, in YYYY-MM-DD format. |
SecondMortgageOriginalLoanAmount | number | false | none | The original amount of the user's second loan. |
SecondMortgageMonthlyPaymentDueDate | string | false | none | The date the user's current second mortgage loan payment is due, in YYYY-MM-DD format. |
SecondMortgageMonthlyPaymentPI | number | false | none | The combined principal and interest the user owes for this payment of their second loan. |
SecondMortgageMonthlyPaymentTI | number | false | none | The combined taxes and insurance the user owes for this payment of their second loan. |
StreetAddress | string | true | none | The street address of the property for which this user has taken out their loan(s). |
Unit | string | false | none | The unit number of the property for which this user has taken out their loan(s). Valid only if the user's property is one unit of a multi-unit building, such as a condo. Optional. |
City | string | true | none | The city the user's property is located in. |
State | string | true | none | The state the user's property is located in. |
Zip | string | true | none | The zip code the user's property is located in. |
CTAListResponse
{
"hic": {
"desktop": {
"cta_id": "string",
"cta_url": "string",
"lo_specific_url": "string",
"image_alt_text": "string",
"image_url": "string",
"tracking_id": "string"
},
"mobile": {
"cta_id": "string",
"cta_url": "string",
"lo_specific_url": "string",
"image_alt_text": "string",
"image_url": "string",
"tracking_id": "string"
},
"tablet": {
"cta_id": "string",
"cta_url": "string",
"lo_specific_url": "string",
"image_alt_text": "string",
"image_url": "string",
"tracking_id": "string"
}
},
"ho": {
"desktop": {
"cta_id": "string",
"cta_url": "string",
"lo_specific_url": "string",
"image_alt_text": "string",
"image_url": "string",
"tracking_id": "string"
},
"mobile": {
"cta_id": "string",
"cta_url": "string",
"lo_specific_url": "string",
"image_alt_text": "string",
"image_url": "string",
"tracking_id": "string"
},
"tablet": {
"cta_id": "string",
"cta_url": "string",
"lo_specific_url": "string",
"image_alt_text": "string",
"image_url": "string",
"tracking_id": "string"
}
},
"pdp": {
"desktop": {
"cta_id": "string",
"cta_url": "string",
"lo_specific_url": "string",
"image_alt_text": "string",
"image_url": "string",
"tracking_id": "string"
},
"mobile": {
"cta_id": "string",
"cta_url": "string",
"lo_specific_url": "string",
"image_alt_text": "string",
"image_url": "string",
"tracking_id": "string"
},
"tablet": {
"cta_id": "string",
"cta_url": "string",
"lo_specific_url": "string",
"image_alt_text": "string",
"image_url": "string",
"tracking_id": "string"
}
},
"srp": {
"desktop": {
"cta_id": "string",
"cta_url": "string",
"lo_specific_url": "string",
"image_alt_text": "string",
"image_url": "string",
"tracking_id": "string"
},
"mobile": {
"cta_id": "string",
"cta_url": "string",
"lo_specific_url": "string",
"image_alt_text": "string",
"image_url": "string",
"tracking_id": "string"
},
"tablet": {
"cta_id": "string",
"cta_url": "string",
"lo_specific_url": "string",
"image_alt_text": "string",
"image_url": "string",
"tracking_id": "string"
}
}
}
Contains available custom CTAs for various pages and device-types
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
hic | CTADeviceSet | false | none | CTA data for various desktop, mobile, and tablet device-types |
ho | CTADeviceSet | false | none | CTA data for various desktop, mobile, and tablet device-types |
pdp | CTADeviceSet | false | none | CTA data for various desktop, mobile, and tablet device-types |
srp | CTADeviceSet | false | none | CTA data for various desktop, mobile, and tablet device-types |
CTADeviceSet
{
"desktop": {
"cta_id": "string",
"cta_url": "string",
"lo_specific_url": "string",
"image_alt_text": "string",
"image_url": "string",
"tracking_id": "string"
},
"mobile": {
"cta_id": "string",
"cta_url": "string",
"lo_specific_url": "string",
"image_alt_text": "string",
"image_url": "string",
"tracking_id": "string"
},
"tablet": {
"cta_id": "string",
"cta_url": "string",
"lo_specific_url": "string",
"image_alt_text": "string",
"image_url": "string",
"tracking_id": "string"
}
}
CTA data for various desktop, mobile, and tablet device-types
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
desktop | CTAItem | false | none | Data for a single CTA |
mobile | CTAItem | false | none | Data for a single CTA |
tablet | CTAItem | false | none | Data for a single CTA |
CTAItem
{
"cta_id": "string",
"cta_url": "string",
"lo_specific_url": "string",
"image_alt_text": "string",
"image_url": "string",
"tracking_id": "string"
}
Data for a single CTA
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
cta_id | string | false | none | A ComeHome-assigned UUID for the CTA |
cta_url | string | false | none | The URL to which users will be taken after clicking on the CTA. Optionally, you can use “tel:5555555555” for this field to initiate a phone call when a user clicks on the image CTA. |
lo_specific_url | string | false | none | The URL structure to be used to send users that are matched with a loan officer to a unique URL for that associated loan officer. The structure must include a query parameter with the following: #loid# Example URL: https://www.test.com/loan-officers?lo=#loid# |
image_alt_text | string | false | none | The alt-text that will be used for the CTA image |
image_url | string | false | none | The URL of the primary image asset for the CTA |
tracking_id | string | false | none | A unique ID that will be included in relevant analytics data for click-tracking purposes |
CTACreateRequest
{
"cta_url": "string",
"lo_specific_url": "string",
"device": "string",
"image_alt_text": "string",
"image_url": "string",
"page": "string",
"tracking_id": "string",
"native_app_nav_key": "string"
}
An object containing CTA for a specific page and device-type combination
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
cta_url | string | true | none | The URL to which users will be taken after clicking on the CTA. Optionally, you can use “tel:5555555555” for this field to initiate a phone call when a user clicks on the image CTA. |
lo_specific_url | string | false | none | The URL structure to be used to send users that are matched with a loan officer to a unique URL for that associated loan officer. The structure must include a query parameter with the following: #loid# Example URL: https://www.test.com/loan-officers?lo=#loid# |
device | string | true | none | The device-type on which the CTA will be displayed |
image_alt_text | string | true | none | The alt-text that will be used for the CTA image |
image_url | string | true | none | The URL of the primary image asset for the CTA |
page | string | true | none | The ComeHome page on which the CTA will be displayed (property_details , property_search , homeowner , home_improvement_calculator ) |
tracking_id | string | true | none | A unique ID that will be included in relevant analytics data for click-tracking purposes |
native_app_nav_key | string | false | none | A unique identifier that will be passed from ComeHome to a partner's native application through a Javascript bridge when the CTA is clicked within a native app integrated ComeHome experience. The native app must respond to the Javascript bridge event and use this value to determine where to navigate the user within the native app. |
CTAUpdateRequest
{
"cta_url": "string",
"lo_specific_url": "string",
"device": "string",
"image_alt_text": "string",
"image_url": "string",
"page": "string",
"tracking_id": "string",
"native_app_nav_key": "string"
}
An object specifying a set of field values to write to a CTA.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
cta_url | string | false | none | The URL to which users will be taken after clicking on the CTA. Optionally, you can use “tel:5555555555” for this field to initiate a phone call when a user clicks on the image CTA. |
lo_specific_url | string | false | none | The URL structure to be used to send users that are matched with a loan officer to a unique URL for that associated loan officer. The structure must include a query parameter with the following: #loid# Example URL: https://www.test.com/loan-officers?lo=#loid# |
device | string | false | none | The device-type on which the CTA will be displayed |
image_alt_text | string | false | none | The alt-text that will be used for the CTA image |
image_url | string | false | none | The URL of the primary image asset for the CTA |
page | string | false | none | The ComeHome page on which the CTA will be displayed (property_details , property_search , homeowner , home_improvement_calculator ) |
tracking_id | string | false | none | A unique ID that will be included in relevant analytics data for click-tracking purposes |
native_app_nav_key | string | false | none | A unique identifier that will be passed from ComeHome to a partner's native application through a Javascript bridge when the CTA is clicked within a native app integrated ComeHome experience. The native app must respond to the Javascript bridge event and use this value to determine where to navigate the user within the native app. |
CTACreateResponse
{
"id": "string"
}
Indicates the passed CTA was ingested successfully
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | none | A ComeHome-assigned unique ID for the CTA |
CTAResponse
{
"cta_url": "string",
"lo_specific_url": "string",
"device": "string",
"id": "string",
"image_alt_text": "string",
"image_url": "string",
"original_image_url": "string",
"page": "string",
"tracking_id": "string",
"native_app_nav_key": "string"
}
Data for an individual CTA
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
cta_url | string | false | none | The URL to which users will be taken after clicking on the CTA. Optionally, you can use “tel:5555555555” for this field to initiate a phone call when a user clicks on the image CTA. |
lo_specific_url | string | false | none | The URL structure to be used to send users that are matched with a loan officer to a unique URL for that associated loan officer. The structure must include a query parameter with the following: #loid# Example URL: https://www.test.com/loan-officers?lo=#loid# |
device | string | false | none | The device-type on which the CTA will be displayed |
id | string | false | none | A ComeHome-assigned unique ID for the CTA |
image_alt_text | string | false | none | The alt-text that will be used for the CTA image |
image_url | string | false | none | The ComeHome-assigned URL of the primary image asset for the CTA |
original_image_url | string | false | none | The original URL of the primary image asset for the CTA, passed when it was created |
page | string | false | none | The ComeHome page on which the CTA will be displayed (property_details , property_search , homeowner , home_improvement_calculator ) |
tracking_id | string | false | none | A unique ID that will be included in relevant analytics data for click-tracking purposes |
native_app_nav_key | string | false | none | A unique identifier that will be passed from ComeHome to a partner's native application through a Javascript bridge when the CTA is clicked within a native app integrated ComeHome experience. The native app must respond to the Javascript bridge event and use this value to determine where to navigate the user within the native app. |
ActivityListResponse
{
"data": [
{
"activity_detail": {},
"activity_type": "string",
"agent_id": "string",
"browser": "string",
"cookie_id": "string",
"event_id": "string",
"event_ts": "string",
"id": "string",
"ip": "string",
"lo_id": "string",
"partner_user_id": "string",
"url": "string",
"visit_id": "string"
}
],
"next_cursor": "string"
}
Paged activities response, containing a list of activities and a page cursor.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
data | [ActivityResponse] | false | none | [Data pertaining to a single user activity.] |
next_cursor | string | false | none | none |
ActivityResponse
{
"activity_detail": {},
"activity_type": "string",
"agent_id": "string",
"browser": "string",
"cookie_id": "string",
"event_id": "string",
"event_ts": "string",
"id": "string",
"ip": "string",
"lo_id": "string",
"partner_user_id": "string",
"url": "string",
"visit_id": "string"
}
Data pertaining to a single user activity.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
activity_detail | object | false | none | Specific data pertaining to the activity in question. |
activity_type | string | false | none | The type of activity for this data. |
agent_id | string | false | none | Identifying information for the agent associated with the user, if relevant. |
browser | string | false | none | User agent of the user that triggered the event. |
cookie_id | string | false | none | Identifier of the cookie that is set for the user's device. |
event_id | string | false | none | A unique identifier for this individual event that will match the corresponding raw event if accessed via the legacy /analytics endpoint. |
event_ts | string | false | none | Timestamp of the event (in UTC). |
id | string | false | none | A globally unique identifier for this event. |
ip | string | false | none | IP address of the user. |
lo_id | string | false | none | Identifying information for the loan officer associated with the user, if relevant. |
partner_user_id | string | false | none | The partner-supplied identifier for the user that performed this activity. |
url | string | false | none | The URL of the page where the activity in question was performed. |
visit_id | string | false | none | A unique ID for the user session relevant to this activity. |
Event
{
"event_id": "string",
"cookie_id": "string",
"http_host": "string",
"http_referer": "string",
"http_url": "string",
"http_user_agent": "string",
"query_string": "string",
"remote_addr": "string",
"event_name": "string",
"event_ts": "string",
"event_type": "string",
"event_data": {},
"user_id": "string",
"partner_user_id": "string",
"ch_property_id": "string"
}
Represents an analytic event.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
event_id | string | false | none | A unique identifier for this individual event. |
cookie_id | string | false | none | Identifier of the cookie that is set for the user's device. |
http_host | string | false | none | Specific hostname / subdomain. |
http_referer | string | false | none | Which page was the direct referral for the event. |
http_url | string | false | none | URL of the page that includes the full hostname and any query parameters. |
http_user_agent | string | false | none | User agent of the user that triggered the event. |
query_string | string | false | none | Parsed query string. |
remote_addr | string | false | none | IP address of the user. |
event_name | string | false | none | Granular event name. |
event_ts | string | false | none | Timestamp of the event (in UTC). |
event_type | string | false | none | Rolled up event description. |
event_data | object | false | none | Includes metadata about the event. |
user_id | string | false | none | Unique user identifier supplied by ComeHome, if available. |
partner_user_id | string | false | none | Unique user identifier supplied by the partner. If no identifier was supplied or is available, a temporary identifier will be provided. |
ch_property_id | string | false | none | A human-readable, unique identifier for the property relevant to this event. If this field is missing or null, there is no property relevant to this event. Note that this identifier can be used to fetch more information about the relevant property, by using it in requests sent to our /bpo or /listing/ endpoints. |
CalloutsWebhookList
{
"data": [
{
"id": "string",
"url": "string",
"basic_auth": {
"set_on": "string"
},
"signed_v1_auth": {
"set_on": "string"
},
"created": "string",
"is_active": true
}
]
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
data | [CalloutsWebhook] | false | none | [Describes a callouts webhook object.] |
CalloutsWebhook
{
"id": "string",
"url": "string",
"basic_auth": {
"set_on": "string"
},
"signed_v1_auth": {
"set_on": "string"
},
"created": "string",
"is_active": true
}
Describes a callouts webhook object.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | none | ID of the webhook registered with ComeHome |
url | string | false | none | The webhook's destination URL. |
basic_auth | object | false | none | none |
» set_on | string | false | none | The time when the key was received or most recently rotated. |
signed_v1_auth | object | false | none | none |
» set_on | string | false | none | The time when the key was received or most recently rotated. |
created | string | false | none | The time this webhook was created. |
is_active | boolean | false | none | If false, the webhook is disabled. |
CalloutsWebhookIgnoredList
[
"string"
]
Properties
None
BasicAuth
{
"user_id": "string",
"password": "string"
}
Basic Authentication fields
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
user_id | string | true | none | The user-id that will be used in the basic authentication scheme. |
password | string | true | none | The password that will be used in the basic authentication scheme. |
CalloutsWebhookCreateRequest
{
"url": "string",
"basic_auth": {
"user_id": "string",
"password": "string"
},
"signed_v1_auth": {
"key": "string"
}
}
A callouts webhook create request.
One of "basic_auth" or "signed_v1_auth" must be provided.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
url | string | true | none | The webhook's destination URL. This must be an HTTPS URL where your listener can be reached. |
basic_auth | BasicAuth | false | none | Basic Authentication fields |
signed_v1_auth | SignedV1Key | false | none | none |
SignedV1Key
{
"key": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
key | string | false | none | A base64-encoded key. You must generate one using a cryptographically secure generator. The key must be between 32 and 64 bytes long, inclusive. |
CalloutsWebhookUpdateRequest
{
"url": "string",
"basic_auth": {
"user_id": "string",
"password": "string"
},
"signed_v1_auth": {
"key": "string"
},
"is_active": true
}
A callouts webhook update request.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
url | string | false | none | The webhook's destination URL. This must be an HTTPS URL where your listener can be reached. |
basic_auth | BasicAuth | false | none | Basic Authentication fields |
signed_v1_auth | SignedV1Key | false | none | none |
is_active | boolean | false | none | If set to false, the webhook is disabled. |
AnalyticsWebhookList
{
"data": [
{
"id": "string",
"url": "string",
"basic_auth": {
"set_on": "string"
},
"signed_v1_auth": {
"set_on": "string"
},
"activity_types": [
"string"
],
"event_names": [
"string"
],
"created": "string",
"is_active": true
}
]
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
data | [AnalyticsWebhook] | false | none | [Represents an analytics webhook object. One of "basic_auth" or "signed_v1_auth" must be provided. ] |
AnalyticsWebhook
{
"id": "string",
"url": "string",
"basic_auth": {
"set_on": "string"
},
"signed_v1_auth": {
"set_on": "string"
},
"activity_types": [
"string"
],
"event_names": [
"string"
],
"created": "string",
"is_active": true
}
Represents an analytics webhook object.
One of "basic_auth" or "signed_v1_auth" must be provided.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | none | ID of the webhook registered with ComeHome |
url | string | false | none | The Partner webhook URL in string format where we will POST data based on the activity_type and/or event_name triggering events |
basic_auth | object | false | none | none |
» set_on | string | false | none | The time when the key was received or most recently rotated. |
signed_v1_auth | object | false | none | none |
» set_on | string | false | none | The time when the key was received or most recently rotated. |
activity_types | [string] | false | none | List of categories of events to filter for this webhook. Allowable values are: - claim_home - find_pro - home_improvement_calculator - lender_ctas - lo_contacts - mortgage_calculator - pdp_views - property_saves - realestate_agent_contacts - refi_calculator - searches_performed - searches_saved - visits |
event_names | [string] | false | none | List of specific events to filter for this webhook. Allowable values are: - click_ad_cta - click_alerts_watch - click_buyer_lo_contact - click_buyer_lo_modal_cta - click_buyer_lo_modal_cta_success - click_buyer_loan_options - click_buyer_loan_options_submit - click_buyer_pdp_contact - click_concierge_team_cta_1 - click_concierge_team_cta_2 - click_concierge_team_cta_3 - click_concierge_team_cta_4 - click_find_agent_banner_pdp - click_find_agent_buyer_comments - click_find_agent_buyer_email - click_find_agent_buyer_first_name - click_find_agent_buyer_last_name - click_find_agent_buyer_phone - click_find_agent_buyer_pre_approved_no - click_find_agent_buyer_pre_approved_yes - click_find_agent_buyer_submit - click_find_agent_card_ho - click_find_agent_header - click_find_agent_header_buying_button - click_find_agent_header_comments - click_find_agent_header_email - click_find_agent_header_first_name - click_find_agent_header_last_name - click_find_agent_header_phone - click_find_agent_header_pre_approved_no - click_find_agent_header_pre_approved_yes - click_find_agent_header_preferred_price - click_find_agent_header_selling_button - click_find_agent_header_submit - click_find_agent_ho_banner - click_find_agent_seller_comments - click_find_agent_seller_email - click_find_agent_seller_first_name - click_find_agent_seller_last_name - click_find_agent_seller_phone - click_find_agent_seller_preferred_price - click_find_agent_seller_submit - click_home_insurance_homeowner_pdp - click_home_verification_submit_cta - click_lender_cta - click_lender_cta_owner - click_lender_cta_see_loan_options - click_lo_contact_call - click_lo_contact_email - click_loan_details_refi_calc_cta - click_loan_details_refi_calc_mortgage - click_nav_homepage_find_agent_component - click_owner_claim_select_address - click_owner_edit_beds - click_owner_edit_close - click_owner_edit_details - click_owner_edit_full_baths - click_owner_edit_half_baths - click_owner_edit_living_area - click_owner_edit_loan_amount - click_owner_edit_lot_size - click_owner_edit_rate - click_owner_edit_sale_date - click_owner_edit_sale_price - click_owner_edit_save - click_owner_edit_sqft - click_owner_edit_terms - click_owner_edit_total_rooms - click_owner_improvement_state_update - click_owner_lo_contact - click_owner_loan_options - click_owner_loan_options_submit - click_owner_manage_dashboard_remove - click_owner_profinder_submit - click_owner_refi_calc_terms - click_owner_verify_cta - click_owner_verify_success - click_pdp_share - click_property_details_contact_agent - click_property_details_mortgage_calculator - click_property_details_owner_promo - click_property_details_unwatch_confirm - click_property_details_update_mortgage_calc_details - click_property_details_watch - click_save_search_cta_list_view - click_save_search_cta_map_view - click_save_search_cta_mobile_filters - click_save_search_success - click_search_field - click_search_list_watch - click_settings_save_search_delete - click_talk_to_agent_top_agents_ranked - click_url_cta_pdp - click_url_cta_srp - click_watch_property_success - click_your_team_button - click_your_team_choose_another_agent_confirmation_page - click_your_team_choose_another_agent_question_page - click_your_team_close_button - click_your_team_find_an_agent_tab - click_your_team_get_paired_with_an_agent - click_your_team_lender_no_lo_contact_button - click_your_team_lo_contact_button_1 - click_your_team_lo_contact_button_2 - click_your_team_lo_contact_button_3 - click_your_team_lo_contact_button_4 - click_your_team_lo_contact_button_5 - click_your_team_lo_lender_cta - click_your_team_lo_send_button - click_your_team_lo_send_error - click_your_team_lo_send_success - click_your_team_no_lo_lender_cta - click_your_team_re_agent_contact_button_1 - click_your_team_re_agent_contact_button_2 - click_your_team_re_agent_contact_button_3 - click_your_team_re_agent_contact_button_4 - click_your_team_re_agent_contact_button_5 - click_your_team_re_agent_lender_cta - click_your_team_re_agent_send_button - click_your_team_re_agent_send_error - click_your_team_re_agent_send_success - click_your_team_use_this_agent_button_lender_recommended_agent - click_your_team_use_this_agent_button_previous_agent - property_details_page_view - search_state_update - signup_complete - visit |
created | string | false | none | The time this webhook was created. |
is_active | boolean | false | none | Describes whether the webhook filter is currently turned on and is active. Default is true when the webhook is created and can be updated through PATCH. |
AnalyticsWebhookCreateRequest
{
"url": "string",
"basic_auth": {
"user_id": "string",
"password": "string"
},
"signed_v1_auth": {
"key": "string"
},
"activity_types": [
"string"
],
"event_names": [
"string"
]
}
Represents an analytics webhook create request.
One of "basic_auth" or "signed_v1_auth" must be provided.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
url | string | true | none | The Partner webhook URL in string format where we will POST data based on the activity_type and/or event_name triggering events |
basic_auth | BasicAuth | false | none | Basic Authentication fields |
signed_v1_auth | SignedV1Key | false | none | none |
activity_types | [string] | false | none | List of categories of events to filter for this webhook. Allowable values are: - claim_home - find_pro - home_improvement_calculator - lender_ctas - lo_contacts - mortgage_calculator - pdp_views - property_saves - realestate_agent_contacts - refi_calculator - searches_performed - searches_saved - visits |
event_names | [string] | false | none | List of specific events to filter for this webhook. Allowable values are: - click_ad_cta - click_alerts_watch - click_buyer_lo_contact - click_buyer_lo_modal_cta - click_buyer_lo_modal_cta_success - click_buyer_loan_options - click_buyer_loan_options_submit - click_buyer_pdp_contact - click_concierge_team_cta_1 - click_concierge_team_cta_2 - click_concierge_team_cta_3 - click_concierge_team_cta_4 - click_find_agent_banner_pdp - click_find_agent_buyer_comments - click_find_agent_buyer_email - click_find_agent_buyer_first_name - click_find_agent_buyer_last_name - click_find_agent_buyer_phone - click_find_agent_buyer_pre_approved_no - click_find_agent_buyer_pre_approved_yes - click_find_agent_buyer_submit - click_find_agent_card_ho - click_find_agent_header - click_find_agent_header_buying_button - click_find_agent_header_comments - click_find_agent_header_email - click_find_agent_header_first_name - click_find_agent_header_last_name - click_find_agent_header_phone - click_find_agent_header_pre_approved_no - click_find_agent_header_pre_approved_yes - click_find_agent_header_preferred_price - click_find_agent_header_selling_button - click_find_agent_header_submit - click_find_agent_ho_banner - click_find_agent_seller_comments - click_find_agent_seller_email - click_find_agent_seller_first_name - click_find_agent_seller_last_name - click_find_agent_seller_phone - click_find_agent_seller_preferred_price - click_find_agent_seller_submit - click_home_insurance_homeowner_pdp - click_home_verification_submit_cta - click_lender_cta - click_lender_cta_owner - click_lender_cta_see_loan_options - click_lo_contact_call - click_lo_contact_email - click_loan_details_refi_calc_cta - click_loan_details_refi_calc_mortgage - click_nav_homepage_find_agent_component - click_owner_claim_select_address - click_owner_edit_beds - click_owner_edit_close - click_owner_edit_details - click_owner_edit_full_baths - click_owner_edit_half_baths - click_owner_edit_living_area - click_owner_edit_loan_amount - click_owner_edit_lot_size - click_owner_edit_rate - click_owner_edit_sale_date - click_owner_edit_sale_price - click_owner_edit_save - click_owner_edit_sqft - click_owner_edit_terms - click_owner_edit_total_rooms - click_owner_improvement_state_update - click_owner_lo_contact - click_owner_loan_options - click_owner_loan_options_submit - click_owner_manage_dashboard_remove - click_owner_profinder_submit - click_owner_refi_calc_terms - click_owner_verify_cta - click_owner_verify_success - click_pdp_share - click_property_details_contact_agent - click_property_details_mortgage_calculator - click_property_details_owner_promo - click_property_details_unwatch_confirm - click_property_details_update_mortgage_calc_details - click_property_details_watch - click_save_search_cta_list_view - click_save_search_cta_map_view - click_save_search_cta_mobile_filters - click_save_search_success - click_search_field - click_search_list_watch - click_settings_save_search_delete - click_talk_to_agent_top_agents_ranked - click_url_cta_pdp - click_url_cta_srp - click_watch_property_success - click_your_team_button - click_your_team_choose_another_agent_confirmation_page - click_your_team_choose_another_agent_question_page - click_your_team_close_button - click_your_team_find_an_agent_tab - click_your_team_get_paired_with_an_agent - click_your_team_lender_no_lo_contact_button - click_your_team_lo_contact_button_1 - click_your_team_lo_contact_button_2 - click_your_team_lo_contact_button_3 - click_your_team_lo_contact_button_4 - click_your_team_lo_contact_button_5 - click_your_team_lo_lender_cta - click_your_team_lo_send_button - click_your_team_lo_send_error - click_your_team_lo_send_success - click_your_team_no_lo_lender_cta - click_your_team_re_agent_contact_button_1 - click_your_team_re_agent_contact_button_2 - click_your_team_re_agent_contact_button_3 - click_your_team_re_agent_contact_button_4 - click_your_team_re_agent_contact_button_5 - click_your_team_re_agent_lender_cta - click_your_team_re_agent_send_button - click_your_team_re_agent_send_error - click_your_team_re_agent_send_success - click_your_team_use_this_agent_button_lender_recommended_agent - click_your_team_use_this_agent_button_previous_agent - property_details_page_view - search_state_update - signup_complete - visit |
AnalyticsWebhookUpdateRequest
{
"url": "string",
"basic_auth": {
"user_id": "string",
"password": "string"
},
"signed_v1_auth": {
"key": "string"
},
"activity_types": [
"string"
],
"event_names": [
"string"
],
"is_active": true
}
Represents an analytics webhook update request.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
url | string | false | none | The webhook's destination URL. This must be an HTTPS URL where your listener can be reached. |
basic_auth | BasicAuth | false | none | Basic Authentication fields |
signed_v1_auth | SignedV1Key | false | none | none |
activity_types | [string] | false | none | List of categories of events to filter for this webhook. Allowable values are: - claim_home - find_pro - home_improvement_calculator - lender_ctas - lo_contacts - mortgage_calculator - pdp_views - property_saves - realestate_agent_contacts - refi_calculator - searches_performed - searches_saved - visits |
event_names | [string] | false | none | List of specific events to filter for this webhook. Allowable values are: - click_ad_cta - click_alerts_watch - click_buyer_lo_contact - click_buyer_lo_modal_cta - click_buyer_lo_modal_cta_success - click_buyer_loan_options - click_buyer_loan_options_submit - click_buyer_pdp_contact - click_concierge_team_cta_1 - click_concierge_team_cta_2 - click_concierge_team_cta_3 - click_concierge_team_cta_4 - click_find_agent_banner_pdp - click_find_agent_buyer_comments - click_find_agent_buyer_email - click_find_agent_buyer_first_name - click_find_agent_buyer_last_name - click_find_agent_buyer_phone - click_find_agent_buyer_pre_approved_no - click_find_agent_buyer_pre_approved_yes - click_find_agent_buyer_submit - click_find_agent_card_ho - click_find_agent_header - click_find_agent_header_buying_button - click_find_agent_header_comments - click_find_agent_header_email - click_find_agent_header_first_name - click_find_agent_header_last_name - click_find_agent_header_phone - click_find_agent_header_pre_approved_no - click_find_agent_header_pre_approved_yes - click_find_agent_header_preferred_price - click_find_agent_header_selling_button - click_find_agent_header_submit - click_find_agent_ho_banner - click_find_agent_seller_comments - click_find_agent_seller_email - click_find_agent_seller_first_name - click_find_agent_seller_last_name - click_find_agent_seller_phone - click_find_agent_seller_preferred_price - click_find_agent_seller_submit - click_home_insurance_homeowner_pdp - click_home_verification_submit_cta - click_lender_cta - click_lender_cta_owner - click_lender_cta_see_loan_options - click_lo_contact_call - click_lo_contact_email - click_loan_details_refi_calc_cta - click_loan_details_refi_calc_mortgage - click_nav_homepage_find_agent_component - click_owner_claim_select_address - click_owner_edit_beds - click_owner_edit_close - click_owner_edit_details - click_owner_edit_full_baths - click_owner_edit_half_baths - click_owner_edit_living_area - click_owner_edit_loan_amount - click_owner_edit_lot_size - click_owner_edit_rate - click_owner_edit_sale_date - click_owner_edit_sale_price - click_owner_edit_save - click_owner_edit_sqft - click_owner_edit_terms - click_owner_edit_total_rooms - click_owner_improvement_state_update - click_owner_lo_contact - click_owner_loan_options - click_owner_loan_options_submit - click_owner_manage_dashboard_remove - click_owner_profinder_submit - click_owner_refi_calc_terms - click_owner_verify_cta - click_owner_verify_success - click_pdp_share - click_property_details_contact_agent - click_property_details_mortgage_calculator - click_property_details_owner_promo - click_property_details_unwatch_confirm - click_property_details_update_mortgage_calc_details - click_property_details_watch - click_save_search_cta_list_view - click_save_search_cta_map_view - click_save_search_cta_mobile_filters - click_save_search_success - click_search_field - click_search_list_watch - click_settings_save_search_delete - click_talk_to_agent_top_agents_ranked - click_url_cta_pdp - click_url_cta_srp - click_watch_property_success - click_your_team_button - click_your_team_choose_another_agent_confirmation_page - click_your_team_choose_another_agent_question_page - click_your_team_close_button - click_your_team_find_an_agent_tab - click_your_team_get_paired_with_an_agent - click_your_team_lender_no_lo_contact_button - click_your_team_lo_contact_button_1 - click_your_team_lo_contact_button_2 - click_your_team_lo_contact_button_3 - click_your_team_lo_contact_button_4 - click_your_team_lo_contact_button_5 - click_your_team_lo_lender_cta - click_your_team_lo_send_button - click_your_team_lo_send_error - click_your_team_lo_send_success - click_your_team_no_lo_lender_cta - click_your_team_re_agent_contact_button_1 - click_your_team_re_agent_contact_button_2 - click_your_team_re_agent_contact_button_3 - click_your_team_re_agent_contact_button_4 - click_your_team_re_agent_contact_button_5 - click_your_team_re_agent_lender_cta - click_your_team_re_agent_send_button - click_your_team_re_agent_send_error - click_your_team_re_agent_send_success - click_your_team_use_this_agent_button_lender_recommended_agent - click_your_team_use_this_agent_button_previous_agent - property_details_page_view - search_state_update - signup_complete - visit |
is_active | boolean | false | none | Describes whether the webhook filter is currently turned on and is active. Default is true when the webhook is created and can be updated through PATCH. |
RestApiSimpleErrorData
{
"error_id": "string",
"status": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
error_id | string | false | none | none |
status | string | false | none | none |
ClaimedPropertyResponse
{
"basement": true,
"baths_full": 0,
"baths_partial": 0,
"beds": 0,
"city": "string",
"condition": "string",
"created": "2019-08-24T14:15:22Z",
"failed_count": 0,
"garage_type": "string",
"interested_in_selling": "string",
"interested_in_selling_last_updated": "2019-08-24T14:15:22Z",
"invite_id": "string",
"last_failure": "2019-08-24T14:15:22Z",
"living_area": 0,
"lockout_date": "2019-08-24T14:15:22Z",
"lot_size": 0,
"opted_in_to_sell": true,
"pmi_modal_was_shown": true,
"pool": true,
"room_count": 0,
"sale_price": 0,
"slug": "string",
"state": "string",
"street": "string",
"unit": "string",
"updated": "2019-08-24T14:15:22Z",
"user_id": "string",
"verified": true,
"zipcode": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
basement | boolean | false | none | none |
baths_full | integer | false | none | none |
baths_partial | integer | false | none | none |
beds | integer | false | none | none |
city | string | false | none | none |
condition | string | false | none | none |
created | string(date-time) | false | none | none |
failed_count | integer | false | none | none |
garage_type | string | false | none | none |
interested_in_selling | string | false | none | none |
interested_in_selling_last_updated | string(date-time) | false | none | none |
invite_id | string | false | none | none |
last_failure | string(date-time) | false | none | none |
living_area | integer | false | none | none |
lockout_date | string(date-time) | false | none | none |
lot_size | number | false | none | none |
opted_in_to_sell | boolean | false | none | none |
pmi_modal_was_shown | boolean | false | none | none |
pool | boolean | false | none | none |
room_count | integer | false | none | none |
sale_price | integer | false | none | none |
slug | string | false | none | none |
state | string | false | none | none |
street | string | false | none | none |
unit | string | false | none | none |
updated | string(date-time) | false | none | none |
user_id | string | false | none | none |
verified | boolean | false | none | none |
zipcode | string | false | none | none |
AddressQueryValues
{
"city": "string",
"state": "string",
"street": "string",
"unit": "string",
"zipcode": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
city | string | false | none | none |
state | string | false | none | none |
street | string | false | none | none |
unit | string | false | none | none |
zipcode | string | false | none | none |
UserListResponse
{
"data": [
{
"active": true,
"city": "string",
"email": "string",
"email_bounced": "2019-08-24T14:15:22Z",
"email_complained": "2019-08-24T14:15:22Z",
"first_name": "string",
"id": "string",
"last_name": "string",
"partner_id": "string",
"partner_user_id": "string",
"phone": "string",
"register_application": "string",
"send_email": true,
"send_email_homeowner": true,
"send_email_search": true,
"send_mobile": true,
"send_mobile_search": true,
"state": "string",
"street_address": "string",
"terms_accepted": "2019-08-24T14:15:22Z",
"zip_code": "string"
}
],
"cursor": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
data | [UserResponse] | false | none | none |
cursor | string | false | none | If this value is absent, then there are no more results to display. Otherwise, use this cursor value in your next request to fetch the next page of results. |
UserResponse
{
"active": true,
"city": "string",
"email": "string",
"email_bounced": "2019-08-24T14:15:22Z",
"email_complained": "2019-08-24T14:15:22Z",
"first_name": "string",
"id": "string",
"last_name": "string",
"partner_id": "string",
"partner_user_id": "string",
"phone": "string",
"register_application": "string",
"send_email": true,
"send_email_homeowner": true,
"send_email_search": true,
"send_mobile": true,
"send_mobile_search": true,
"state": "string",
"street_address": "string",
"terms_accepted": "2019-08-24T14:15:22Z",
"zip_code": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
active | boolean | false | none | none |
city | string | false | none | none |
string | false | none | none | |
email_bounced | string(date-time) | false | none | none |
email_complained | string(date-time) | false | none | none |
first_name | string | false | none | none |
id | string | false | none | The unique identifier ComeHome generated for the user. |
last_name | string | false | none | none |
partner_id | string | false | none | none |
partner_user_id | string | false | none | The unique identifier for the user that was supplied by the partner. |
phone | string | false | none | none |
register_application | string | false | none | none |
send_email | boolean | false | none | none |
send_email_homeowner | boolean | false | none | none |
send_email_search | boolean | false | none | none |
send_mobile | boolean | false | none | none |
send_mobile_search | boolean | false | none | none |
state | string | false | none | none |
street_address | string | false | none | none |
terms_accepted | string(date-time) | false | none | none |
zip_code | string | false | none | none |
UserPatchRequest
{
"active": true,
"agent_id": "string",
"city": "string",
"email": "string",
"first_name": "string",
"last_name": "string",
"loan_officer_id": "string",
"phone": "string",
"send_email": true,
"send_email_homeowner": true,
"send_email_search": true,
"send_mobile": true,
"send_mobile_search": true,
"state": "string",
"street_address": "string",
"zip_code": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
active | boolean | false | none | none |
agent_id | string | false | none | none |
city | string | false | none | none |
string | false | none | none | |
first_name | string | false | none | none |
last_name | string | false | none | none |
loan_officer_id | string | false | none | none |
phone | string | false | none | none |
send_email | boolean | false | none | none |
send_email_homeowner | boolean | false | none | none |
send_email_search | boolean | false | none | none |
send_mobile | boolean | false | none | none |
send_mobile_search | boolean | false | none | none |
state | string | false | none | none |
street_address | string | false | none | none |
zip_code | string | false | none | none |
SearchRequest
{
"city": "string",
"filters": {
"max_12mo_risk_of_decline": 0,
"max_avm_price": 0,
"max_best_high_school_percentile": 0,
"max_best_middle_school_percentile": 0,
"max_best_primary_school_percentile": 0,
"max_confident_list_to_avm_price": 0,
"max_confident_rental_avm_price": 0,
"max_crime_county_percentile": 0,
"max_hpi": 0,
"max_list_price": 0,
"max_lot_area": 0,
"max_market_grade": "string",
"max_price_per_sqft_50": 0,
"max_sqft": 0,
"max_year_built": 0,
"min_12mo_risk_of_decline": 0,
"min_avm_price": 0,
"min_baths": 0,
"min_beds": 0,
"min_best_high_school_percentile": 0,
"min_best_middle_school_percentile": 0,
"min_best_primary_school_percentile": 0,
"min_confident_rental_avm_price": 0,
"min_confident_rental_yield": 0,
"min_crime_county_percentile": 0,
"min_hpi": 0,
"min_list_age_days": 0,
"min_list_price": 0,
"min_lot_area": 0,
"min_market_grade": "string",
"min_price_per_sqft_50": 0,
"min_sqft": 0,
"min_year_built": 0,
"mls_state": [
"string"
],
"property_type": [
"string"
]
},
"zipcode": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
city | string | false | none | none |
filters | SearchFilters | false | none | none |
zipcode | string | false | none | none |
SearchResponse
{
"created": "2019-08-24T14:15:22Z",
"filters": {
"max_12mo_risk_of_decline": 0,
"max_avm_price": 0,
"max_best_high_school_percentile": 0,
"max_best_middle_school_percentile": 0,
"max_best_primary_school_percentile": 0,
"max_confident_list_to_avm_price": 0,
"max_confident_rental_avm_price": 0,
"max_crime_county_percentile": 0,
"max_hpi": 0,
"max_list_price": 0,
"max_lot_area": 0,
"max_market_grade": "string",
"max_price_per_sqft_50": 0,
"max_sqft": 0,
"max_year_built": 0,
"min_12mo_risk_of_decline": 0,
"min_avm_price": 0,
"min_baths": 0,
"min_beds": 0,
"min_best_high_school_percentile": 0,
"min_best_middle_school_percentile": 0,
"min_best_primary_school_percentile": 0,
"min_confident_rental_avm_price": 0,
"min_confident_rental_yield": 0,
"min_crime_county_percentile": 0,
"min_hpi": 0,
"min_list_age_days": 0,
"min_list_price": 0,
"min_lot_area": 0,
"min_market_grade": "string",
"min_price_per_sqft_50": 0,
"min_sqft": 0,
"min_year_built": 0,
"mls_state": [
"string"
],
"property_type": [
"string"
]
},
"id": 0,
"name": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
created | string(date-time) | false | none | none |
filters | SearchFilters | false | none | none |
id | integer | false | none | none |
name | string | false | none | none |
CHDirectClientsCreateRequest
{
"data": [
{
"first_name": "string",
"last_name": "string",
"email": "string",
"phone": "string",
"is_buyer": true,
"buying_price_point": 0,
"loan_amount": 0,
"address": {
"street_address": "string",
"unit": "string",
"city": "string",
"state": "string",
"zipcode": "string"
}
}
]
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
data | [CHDirectClientInput] | false | none | none |
CHDirectClientInput
{
"first_name": "string",
"last_name": "string",
"email": "string",
"phone": "string",
"is_buyer": true,
"buying_price_point": 0,
"loan_amount": 0,
"address": {
"street_address": "string",
"unit": "string",
"city": "string",
"state": "string",
"zipcode": "string"
}
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
first_name | string | true | none | none |
last_name | string | true | none | none |
string | true | none | none | |
phone | string | false | none | none |
is_buyer | boolean | false | none | none |
buying_price_point | integer | false | none | none |
loan_amount | integer | false | none | none |
address | AddressInput | false | none | none |
CHDirectClientsCreateResponse
{
"clients": [
{
"id": "string",
"first_name": "string",
"last_name": "string",
"email": "string",
"phone": "string",
"is_buyer": true,
"slug": "string",
"buying_price_point": 0,
"address": {
"street_address": "string",
"unit": "string",
"city": "string",
"state": "string",
"zipcode": "string"
}
}
],
"invalid": [
{
"message": "string",
"id": {
"value": "string",
"error": "string"
},
"first_name": {
"value": "string",
"error": "string"
},
"last_name": {
"value": "string",
"error": "string"
},
"email": {
"value": "string",
"error": "string"
},
"phone": {
"value": "string",
"error": "string"
},
"slug": {
"value": "string",
"error": "string"
},
"is_buyer": {
"value": true,
"error": "string"
},
"buying_price_point": {
"value": 0,
"error": "string"
},
"loan_amount": {
"value": 0,
"error": "string"
},
"address": {
"value": {
"street_address": "string",
"unit": "string",
"city": "string",
"state": "string",
"zipcode": "string"
},
"error": "string"
}
}
]
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
clients | [CHDirectClient] | false | none | none |
invalid | [CHDirectClientError] | false | none | [Provides an in-depth review of erroneous input. Every field has an optional error message attached indicating the problem encountered with the field.] |
CHDirectClientsGetResponse
{
"data": [
{
"id": "string",
"first_name": "string",
"last_name": "string",
"email": "string",
"phone": "string",
"is_buyer": true,
"slug": "string",
"buying_price_point": 0,
"address": {
"street_address": "string",
"unit": "string",
"city": "string",
"state": "string",
"zipcode": "string"
}
}
]
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
data | [CHDirectClient] | false | none | none |
CHDirectClient
{
"id": "string",
"first_name": "string",
"last_name": "string",
"email": "string",
"phone": "string",
"is_buyer": true,
"slug": "string",
"buying_price_point": 0,
"address": {
"street_address": "string",
"unit": "string",
"city": "string",
"state": "string",
"zipcode": "string"
}
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | true | none | none |
first_name | string | true | none | none |
last_name | string | true | none | none |
string | true | none | none | |
phone | string | false | none | none |
is_buyer | boolean | false | none | none |
slug | string | false | none | none |
buying_price_point | integer | false | none | none |
address | AddressInput | false | none | none |
AddressInput
{
"street_address": "string",
"unit": "string",
"city": "string",
"state": "string",
"zipcode": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
street_address | string | true | none | none |
unit | string | false | none | none |
city | string | true | none | none |
state | string | true | none | none |
zipcode | string | true | none | none |
CHDirectClientError
{
"message": "string",
"id": {
"value": "string",
"error": "string"
},
"first_name": {
"value": "string",
"error": "string"
},
"last_name": {
"value": "string",
"error": "string"
},
"email": {
"value": "string",
"error": "string"
},
"phone": {
"value": "string",
"error": "string"
},
"slug": {
"value": "string",
"error": "string"
},
"is_buyer": {
"value": true,
"error": "string"
},
"buying_price_point": {
"value": 0,
"error": "string"
},
"loan_amount": {
"value": 0,
"error": "string"
},
"address": {
"value": {
"street_address": "string",
"unit": "string",
"city": "string",
"state": "string",
"zipcode": "string"
},
"error": "string"
}
}
Provides an in-depth review of erroneous input. Every field has an optional error message attached indicating the problem encountered with the field.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
message | string | false | none | if there was a problem with adding this client not related to any specific field, this "message" field will be set |
id | StrOptionalError | false | none | none |
first_name | StrOptionalError | false | none | none |
last_name | StrOptionalError | false | none | none |
StrOptionalError | false | none | none | |
phone | StrOptionalError | false | none | none |
slug | StrOptionalError | false | none | none |
is_buyer | BoolOptionalError | false | none | none |
buying_price_point | Int64OptionalError | false | none | none |
loan_amount | Int64OptionalError | false | none | none |
address | AddressOptionalError | false | none | none |
BoolOptionalError
{
"value": true,
"error": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
value | boolean | true | none | none |
error | string | false | none | optional error message that might be associated with the input value of the provided field |
StrOptionalError
{
"value": "string",
"error": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
value | string | true | none | none |
error | string | false | none | optional error message that might be associated with the input value of the provided field |
Int64OptionalError
{
"value": 0,
"error": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
value | integer | true | none | none |
error | string | false | none | optional error message that might be associated with the input value of the provided field |
AddressOptionalError
{
"value": {
"street_address": "string",
"unit": "string",
"city": "string",
"state": "string",
"zipcode": "string"
},
"error": "string"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
value | AddressInput | true | none | none |
error | string | false | none | optional error message that might be associated with the input value of the provided field |
SearchFilters
{
"max_12mo_risk_of_decline": 0,
"max_avm_price": 0,
"max_best_high_school_percentile": 0,
"max_best_middle_school_percentile": 0,
"max_best_primary_school_percentile": 0,
"max_confident_list_to_avm_price": 0,
"max_confident_rental_avm_price": 0,
"max_crime_county_percentile": 0,
"max_hpi": 0,
"max_list_price": 0,
"max_lot_area": 0,
"max_market_grade": "string",
"max_price_per_sqft_50": 0,
"max_sqft": 0,
"max_year_built": 0,
"min_12mo_risk_of_decline": 0,
"min_avm_price": 0,
"min_baths": 0,
"min_beds": 0,
"min_best_high_school_percentile": 0,
"min_best_middle_school_percentile": 0,
"min_best_primary_school_percentile": 0,
"min_confident_rental_avm_price": 0,
"min_confident_rental_yield": 0,
"min_crime_county_percentile": 0,
"min_hpi": 0,
"min_list_age_days": 0,
"min_list_price": 0,
"min_lot_area": 0,
"min_market_grade": "string",
"min_price_per_sqft_50": 0,
"min_sqft": 0,
"min_year_built": 0,
"mls_state": [
"string"
],
"property_type": [
"string"
]
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
max_12mo_risk_of_decline | number | false | none | none |
max_avm_price | integer | false | none | none |
max_best_high_school_percentile | number | false | none | none |
max_best_middle_school_percentile | number | false | none | none |
max_best_primary_school_percentile | number | false | none | none |
max_confident_list_to_avm_price | number | false | none | none |
max_confident_rental_avm_price | integer | false | none | none |
max_crime_county_percentile | number | false | none | none |
max_hpi | number | false | none | none |
max_list_price | integer | false | none | none |
max_lot_area | integer | false | none | none |
max_market_grade | string | false | none | none |
max_price_per_sqft_50 | number | false | none | none |
max_sqft | integer | false | none | none |
max_year_built | integer | false | none | none |
min_12mo_risk_of_decline | number | false | none | none |
min_avm_price | integer | false | none | none |
min_baths | integer | false | none | none |
min_beds | integer | false | none | none |
min_best_high_school_percentile | number | false | none | none |
min_best_middle_school_percentile | number | false | none | none |
min_best_primary_school_percentile | number | false | none | none |
min_confident_rental_avm_price | integer | false | none | none |
min_confident_rental_yield | number | false | none | none |
min_crime_county_percentile | number | false | none | none |
min_hpi | number | false | none | none |
min_list_age_days | integer | false | none | none |
min_list_price | integer | false | none | none |
min_lot_area | integer | false | none | none |
min_market_grade | string | false | none | none |
min_price_per_sqft_50 | number | false | none | none |
min_sqft | integer | false | none | none |
min_year_built | integer | false | none | none |
mls_state | [string] | false | none | none |
property_type | [string] | false | none | none |