Prospect data must be nested under the client
key in the json body.
/api/v2/clients/<client_id>
Edit a limited number of fields on a specified company prospect.
status
lead
, toured
, applicant
, resident
, and not-a-prospect
application
applicant
or resident
status. If not setting to one of those statuses, leave this key out of the payload.unit_id
lease_start_date
YYYY-MM-DD
formatted date that the prospect’s lease starts.lease_end_date
YYYY-MM-DD
formatted date that the prospect’s lease expires.application_submitted_date
YYYY-MM-DD
formatted date that the prospect’s application was submittedapplication_price
closed_date
YYYY-MM-DD
formatted date that the prospect was closed.Example request body for status change:
{
"status": "toured"
}
Example request body for status change to applicant:
{
"status": "applicant"
"application": {
"unit_id": 123,
"lease_start_date": "2020-06-01",
"lease_end_date": "2020-05-31",
"application_submitted_date": "2020-05-20",
"application_price": "1200.00"
}
}
Example response body: 200
success
{
"data": {
"client": {
"id": 111,
"group": 20,
"broker_email": "",
"broker_phone": "",
"broker_name": " ",
"people": [
{
"first_name": "Lara",
"last_name": "Smith",
"preferred_name": "",
"email": "lara.smith@outlook.com",
"phone_1": "555-777-5555",
"phone_2": "",
"id": 27,
"is_primary": true,
"email_updates_opt_in": 10,
"sms_opted_in": 10,
"move_out_date": null
}
],
"move_in_date": null,
"client_referral": "None",
"campaign_info": "None",
"layout": "",
"price_floor": null,
"price_ceiling": null,
"discovery_source": null,
"status": "Applicant",
"active_live_chat_id": null,
"sms_opted_in": 10
}
}
}
Example response body: 400
error
If the provided data in the application fields is not valid, a 400
error response will be returned.
{
"errors": {
"application": {
"unit_id": "missing or invalid data",
"lease_start_date": "missing or invalid data",
"application_submitted_date": "missing or invalid data"
}
}
}
If the provided status
choice is not valid, a 400
error response will be returned. This error will be in an array of strings.
{
"errors": {
"status": ["missing or invalid data"]
}
}
/api/v2/clients
Create a prospect record in Funnel. Note that in order for Funnel to properly ingest prospects and associate them with teams and properties, the following fields are required: first_name, last_name, email, group.
people
first_name
last_name
email
phone_1
phone_2
is_primary
move_in_date
layout
loft
, studio
, 1br
, 2br
, 3br
, 4+br
price_floor
price_ceiling
notes
group
broker_company
broker_email
broker_first_name
broker_last_name
broker_phone
client_referral
campaign_id
campaign_info
community
building
unit
NOTE: You should only pass one of three community
/building
/unit
, otherwise you will get a validation error.
discovery_source
lead_source
device
phone
, tablet
, desktop
, other
, or blank if unknownsource_type
paid
, organic
, or blank if unknownsms_opted_in
'marketing-enabled'
: This prospect has opted into receiving all communication including automated marketing messages'marketing-disabled'
: This prospect has opted into receiving communications, but not opted into receiving automated marketing messages. This is the default setting.'all-sms-disabled'
: This will disable the prospect from receiving any SMS communications. This setting can be updated via the Funnel app. Use this if you want to temporarily disable SMS communication with the prospectclient-opted-out'
: The prospect has explicitly opted out of communication. This setting cannot be updated unless the prospect submits their information again. Use this if you want to permamently disable all SMS communication with the prospect.request_sms
sms_opted_in
)Example request body:
{
"client": {
"people": [
{
"first_name": "John",
"last_name": "Doe",
"email": "johndoe@example.com",
"phone_1": "5101234567",
"phone_2": "",
"is_primary": true
},
{
"first_name": "Jane",
"last_name": "Doe",
"email": "janedoe@example.com",
"phone_1": "",
"phone_2": "",
"is_primary": false
}
],
"move_in_date": "1970-01-01",
"layout": [
"studio",
"1br"
],
"price_floor": 1500,
"price_ceiling": 2500,
"notes": "looking for affordable neighborhood with bars and restaurants",
"group": 12,
"broker_company": "Jerry Company",
"broker_email": "jerry@seinfeld.com",
"broker_first_name": "Jerry",
"broker_last_name": "Seinfeld",
"broker_phone": "4101230987",
"client_referral": "Company Website",
"campaign_id": "Test-Campaign",
"campaign_info": "GooglePPC",
"unit": 5309,
"device": "phone",
"source_type": "organic"
}
}
Example response body: 200
success
{
"data": {
"client": {
"id": 123,
"group": 30,
"broker_email": "",
"broker_phone": "",
"broker_name": "",
"people": [
{
"first_name": "Lara",
"last_name": "Smith",
"preferred_name": "",
"email": "lara.smith@outlook.com",
"phone_1": "",
"phone_2": "",
"id": 111,
"is_primary": true,
"email_updates_opt_in": 10,
"sms_opted_in": 10,
"move_out_date": null
}
],
"move_in_date": null,
"client_referral": "None",
"campaign_info": "None",
"layout": "",
"price_floor": null,
"price_ceiling": null,
"discovery_source": null,
"status": "Prospect",
"active_live_chat_id": null,
"sms_opted_in": 10
}
}
}
Example response body: 400
error
If the provided data is not valid, a 400
error response will be returned. These errors will be in an array of strings.
{
"errors": {
"client": {
"group": [
"Invalid choice."
]
}
}
}
If the required data is missing, a 400
error response will be returned. These errors will be in an array of strings.
{
"errors": {
"client": {
"people": ["Missing data for required field."]
}
}
}
To embed the widget into your website, simply paste the provided code, which should look like this:
<script src="https://integrations.nestio.com/contact-widget/v1/integration.js" id="nestio-lead-capture-frame"></script>
<script type="text/javascript"> NestioLeadCapture({
"type": "lead_capture",
"key": "FUNNEL_API_KEY_HERE",
"group": 9,
"color": "74FFE7"
});
</script>
The parameters you can set are:
key
- Required - The company API key, this will be provided by Funnel.group
- Required - The ID of the Funnel group that will be used for the widget. This group what users are assigned the lead.color
- The brand color which will be used in certain places on the widget, such as submit buttons and header text. This should be 6 digit hex code.campaignInfo
- Optional string. When not using Funnel’s DNI Script, use this parameter to pass a value to Funnel for marketing attribution. In that case, to correctly assign a lead source, set the value to a string that matches the name of your campaign as entered in Funnel under marketing settings. The value must match exactly (case sensitive). When using the DNI Script, the value of this parameter will be saved on the notes section of the guest card.onComplete
- A callback that is executed after the widget form is submitted. This is useful for manually triggering analytics events such as with Google Tags Manager.submitLabel
- Label that displays on the submit button on the client info form. Defaults to ‘Request Information’.unit
- ID of Funnel Unit that the client will be associated within Funnel.buttonTextColor
- Used to change the color of the text on the submit button of the widget. This should be 6 digit hex code.textColor
- Used to change the color of the headers for each field on the widget, First Name, Last Name, etc. This should be 6 digit hex code.Prospect details can be embedded inside an email using one of the following formats:
Insert a hidden <div>
HTML element into the email body.
This div must have the id prospect-details
.
To hide this element add the below CSS as an inline style
using the style
attribute: display: none;
.
The element text content must be the lead as a single JSON object.
Insert an HTML comment into the email body.
This HTML comment must start with the string PROSPECT =
followed by the lead as a single JSON object.
<div style="display: none;" id="prospect-details">
{
"name": "Johnny Example",
"email": "johnny@example.com",
"phone": "567-567-5678",
"minPrice": "$1000",
"maxPrice": "$2000",
"moveInDate": "2025-06-07",
"layouts": ["1BED", "STUDIO"],
"notes": "Do you allow pets?",
"unit": "82021",
"sms_opt_in": "true"
}
</div>
<!-- PROSPECT = {
"name": "Johnny Example",
"email": "johnny@example.com",
"phone": "567-567-5678",
"minPrice": "$1000",
"maxPrice": "$2000",
"moveInDate": "2025-06-07",
"layouts": ["1BED", "STUDIO"],
"notes": "Do you allow pets?",
"unit": "82021",
"sms_opt_in": "true"
} -->
This section covers technical details meant to help developers integrate with prospect email forwarding.
Important CSS style must be inlined, as <style>
tags are stripped by
most email service providers.
So the following <div>
will be displayed by most email service providers.
Warning! Do NOT use a CSS class to hide the div. Do NOT do the following:
<style>
.hidden {
display: none;
}
</style>
<div class="hidden" id="prospect-details">
{
...
}
</div>
Key | Value type | Is required |
---|---|---|
name | string | Yes |
string | Yes | |
phone | string | No |
minPrice | string | No |
maxPrice | string | No |
moveInDate | ISO 8601 date string | No |
layouts | array of strings | No |
notes | string | No |
unit | string | No |
[sms_opt_in] | bool | No |
The full name of the prospect.
The email address of the prospect.
The phone number of the prospect.
The minimum price the prospect is willing to pay.
The maximum price the prospect is willing to pay.
The date the prospect wants to move in.
Move-in date must be a date in ISO 8601 format: YYYY-MM-DD
The property layouts of interest to the prospect. Layouts is a JSON array of strings. Supported layouts:
"STUDIO"
"1BED"
"2BED"
"3BED"
"4BED"
"5BED"
"6BED_OR_MORE"
A string that will be used as the lead’s ‘message’
A string representing the unit number the prospect is referencing.
A bool representing the prospect’s sms opt-in response.