Introduction
Welcome to the CINC API! This API provides access to a CINC site through a HTTP API. Allowing developers to integrate applications with your CINC site. Make sure the desired application has registered as a developer.
You can view code examples in the dark area to the right, and you can switch the programming language of the examples with the tabs in the top right.
Developer Sign Up
Authentication
Authentication Flow
Applications can use the authorization code grant type of the OAuth2 specification to obtain an access token by redirecting a user to the authorization endpoint of the CINC site. A user can then authorize your application with the allowed scopes. Obtained access tokens will give the application access to specific actions based on the scopes selected.
1. Obtain user's consent
You obtain a user's consent to make API calls on their behalf by redirecting their user-agent (browser, webview, etc) to the authorization endpoint with the parameters listed below.
Example request: Obtain user's consent
curl -X GET -G "https://auth.cincapi.com/integrator/authorize" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "client_id=myclientid" \
-d "response_type=code" \
--data-urlencode "redirect_uri=https://myapp.com/callback" \
--data-urlencode "scope=api:read" \
-d "state=12345"
// In production code, don't destroy the HttpClient through using, but better use IHttpClientFactory factory or at least reuse an existing HttpClient instance
// https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests
// https://www.aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("GET"), "https://auth.cincapi.com/integrator/authorize?client_id=myclientid&response_type=code&redirect_uri=https://myapp.com/callback&scope=api:read&state=12345"))
{
var response = await httpClient.SendAsync(request);
}
}
fetch('https://auth.cincapi.com/integrator/authorize?client_id=myclientid&response_type=code&state=12345', {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: 'redirect_uri=https://myapp.com/callback&scope=api:read'
})
.then(response => response.json())
.then(data => console.log(data));
import requests
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
}
params = {
'client_id': 'myclientid',
'response_type': 'code',
'state': '12345',
}
data = 'redirect_uri=https://myapp.com/callback&scope=api:read'
response = requests.get('https://auth.cincapi.com/integrator/authorize', params=params, headers=headers, data=data)
Example response
{
"request": {
"responseURL": "https://myapp.com/callback?code=abcdefghijkl&scope=api:read&state=12345",
// ...
},
// ...
}
Parameters
Name | Type | Description |
---|---|---|
client_id |
String |
Required Unique client identifier obtained through the application registration process. |
response_type |
String |
Set to code to request that an authorization code be sent back to the application return URL. |
redirect_uri |
String |
Application callback URL where the authorization code is sent. This must match the URL registered for your application. |
scope |
String |
Space-delimited string of the scopes you would like. |
state |
String |
An opaque value used to maintain state between the authorize request and the callback. |
2. Process the authorize callback
Once the user authorizes your application, CINC redirects (HTTP 302
) the
user-agent to the return URL with the authorization code appended in the
code
query parameter.
3. Obtain an access token
The authorization code received above can then be exchanged for an access token.
Example request: Obtain an access token
curl -X POST "https://auth.cincapi.com/integrator/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "client_id=myclientid" \
-d "client_secret=myclientsecret" \
-d "grant_type=authorization_code" \
-d "code=abcdefghijkl" \
--data-urlencode "redirect_uri=https://myapp.com/callback" \
--data-urlencode "scope=api:read"
// In production code, don't destroy the HttpClient through using, but better use IHttpClientFactory factory or at least reuse an existing HttpClient instance
// https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests
// https://www.aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://auth.cincapi.com/integrator/token"))
{
var contentList = new List<string>();
contentList.Add("client_id=myclientid");
contentList.Add("client_secret=myclientsecret");
contentList.Add("grant_type=authorization_code");
contentList.Add("code=abcdefghijkl");
contentList.Add($"redirect_uri={Uri.EscapeDataString("https://myapp.com/callback")}");
contentList.Add($"scope={Uri.EscapeDataString("api:read")}");
request.Content = new StringContent(string.Join("&", contentList));
request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/x-www-form-urlencoded");
var response = await httpClient.SendAsync(request);
}
}
fetch('https://auth.cincapi.com/integrator/token', {
method: 'POST',
body: new URLSearchParams({
'client_id': 'myclientid',
'client_secret': 'myclientsecret',
'grant_type': 'authorization_code',
'code': 'abcdefghijkl'
})
})
.then(response => response.json())
.then(data => console.log(data));
import requests
data = {
'client_id': 'myclientid',
'client_secret': 'myclientsecret',
'grant_type': 'authorization_code',
'code': 'abcdefghijkl',
}
response = requests.post('https://auth.cincapi.com/integrator/token', data=data)
Example response
{
"access_token": "8jhsJD03mds92HDs9sl3Ld",
"token_type": "bearer",
"expires_in": 3600,
"refresh_token": "s982jXDpk20kasd0DK293ks",
"scope": "api:read"
}
Headers
Name | Value |
---|---|
content-type |
application/x-www-form-urlencoded |
Parameters
Name | Type | Description |
---|---|---|
grant_type |
String |
Required Value should be authorization_code . |
code |
String |
The authorization code that was sent to your application's return URL. |
redirect_uri |
String |
Application callback URL where the authorization code is sent. This must match the URL registered for your application. |
scope |
String |
Space-delimited string of the scopes you would like. |
All Scopes
api:create
Allows create access at the site level on behalf of the user. The creation of a new object (i.e. lead) is limited to just agents with broker level status.
api:delete
Allows for deleting or removing at the site level on behalf of the user. The current version only supports providing access for agents with broker level status.
api:event
Allows for registering and receiving events at the site level on behalf of the user.
Events can be read with the api:read
scope and will be properly restricted by permissions.
However, receiving asynchronous events is for agents with broker level status only.
api:read
Allows read access to the information at the site level on behalf of the user. The data is restricted per the permissions of the user that provided access. The current version only supports providing access for agents with broker level status.
api:update
Allows for updating information at the site level on behalf of the user. The current version only supports providing access for agents with broker level status.
Agents
Example object: Agents
"agent" : {
"id":"AGENT_MDID0",
"registered_date":"2022-05-06T17:01:49Z",
"info":{
"contact": {
"first_name":"Rebecca",
"last_name":"Lejeune",
"phone_numbers":{
"cell_phone":"6109586760",
"office_phone":"5555555555",
"home_phone":"5555555555",
"work_phone":"5555555555"
},
"email":"buum@cu.com",
"mailing_address":{
"street":"444 Office St",
"city":"Marietta",
"state":"GA",
"postal_or_zip":"30067"
}
},
"status": "active"
}
}
The agent information is structured in the following manner:
Field | Type | Description |
---|---|---|
id |
String |
The unique identifier for the agent. |
registered_date |
Date |
The timestamp of when the agent was registered ISO 8601). |
info |
Object |
Contains the agent information of the agent. |
Agent Info Structure
Example object: Agent Info Structure
"info":{
"contact": {
"first_name":"Rebecca",
"last_name":"Lejeune",
"phone_numbers":{
"cell_phone":"6109586760",
"office_phone":"5555555555",
"home_phone":"5555555555",
"work_phone":"5555555555"
},
"email":"buum@cu.com",
"mailing_address":{
"street":"444 Office St",
"city":"Marietta",
"state":"GA",
"postal_or_zip":"30067"
}
},
"status": "active"
}
The agent information is structured in the following manner:
Field | Type | Description |
---|---|---|
contact |
Object |
The general contact information provided by the agent. |
status |
String |
The current status of the agent. |
Agent Contact Info Structure
Example object: Agent Contact Info Structure
"contact": {
"first_name": "Janis",
"last_name": "A. Doe",
"phone_numbers": {
"cell_phone": "9127562309"
},
"email": "jane.doe@email.com",
"mailing_address": {
"street": "9390 Ford Ave",
"city": "Richmond Hill",
"state": "Georgia",
"postal_or_zip" : "31324"
}
}
The contact information is structured in the following manner:
Field | Type | Description |
---|---|---|
first_name |
String |
The first name of the agent. |
last_name |
String |
The last name of the agent (This may include middle name). |
phone_numbers |
Object |
The registered phone numbers provided by the agent. |
phone_numbers.cell_phone |
String |
The registered primary phone number provided by the agent. |
phone_numbers.home_phone |
String |
The registered home phone number provided by the agent. |
phone_numbers.work_phone |
String |
The registered work phone number provided by the agent. |
phone_numbers.office_phone |
String |
The registered office phone number provided by the agent. |
email |
String |
The registered email provided by the agent. |
mailing_address |
Object |
The address in order to send mail to the agent. |
mailing_address.street |
String |
The street for the mailing address of the agent. |
mailing_address.city |
String |
The city for the mailing address of the agent. |
mailing_address.state |
String |
The state for the mailing address of the agent. |
mailing_address.postal_or_zip |
String |
The postal/zip code for the mailing address of the agent. |
Agent Status
The status of the agent indicates to which capacity the user is within the CINC platform. If the status cannot be determined, it will not be present. The values are currently restricted through the CINC API to the following:
"active"
: The agent is an active user on this site."inactive"
: The agent is currently not active on this site though they may return."onvacation"
: The agent is currently not active on this site. They will return in short period of time."disabled"
: The agent is currently not active on this site. All functions the agent has on the site will not work. The record of the agent being on the site is still maintained."deleted"
: This user has been removed from the site and is no longer maintained.
Leads
Example object: Leads
"lead" : {
"id":"LEAD_MDID0",
"registered_date" : "2022-04-14T09:21:43Z",
"info" : {
"contact" : {
"first_name" : "Janis",
"last_name" : "A. Doe",
"phone_numbers" : {
"cell_phone" : "9127562309"
},
"email" : "jane.doe@email.com",
"mailing_address" : {
"street" : "9390 Ford Ave",
"city" : "Richmond Hill",
"state" : "Georgia",
"postal_code" : "31324"
}
},
"is_buyer" : true,
"buyer" : {
"median_price" : 0,
"average_price" : 250000,
"favorite_city" : "Dallas",
"timeline" : "4 to 6 weeks"
},
"is_seller" : true,
"seller" : {
"timeline":"4 to 6 weeks"
},
"assigned_agents" : {
"primary_agent" : {
"id" : "AGENT_MDID3"
},
"listing_agent" : {
"id" : "AGENT_MDID5"
},
"partner" : {
"id" : "AGENT_MDID7"
}
},
"source" : "Facebook",
"status" : "unworked"
}
}
The lead information is structured in the following manner:
Field | Type | Description |
---|---|---|
id |
String |
The unique identifier for the lead. |
registered_date |
Date |
The timestamp of when the lead was registered (ISO 8601). |
info |
Object |
Contains the lead information of the lead. |
Lead Info Structure
Example object: Lead Info Structure
"info" : {
"contact": {
"first_name": "Janis",
"last_name": "A. Doe",
"phone_numbers": {
"cell_phone": "9127562309"
},
"email": "jane.doe@email.com",
"mailing_address": {
"street": "9390 Ford Ave",
"city": "Richmond Hill",
"state": "Georgia",
"postal_or_zip" : "31324"
}
},
"is_buyer": true,
"buyer": {
"median_price": 0,
"average_price": 250000,
"favorite_city": "Dallas",
"timeline": "4 to 6 weeks"
},
"is_seller": true,
"seller": {
"timeline": "4 to 6 weeks"
},
"assigned_agents": {
"primary_agent": {
"id": "AGENT_MDID3"
},
"listing_agent": {
"id": "AGENT_MDID5"
},
"partner": {
"id": "AGENT_MDID7"
}
},
"source" : "Facebook",
"status" : "unworked"
}
The user info information is structured in the following manner:
Field | Type | Description |
---|---|---|
assigned_agents |
Object |
Contains the assigned agent information of the lead. |
buyer |
Object |
Contains the buyer information of the lead if they are a buyer. |
contact |
Object |
The general contact information of the lead. |
is_buyer |
Boolean |
Check if the lead is a buyer. This will determine if the info.buyer object is present or not. |
is_seller |
Boolean |
Check if the lead is a seller. This will determine if the info.seller object is present or not. |
seller |
Object |
Contains the seller information of the lead if they are a seller. |
source |
String |
The source from which the lead came into the CINC platform. |
status |
String |
The current status of the lead. |
Lead Assigned Agents Structure
Example object: Assigned Agents Structure
"assigned_agents" : {
"primary_agent" : {
"id" : "AGENT_MDID3"
},
"listing_agent" : {
"id" : "AGENT_MDID5"
},
"partner" : {
"id" : "AGENT_MDID7"
}
}
The assigned agent information is structured in the following manner:
Field | Type | Description |
---|---|---|
primary_agent.id |
String |
ID of the assigned agent. |
listing_agent.id |
String |
ID of the assigned listing agent. |
partner.id |
String |
ID of the assigned partner. |
Lead Buyer Info Structure
Example object: Buyer Info Structure
"buyer_info":{
"median_price":0,
"average_price":250000,
"favorite_city":"Dallas",
"timeline":"4 to 6 weeks"
}
The buyer information is structured in the following manner:
Field | Type | Description |
---|---|---|
median_price |
Number |
Median price of housing that the lead is looking for. |
average_price |
Number |
Average price of housing that the lead is looking for. |
favorite_city |
String |
Lead's favorite city. |
timeline |
String |
The timeline when the lead wants to buy. |
Lead Contact Info Structure
Example object: Lead Contact Info Structure
"contact": {
"first_name": "Janis",
"last_name": "A. Doe",
"phone_numbers": {
"cell_phone": "9127562309"
},
"email": "jane.doe@email.com",
"mailing_address": {
"street": "9390 Ford Ave",
"city": "Richmond Hill",
"state": "Georgia",
"postal_or_zip" : "31324"
}
}
The contact information is structured in the following manner:
Field | Type | Description |
---|---|---|
first_name |
String |
The first name of the lead. |
last_name |
String |
The last name of the lead (This may include middle name). |
phone_numbers |
Object |
The registered phone numbers provided by the lead. |
phone_numbers.cell_phone |
String |
The registered primary phone number provided by the lead. |
phone_numbers.home_phone |
String |
The registered home phone number provided by the lead. |
phone_numbers.work_phone |
String |
The registered work phone number provided by the lead. |
phone_numbers.office_phone |
String |
The registered office phone number provided by the lead. |
email |
String |
The registered email provided by the lead. |
mailing_address |
Object |
The address in order to send mail to the lead. |
mailing_address.street |
String |
The street for the mailing address of the lead. |
mailing_address.city |
String |
The city for the mailing address of the lead. |
mailing_address.state |
String |
The state for the mailing address of the lead. |
mailing_address.postal_or_zip |
String |
The postal/zip code for the mailing address of the lead. |
Lead Seller Info Structure
Example object: Seller Info Structure
"seller_info":{
"timeline":"4 to 6 weeks"
}
The seller information is structured in the following manner:
Field | Type | Description |
---|---|---|
timeline |
String |
The timeline when the lead wants to sell. |
Lead Status
The status of the lead indicates where in the system that the individual is being worked. If the status cannot be determined, it will not be present. The values are currently restricted through the CINC API to the following:
"unworked"
: The lead is new and has not been assigned any kind of workflow."inprogress"
: The lead is being worked within the CINC platform."closed"
: A lead that has closed in some regard within the CINC platform."trash"
: A deleted lead that is no longer valid within the system.
API Endpoints
The CINC API follows a simple HTTP API. Developers can integrate to this interface following the authorization requirements.
site/agents
version 2.0
The top level agents endpoint provides a listing of all existing agents.
The information is presented at the level of broker.
This means the calls to these endpoints must be accomplished with an access token with broker privileges.
In order to get from these endpoints, the scope api:read
must be present.
GET site/agents
version 2.0
This endpoint allows for getting all existing agents based on their offset.
For more information, read the sections on pagination and rate limits.
The required scope to access this endpoint is api:read
.
Example request: GET site/agents
curl -X GET -G "https://public.cincapi.com/site/agents" \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Bearer: Ad3Zjsd4tU209aJd" \
-d "offset=0" \
-d "limit=2"
// In production code, don't destroy the HttpClient through using, but better use IHttpClientFactory factory or at least reuse an existing HttpClient instance
// https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests
// https://www.aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("GET"), "https://public.cincapi.com/site/agents?offset=0&limit=2"))
{
request.Headers.TryAddWithoutValidation("Bearer", "Ad3Zjsd4tU209aJd");
var response = await httpClient.SendAsync(request);
}
}
fetch('https://public.cincapi.com/site/agents?offset=0&limit=2', {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
'Bearer': 'Ad3Zjsd4tU209aJd'
}
})
.then(response => response.json())
.then(data => console.log(data));
import requests
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Bearer': 'Ad3Zjsd4tU209aJd',
}
params = {
'offset': '0',
'limit': '2',
}
response = requests.get('https://public.cincapi.com/site/agents', params=params, headers=headers)
Example response
"body": {
"paging":{
"offset":0,
"next":"8",
"limit":2,
"count":2
},
"agents": [
{
"id":"agentid",
"registered_date":"2022-12-18T20:27:25Z",
"info": {
"contact": {
"first_name":"Agent",
"last_name":"Peepeepoopoo",
"email":"agentpeepoo@capi.test",
"phone_numbers": {
"cell_phone":"4044041234"
}
},
"status": "active"
}
},
{
"id":"AGENT_MDID0",
"registered_date":"2022-01-11T09:32:05Z",
"info":{
"contact": {
"first_name":"Eddie",
"last_name":"Mellor",
"email":"pume@efpu.bj",
"phone_numbers": {
"cell_phone":"4628874518"
}
},
"status": "active"
}
}
]
},
"header": {
"x-rate-limit-limit" : 100,
"x-rate-limit-remaining" : 91,
"x-rate-limit-reset" : "2022-05-20T09:00:00Z"
}
Query Parameters
Name | Type | Description |
---|---|---|
offset |
Number |
Optional The number of agents to skip before starting to return new agents result from the query. Without specifying, the default is 0 . |
limit |
Number |
Optional The max number of agents that should be returned. The default is 10 and the max is 500 . |
GET site/agents/{agent_id}
version 2.0
This endpoint gets the current specified agent's data.
For more information, read the section on rate limits.
The required scope to access this endpoint is api:read
.
Example request: GET site/agents/{agent_id}
curl -X GET -G "https://public.cincapi.com/site/agents/agentid" \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Bearer: Ad3Zjsd4tU209aJd"
// In production code, don't destroy the HttpClient through using, but better use IHttpClientFactory factory or at least reuse an existing HttpClient instance
// https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests
// https://www.aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("GET"), "https://public.cincapi.com/site/agents/agentid"))
{
request.Headers.TryAddWithoutValidation("Bearer", "Ad3Zjsd4tU209aJd");
var response = await httpClient.SendAsync(request);
}
}
fetch('https://public.cincapi.com/site/agents/agentid', {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
'Bearer': 'Ad3Zjsd4tU209aJd'
}
})
.then(response => response.json())
.then(data => console.log(data));
import requests
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Bearer': 'Ad3Zjsd4tU209aJd',
}
response = requests.get('https://public.cincapi.com/site/agents/agentid', headers=headers)
Example response
"body": {
"agent":{
"id":"agentid",
"registered_date":"2022-12-18T20:27:25Z",
"info":{
"contact": {
"first_name":"Agent",
"last_name":"Peepeepoopoo",
"email":"agentpeepoo@capi.test",
"phone_numbers":{
"cell_phone":"4044041234"
},
"status": "active"
}
}
}
},
"header": {
"x-rate-limit-limit" : 100,
"x-rate-limit-remaining" : 91,
"x-rate-limit-reset" : "2022-05-20T09:00:00Z"
}
Path Parameters
Name | Type | Description |
---|---|---|
agent_id |
String |
Required Unique agent identifier. |
site/leads
version 2.0
The top level leads endpoint provides a listing of all existing leads.
The information is presented at the level of a broker.
This means the calls to these endpoints must be accomplished with an access token with broker privileges.
In order to get from these endpoints, the scope api:read
must be present.
The post endpoint for upserting leads will require scope api:create
.
GET site/leads
version 2.0
This endpoint allows for getting all existing leads based on their offset.
For more information, read the sections on pagination and rate limits.
The required scope to access this endpoint is api:read
.
Example request: GET site/leads
curl -X GET -G "https://public.cincapi.com/site/leads" \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Bearer: Ad3Zjsd4tU209aJd" \
-d "offset=0" \
-d "limit=2"
// In production code, don't destroy the HttpClient through using, but better use IHttpClientFactory factory or at least reuse an existing HttpClient instance
// https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests
// https://www.aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("GET"), "https://public.cincapi.com/site/leads?offset=0&limit=2"))
{
request.Headers.TryAddWithoutValidation("Bearer", "Ad3Zjsd4tU209aJd");
var response = await httpClient.SendAsync(request);
}
}
fetch('https://public.cincapi.com/site/leads?offset=0&limit=2', {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
'Bearer': 'Ad3Zjsd4tU209aJd'
}
})
.then(response => response.json())
.then(data => console.log(data));
import requests
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Bearer': 'Ad3Zjsd4tU209aJd',
}
params = {
'offset': '0',
'limit': '2',
}
response = requests.get('https://public.cincapi.com/site/leads', params=params, headers=headers)
Example response
"body": {
"paging":{
"offset":0,
"next":"9",
"limit":2,
"count":2
},
"leads": [
{
"id":"mymdidwoah",
"registered_date":"2023-01-18T20:27:25Z",
"info": {
"contact": {
"first_name":"Ana",
"last_name":"Heard",
"email":"anaheard@capi.test",
"phone_numbers": {
"cell_phone":"4706996288"
}
},
"is_buyer": false,
"is_seller": true,
"seller": {
"timeline": "4 to 6 weeks"
},
"assigned_agents": {
"primary_agent": {
"id": "AGENT_MDID1"
},
"listing_agent": {
"id": "AGENT_MDID4"
},
"partner": {
"id": "AGENT_MDID9"
}
},
"source" : "Facebook",
"status" : "unworked"
},
},
{
"id":"LEAD_MDID0",
"registered_date":"2022-11-06T21:41:00Z",
"info":{
"contact": {
"first_name":"Devin",
"last_name":"Norton",
"email":"mo@rijegmo.fk",
"phone_numbers": {
"cell_phone":"3703089435"
}
},
"is_buyer": true,
"buyer": {
"median_price" : 0,
"average_price" : 250000,
"favorite_city" : "Dallas",
"timeline" : "4 to 6 weeks"
},
"is_seller": false,
"assigned_agents": {
"primary_agent": {
"id": "AGENT_MDID3"
},
"listing_agent": {
"id": "AGENT_MDID5"
},
"partner": {
"id": "AGENT_MDID7"
}
},
"source" : "Facebook",
"status" : "unworked"
},
}
]
},
"header": {
"x-rate-limit-limit" : 100,
"x-rate-limit-remaining" : 91,
"x-rate-limit-reset" : "2022-05-20T09:00:00Z"
}
Query Parameters
Name | Type | Description |
---|---|---|
offset |
Number |
Optional The number of leads to skip before starting to return new leads result from the query. Without specifying, the default is 0 . |
limit |
Number |
Optional The max number of leads that should be returned. The default is 10 and the max is 500 . |
GET site/leads/{lead_id}
version 2.0
This endpoint gets the current specified lead's data.
For more information, read the section on rate limits.
The required scope to access this endpoint is api:read
.
Example request: GET site/leads/{lead_id}
curl -X GET -G "https://public.cincapi.com/site/leads/LEAD_MDID0" \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Bearer: Ad3Zjsd4tU209aJd"
// In production code, don't destroy the HttpClient through using, but better use IHttpClientFactory factory or at least reuse an existing HttpClient instance
// https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests
// https://www.aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("GET"), "https://public.cincapi.com/site/leads/LEAD_MDID0"))
{
request.Headers.TryAddWithoutValidation("Bearer", "Ad3Zjsd4tU209aJd");
var response = await httpClient.SendAsync(request);
}
}
fetch('https://public.cincapi.com/site/leads/LEAD_MDID0', {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
'Bearer': 'Ad3Zjsd4tU209aJd'
}
})
.then(response => response.json())
.then(data => console.log(data));
import requests
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Bearer': 'Ad3Zjsd4tU209aJd',
}
response = requests.get('https://public.cincapi.com/site/leads/LEAD_MDID0', headers=headers)
Example response
"body": {
"lead": {
"id":"LEAD_MDID0",
"registered_date":"2022-11-06T21:41:00Z",
"info": {
"contact": {
"first_name": "Devin",
"last_name": "Norton",
"email": "mo@rijegmo.fk",
"phone_numbers": {
"cell_phone": "3703089435"
}
},
"is_buyer": true,
"buyer": {
"median_price": 0,
"average_price": 550000,
"favorite_city": "Atlanta",
"timeline": ""
},
"is_seller": false,
"assigned_agents": {
"primary_agent": {
"id": "AGENT_MDID3"
},
"listing_agent": {
"id": "AGENT_MDID5"
},
"partner": {
"id": "AGENT_MDID7"
}
},
"source": "Facebook",
"status": "unworked"
},
}
},
"header": {
"x-rate-limit-limit" : 100,
"x-rate-limit-remaining" : 91,
"x-rate-limit-reset" : "2022-05-20T09:00:00Z"
}
Path Parameters
Name | Type | Description |
---|---|---|
lead_id |
String |
Required Unique lead identifier. |
POST site/leads
version 2.0
This endpoint creates a new lead if there are no conflicts with the info.lead.contact.email
attribute.
The call is currently a synchronous creation.
For more information, read the section on rate limits.
The required scope to access this endpoint is api:create
.
Example request: POST site/leads
curl -X POST -G "https://public.cincapi.com/site/leads" \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Bearer: Ad3Zjsd4tU209aJd" \
-d '{
"registered_date": "2022-04-14T09:21:43.371Z",
"info": {
"contact": {
"first_name": "Janis",
"last_name": "A. Doe",
"phone_numbers": {
"cell_phone": "9127562309"
},
"email": "jane.doe@email.com",
"mailing_address": {
"street": "9390 Ford Ave",
"city": "Richmond Hill",
"state": "Georgia",
"postal_code": "31324"
}
},
"is_buyer": true,
"buyer": {
"median_price": 0,
"average_price": 250000,
"favorite_city": "Dallas",
"timeline": "4 to 6 weeks"
},
"is_seller": false,
"seller": {
"timeline": "4 to 6 weeks"
},
"assigned_agents": {
"primary_agent": {
"id": "AGENT_MDID3"
},
"listing_agent": {
"id": "AGENT_MDID5"
},
"partner": {
"id": "AGENT_MDID7"
}
}
}
}'
// In production code, don't destroy the HttpClient through using, but better use IHttpClientFactory factory or at least reuse an existing HttpClient instance
// https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests
// https://www.aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://public.cincapi.com/site/leads"))
{
request.Headers.TryAddWithoutValidation("Bearer", "Ad3Zjsd4tU209aJd");
request.Content = new StringContent(@"{
""registered_date"" : ""2022-04-14T09:21:43.371Z"",
""info"" : {
""contact"" : {
""first_name"" : ""Janis"",
""last_name"" : ""A. Doe"",
""phone_numbers"" : {
""cell_phone"" : ""9127562309""
},
""email"" : ""jane.doe@email.com"",
""mailing_address"" : {
""street"" : ""9390 Ford Ave"",
""city"" : ""Richmond Hill"",
""state"" : ""Georgia"",
""postal_code"" : ""31324""
}
},
""is_buyer"" : true,
""buyer"" : {
""median_price"" : 0,
""average_price"" : 250000,
""favorite_city"" : ""Dallas"",
""timeline"" : ""4 to 6 weeks""
},
""is_seller"" : false,
""seller"" : {
""timeline"":""4 to 6 weeks""
},
""assigned_agents"" : {
""primary_agent"" : {
""id"" : ""AGENT_MDID3""
},
""listing_agent"" : {
""id"" : ""AGENT_MDID5""
},
""partner"" : {
""id"" : ""AGENT_MDID7""
}
}
}
}
",
Encoding.UTF8,
"application/json")
}
}
const data = {
registered_date: '2022-04-14T09:21:43.371Z',
info: {
contact: {
first_name: "Janis",
last_name: "A. Doe",
phone_numbers: {
cell_phone: "9127562309"
},
email: "jane.doe@email.com",
mailing_address: {
street: "9390 Ford Ave",
city: "Richmond Hill",
state: "Georgia",
postal_code: "31324"
}
},
is_buyer: true,
buyer: {
median_price: 0,
average_price: 250000,
favorite_city: "Dallas",
timeline: "4 to 6 weeks"
},
is_seller: false,
seller: {
timeline: "4 to 6 weeks"
},
assigned_agents: {
primary_agent: {
id: "AGENT_MDID3"
},
listing_agent: {
id: "AGENT_MDID5"
},
partner: {
id: "AGENT_MDID7"
}
}
}
}
fetch('https://public.cincapi.com/site/leads', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
'Bearer': 'Ad3Zjsd4tU209aJd'
},
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data));
import requests
data = {
"registered_date": "2022-04-14T09:21:43.371Z",
"info": {
"contact": {
"first_name": "Janis",
"last_name": "A. Doe",
"phone_numbers": {
"cell_phone": "9127562309"
},
"email": "jane.doe@email.com",
"mailing_address": {
"street": "9390 Ford Ave",
"city": "Richmond Hill",
"state": "Georgia",
"postal_code": "31324"
}
},
"is_buyer": True,
"buyer": {
"median_price": 0,
"average_price": 250000,
"favorite_city": "Dallas",
"timeline": "4 to 6 weeks"
},
"is_seller": False,
"seller": {
"timeline": "4 to 6 weeks"
},
"assigned_agents": {
"primary_agent": {
"id": "AGENT_MDID3"
},
"listing_agent": {
"id": "AGENT_MDID5"
},
"partner": {
"id": "AGENT_MDID7"
}
}
}
}
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Bearer': 'Ad3Zjsd4tU209aJd',
}
response = requests.post('https://public.cincapi.com/site/leads', headers=headers, json=data)
Example response
"body": {
"lead": {
"id": "LEAD_MDID0"
}
},
"header": {
"x-rate-limit-limit" : 100,
"x-rate-limit-remaining" : 91,
"x-rate-limit-reset" : 1677130510
}
Request Body
The request body is a lead object structured as a JSON object.
The field id
will be ignored and not respected when generating a lead.
The only required field when creating a new lead is lead.info.contact.email
.
This value is used to register the lead uniquely on that site.
Response Body
The response will contain the lead object with the newly constructed identifier. This identifier can immediately be used to get the lead.
site/me
version 2.0
This endpoint provides detection for who the current user is that has consented to allowing access.
It is purely provided for testing and verifying that the current access token contains a valid user.
Calls to this endpoints must be accomplished with an access token with broker privileges.
In order to get from this endpoints, the scope api:read
must be present.
GET site/me
version 2.0
This endpoint gets the current agent information that is making the request.
It is purely provided for testing and verifying that the current access token contains a valid user.
For more information, read the section on rate limits.
The required scope to access this endpoint is api:read
.
Example request: GET site/me
curl -X GET -G "https://public.cincapi.com/site/me" \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Bearer: Ad3Zjsd4tU209aJd"
// In production code, don't destroy the HttpClient through using, but better use IHttpClientFactory factory or at least reuse an existing HttpClient instance
// https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests
// https://www.aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("GET"), "https://public.cincapi.com/site/me"))
{
request.Headers.TryAddWithoutValidation("Bearer", "Ad3Zjsd4tU209aJd");
var response = await httpClient.SendAsync(request);
}
}
fetch('https://public.cincapi.com/site/me', {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
'Bearer': 'Ad3Zjsd4tU209aJd'
}
})
.then(response => response.json())
.then(data => console.log(data));
import requests
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Bearer': 'Ad3Zjsd4tU209aJd',
}
response = requests.get('https://public.cincapi.com/site/me', headers=headers)
Example response
"body": {
"id": "AGENT_MDID0",
"username": "buum@cu.com",
"roles": ["client", "broker"]
},
"header": {
"x-rate-limit-limit" : 100,
"x-rate-limit-remaining" : 91,
"x-rate-limit-reset" : 1677130510
}
Response Object
Name | Type | Description |
---|---|---|
id |
String |
The identifier representing the agent. |
username |
String |
The username of the agent that authorized the access token. |
roles |
Array[String] |
Contains a list of roles representing individual permissions of the agent pertaining to the access token. |
Pagination
All successful API responses upon paginated requests will include the field paging
.
The query parameters that were present in the request, will also be included under the paging
field unless overridden by the call.
The following table describes the common attributes associated with pagination.
Name | Type | Description |
---|---|---|
offset |
Number |
The number of rows to skip before starting to return rows from the query. |
limit |
Number |
Either the max limit allowed by the endpoint or the limit provided in the query parameters. |
next |
String |
A hash code that represents the starting point for the next page. |
count |
Number |
The amount of resources returned by the endpoint. The number has a ceiling up to the max limit. |
Rate Limits
Every response will include the current available rate for that endpoint in the header.
Header Name | Description |
---|---|
x-rate-limit-limit |
The maximum number of requests you are permitted to make per 20 seconds. |
x-rate-limit-remaining |
The number of requests remaining in the current rate limit window. |
x-rate-limit-reset |
The time at which the current rate limit window resets in ISO 8601. |
Endpoint Limits
The following table lists the starting rate limits for each endpoint per CINC site.
Endpoint | Action | Limit per 20 Seconds |
---|---|---|
site/agents |
GET | 15 |
site/agents/{agent_id} |
GET | 15 |
site/leads |
GET | 15 |
site/leads |
POST | 15 |
site/leads/{lead_id} |
GET | 15 |
site/me |
GET | 15 |
Too Many Requests
The HTTP error 429 (Too Many Requests) will be returned if the your request limits have been exhausted. It is standard and good practice to always properly handle and respond to this status code. Even if the returned values are indicating that some bandwidth in a previous request remained. This ensures that your requests are not ever lost. In some cases, this response may occur due to a high volume of requests hitting the API and the rates are temporarily lowered to investigate root cause.