NAV
javascript python java csharp ruby php go

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)

  1. 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)").
  2. 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.
  3. construct a "canonical request" by concatenating the unix time string from step 1, a period ("."), and the entire body of the request.
  4. 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.
  5. 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.

  1. generate a new key
  2. add key to the listener's keys (falling back to the old key if the first key fails to validate signatures)
  3. PATCH the webhook with the new key
  4. 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

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

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:

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.

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

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

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.
email 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.
email 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:

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:

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" }

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