REST API reference

Crexi API

13 endpoints for Crexi. Each one is a POST with a JSON body, called with your API key.

Base URL
https://cotlet.dev/api/v1/crexi
Connects with
Your own Crexi account (leads, exports and campaign stats need Crexi Pro; comps need Crexi Intelligence)
Integration page
Crexi
Crexi Endpoints
Endpoint Access Description
list_my_listings read Your sale, lease and auction listings with status, price and address.
get_listing read Full listing: property details, price, description, documents and URL.
get_listing_analytics read Impressions, page views, visitors and document opens from the property dashboard, plus campaign emails, opens and clicks for Pro.
list_leads read Leads from Lead Activity with contact details, company, industry role, actions taken and latest activity. Pro for full contact info.
get_lead read One lead's activity history on your listings.
get_export read Status of an export (pending, generating, completed or error) and a download link when ready.
list_saved_searches read The names of your saved marketplace searches.
run_saved_search read Runs one of your saved searches and returns the listings Crexi shows for it.
search_comps read Sales comps from Crexi Intelligence: sale price, sale date, cap rate, size and brokers. Needs an Intelligence subscription.
export_lead_report write Start a Lead Report export for the last 30 days or a range up to 12 months back.
contact_leads write Email one lead or a group of leads from Crexi, as you. Pro only.
create_listing write New sale or lease listing on the marketplace, from property details and document URLs.
update_listing_status write Change a listing's status on the marketplace, for example to under contract or sold.

POST https://cotlet.dev/api/v1/crexi/list_my_listings

Lists the listings in My Listings, with the type, the status Crexi shows, the asking price and the address. Use listing_id from each item in the other tools. Pages hold up to 100 listings; pass next_cursor back as cursor for the next page.

Parameters

Parameters: list_my_listings
NameTypeDescription
type enum sale, lease or auction. Default: all.
status string Only listings with this status, as shown in My Listings.
limit integer 1 to 100. Default: 50.
cursor string Next page cursor from the previous call.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/crexi/list_my_listings \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("crexi", "list_my_listings")
Node.js
const result = await cotlet.call('crexi', 'list_my_listings');
CLI
cotlet call crexi list_my_listings

Example response

{
  "listings": [
    {
      "listing_id": "1874523",
      "type": "sale",
      "name": "Oak Plaza Retail Center",
      "address": "1200 Oak Street, Austin, TX 78701",
      "status": "Active",
      "asking_price": 2850000
    },
    {
      "listing_id": "1869910",
      "type": "lease",
      "name": "120 Main St Suite 200",
      "address": "120 Main Street, Dallas, TX 75201",
      "status": "Active",
      "asking_price": null
    }
  ],
  "next_cursor": null
}

POST https://cotlet.dev/api/v1/crexi/get_listing

Returns one of your listings with its property details, asking price, description, attached documents and public URL. Use it to check what is live before changing status or contacting leads.

Parameters

Parameters: get_listing
NameTypeDescription
listing_id required string Listing ID from list_my_listings.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/crexi/get_listing \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"listing_id":"listing_8c41d2"}'
Python
result = client.call("crexi", "get_listing", {"listing_id":"listing_8c41d2"})
Node.js
const result = await cotlet.call('crexi', 'get_listing', {"listing_id":"listing_8c41d2"});
CLI
cotlet call crexi get_listing --data '{"listing_id":"listing_8c41d2"}'

Example response

{
  "listing_id": "1874523",
  "type": "sale",
  "name": "Oak Plaza Retail Center",
  "address": "1200 Oak Street, Austin, TX 78701",
  "property_type": "Retail",
  "asking_price": 2850000,
  "status": "Active",
  "documents": [
    {
      "name": "Offering Memorandum",
      "url": "https://example.com/oak-plaza-om.pdf"
    }
  ],
  "url": "https://www.crexi.com/properties/1874523/texas-oak-plaza-retail-center"
}

POST https://cotlet.dev/api/v1/crexi/get_listing_analytics

Returns the numbers the property overview dashboard shows for one listing. Impressions count how often the listing was displayed, page views are unique visits from any user, visitors are logged-in users and document opens are views of files such as flyers and offering memorandums. Campaign figures (emails sent, opens, clicks) are returned for Pro members only.

Parameters

Parameters: get_listing_analytics
NameTypeDescription
listing_id required string Listing ID from list_my_listings.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/crexi/get_listing_analytics \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"listing_id":"1874523"}'
Python
result = client.call("crexi", "get_listing_analytics", {"listing_id":"1874523"})
Node.js
const result = await cotlet.call('crexi', 'get_listing_analytics', {"listing_id":"1874523"});
CLI
cotlet call crexi get_listing_analytics --data '{"listing_id":"1874523"}'

Example response

{
  "listing_id": "1874523",
  "impressions": 4120,
  "page_views": 318,
  "visitors": 96,
  "document_opens": 41,
  "campaigns": {
    "emails_sent": 250,
    "opens": 112,
    "clicks": 37
  }
}

List leads

read

POST https://cotlet.dev/api/v1/crexi/list_leads

Lists leads across your listings, or on one listing, with the same filters as Lead Activity: level of interest, industry role and a date range. Pro members see full contact info and the time and type of each action; other plans see less. Pass lead_id to get_lead or lead_ids to contact_leads.

Parameters

Parameters: list_leads
NameTypeDescription
listing_id string Only leads on this listing. Default: all listings.
interest string Level of interest, as Crexi shows it.
industry_role string Industry role, as Crexi shows it, for example Investor or Broker.
since date Only leads active on or after this date.
cursor string Next page cursor from the previous call.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/crexi/list_leads \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("crexi", "list_leads")
Node.js
const result = await cotlet.call('crexi', 'list_leads');
CLI
cotlet call crexi list_leads

Example response

{
  "leads": [
    {
      "lead_id": "ld_4102",
      "name": "Dana Whitfield",
      "company": "Northgate Capital",
      "industry_role": "Investor",
      "interest": "High",
      "listing_id": "1874523",
      "last_action": "Opened document",
      "last_activity_at": "2026-10-08T14:12:00Z"
    },
    {
      "lead_id": "ld_4107",
      "name": "Marcus Reyes",
      "company": "Reyes Holdings",
      "industry_role": "Investor",
      "interest": "Medium",
      "listing_id": "1874523",
      "last_action": "Viewed listing",
      "last_activity_at": "2026-10-07T09:40:00Z"
    }
  ],
  "next_cursor": null
}

Get lead

read

POST https://cotlet.dev/api/v1/crexi/get_lead

Returns one lead with every action it took on your listings, as shown in Activity History, with the time and type of each action. Full detail needs Pro.

Parameters

Parameters: get_lead
NameTypeDescription
lead_id required string Lead ID from list_leads.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/crexi/get_lead \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"lead_id":"lead_8c41d2"}'
Python
result = client.call("crexi", "get_lead", {"lead_id":"lead_8c41d2"})
Node.js
const result = await cotlet.call('crexi', 'get_lead', {"lead_id":"lead_8c41d2"});
CLI
cotlet call crexi get_lead --data '{"lead_id":"lead_8c41d2"}'

Example response

{
  "lead_id": "ld_4102",
  "name": "Dana Whitfield",
  "company": "Northgate Capital",
  "industry_role": "Investor",
  "activity": [
    {
      "listing_id": "1874523",
      "action": "Opened document",
      "at": "2026-10-08T14:12:00Z"
    },
    {
      "listing_id": "1874523",
      "action": "Viewed listing",
      "at": "2026-10-06T10:03:00Z"
    }
  ]
}

Get export

read

POST https://cotlet.dev/api/v1/crexi/get_export

Returns the status of one export from the Export hub. Pending means it waits in Crexi's queue, generating means it is running, completed means the file is ready, and error means it failed, in which case you can start it again. A completed export keeps its download link, so you can fetch it again later.

Parameters

Parameters: get_export
NameTypeDescription
export_id required string Export ID from export_lead_report.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/crexi/get_export \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"export_id":"export_8c41d2"}'
Python
result = client.call("crexi", "get_export", {"export_id":"export_8c41d2"})
Node.js
const result = await cotlet.call('crexi', 'get_export', {"export_id":"export_8c41d2"});
CLI
cotlet call crexi get_export --data '{"export_id":"export_8c41d2"}'

Example response

{
  "export_id": "ex_30911",
  "type": "lead_report",
  "status": "completed",
  "download_url": "https://www.crexi.com/dashboard/exports/ex_30911"
}

POST https://cotlet.dev/api/v1/crexi/list_saved_searches

Returns the marketplace searches saved in your account, by name. Pass a name or ID to run_saved_search.

Parameters

No parameters.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/crexi/list_saved_searches \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("crexi", "list_saved_searches")
Node.js
const result = await cotlet.call('crexi', 'list_saved_searches');
CLI
cotlet call crexi list_saved_searches

Example response

{
  "searches": [
    {
      "saved_search": "Dallas retail under $3M"
    }
  ]
}

POST https://cotlet.dev/api/v1/crexi/search_comps

Searches the sales comps in Crexi Intelligence around a location. Each comp includes asking price, sale date, sale price, closing cap rate, address, square footage and listing brokers. The call fails with a plan error if the signed-in account has no Intelligence subscription.

Parameters

Parameters: search_comps
NameTypeDescription
location required string Address, city or ZIP code.
property_type string Property type, as offered in Crexi Intelligence.
sold_after date Only sales on or after this date.
limit integer 1 to 100. Default: 25.
cursor string Next page cursor from the previous call.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/crexi/search_comps \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"location":"1200 Oak Street, Austin, TX 78701","property_type":"Industrial","sold_after":"2024-10-01"}'
Python
result = client.call("crexi", "search_comps", {"location":"1200 Oak Street, Austin, TX 78701","property_type":"Industrial","sold_after":"2024-10-01"})
Node.js
const result = await cotlet.call('crexi', 'search_comps', {"location":"1200 Oak Street, Austin, TX 78701","property_type":"Industrial","sold_after":"2024-10-01"});
CLI
cotlet call crexi search_comps --data '{"location":"1200 Oak Street, Austin, TX 78701","property_type":"Industrial","sold_after":"2024-10-01"}'

Example response

{
  "comps": [
    {
      "address": "2210 Industrial Blvd, Austin, TX 78744",
      "property_type": "Industrial",
      "sale_date": "2025-06-12",
      "sale_price": 4200000,
      "asking_price": 4350000,
      "cap_rate": 6.8,
      "square_feet": 31000,
      "listing_broker": "Example Realty"
    }
  ],
  "next_cursor": null
}

POST https://cotlet.dev/api/v1/crexi/export_lead_report

Starts a Lead Report export, the same as Export Lead Report in Lead Activity. It returns an export_id; poll get_export until the status is completed. It reaches no one and only adds a file to your Exports section, which you can delete there, so it runs without asking first.

Parameters

Parameters: export_lead_report
NameTypeDescription
from date Start date, at most 12 months ago. Default: 30 days ago.
to date End date. Default: today.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/crexi/export_lead_report \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"from":"2026-09-01","to":"2026-09-30"}'
Python
result = client.call("crexi", "export_lead_report", {"from":"2026-09-01","to":"2026-09-30"})
Node.js
const result = await cotlet.call('crexi', 'export_lead_report', {"from":"2026-09-01","to":"2026-09-30"});
CLI
cotlet call crexi export_lead_report --data '{"from":"2026-09-01","to":"2026-09-30"}'

Example response

{
  "export_id": "ex_30911",
  "type": "lead_report",
  "status": "pending",
  "from": "2026-09-01",
  "to": "2026-09-30"
}

Contact leads

write Confirm

POST https://cotlet.dev/api/v1/crexi/contact_leads

Sends one message to the leads you pass, from your Crexi account, the same as Contact Leads in Lead Activity. You set the subject and body, links are allowed, and you can copy a colleague. Crexi does not publish a recipient limit. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: contact_leads
NameTypeDescription
lead_ids required string[] Lead IDs from list_leads.
subject required string Email subject.
body required string Message text, links allowed.
cc string Email of a colleague to copy.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/crexi/contact_leads \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"lead_ids":["ld_4102","ld_4107"],"subject":"Tour of 120 Main St on Thursday","body":"Thanks for opening the OM. We are touring the property Thursday at 10 am. Reply to reserve a spot."}'
Python
result = client.call("crexi", "contact_leads", {"lead_ids":["ld_4102","ld_4107"],"subject":"Tour of 120 Main St on Thursday","body":"Thanks for opening the OM. We are touring the property Thursday at 10 am. Reply to reserve a spot."})
Node.js
const result = await cotlet.call('crexi', 'contact_leads', {"lead_ids":["ld_4102","ld_4107"],"subject":"Tour of 120 Main St on Thursday","body":"Thanks for opening the OM. We are touring the property Thursday at 10 am. Reply to reserve a spot."});
CLI
cotlet call crexi contact_leads --data '{"lead_ids":["ld_4102","ld_4107"],"subject":"Tour of 120 Main St on Thursday","body":"Thanks for opening the OM. We are touring the property Thursday at 10 am. Reply to reserve a spot."}'

Example response

{
  "status": "sent",
  "recipients": 2,
  "subject": "Tour of 120 Main St on Thursday"
}

Create listing

write Confirm

POST https://cotlet.dev/api/v1/crexi/create_listing

Creates a listing in your account from the property details you pass, and attaches the documents from the URLs. It returns the listing_id and public URL. Fields Crexi requires that you leave out are returned as an error for your agent to fill in. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: create_listing
NameTypeDescription
type required enum sale or lease.
name required string Listing name, usually the property name or address.
address required string Full street address.
property_type required string Property type, as offered on the listing form.
asking_price integer Sale price in USD. Leave out for unpriced.
details object Optional fields such as square_feet, year_built, cap_rate and description.
documents string[] URLs of the flyer, OM or photos to attach.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/crexi/create_listing \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"type":"sale","name":"Jane Doe","address":"address","property_type":"property type"}'
Python
result = client.call("crexi", "create_listing", {"type":"sale","name":"Jane Doe","address":"address","property_type":"property type"})
Node.js
const result = await cotlet.call('crexi', 'create_listing', {"type":"sale","name":"Jane Doe","address":"address","property_type":"property type"});
CLI
cotlet call crexi create_listing --data '{"type":"sale","name":"Jane Doe","address":"address","property_type":"property type"}'

Example response

{
  "listing_id": "1874523",
  "type": "sale",
  "status": "created",
  "url": "https://www.crexi.com/properties/1874523/texas-oak-plaza-retail-center"
}

Update listing status

write Confirm

POST https://cotlet.dev/api/v1/crexi/update_listing_status

Updates the status of one of your listings, the same as the status update in the property dashboard. The status must be one the dashboard offers for that listing. A changed status is visible to everyone on the marketplace. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: update_listing_status
NameTypeDescription
listing_id required string Listing ID from list_my_listings.
status required string New status, as offered in the property dashboard.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/crexi/update_listing_status \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"listing_id":"listing_8c41d2","status":"status"}'
Python
result = client.call("crexi", "update_listing_status", {"listing_id":"listing_8c41d2","status":"status"})
Node.js
const result = await cotlet.call('crexi', 'update_listing_status', {"listing_id":"listing_8c41d2","status":"status"});
CLI
cotlet call crexi update_listing_status --data '{"listing_id":"listing_8c41d2","status":"status"}'

Example response

{
  "listing_id": "1874523",
  "status": "Under Contract"
}