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
| 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. |
List my listings
readPOST 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
| Name | Type | Description |
|---|---|---|
| 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 -X POST https://cotlet.dev/api/v1/crexi/list_my_listings \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("crexi", "list_my_listings") const result = await cotlet.call('crexi', 'list_my_listings'); 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
} Get listing
readPOST 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
| Name | Type | Description |
|---|---|---|
| listing_id required | string | Listing ID from list_my_listings. |
Request
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"}' result = client.call("crexi", "get_listing", {"listing_id":"listing_8c41d2"}) const result = await cotlet.call('crexi', 'get_listing', {"listing_id":"listing_8c41d2"}); 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
| Name | Type | Description |
|---|---|---|
| listing_id required | string | Listing ID from list_my_listings. |
Request
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"}' result = client.call("crexi", "get_listing_analytics", {"listing_id":"1874523"}) const result = await cotlet.call('crexi', 'get_listing_analytics', {"listing_id":"1874523"}); 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
readPOST 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
| Name | Type | Description |
|---|---|---|
| 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 -X POST https://cotlet.dev/api/v1/crexi/list_leads \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("crexi", "list_leads") const result = await cotlet.call('crexi', 'list_leads'); 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
readPOST 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
| Name | Type | Description |
|---|---|---|
| lead_id required | string | Lead ID from list_leads. |
Request
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"}' result = client.call("crexi", "get_lead", {"lead_id":"lead_8c41d2"}) const result = await cotlet.call('crexi', 'get_lead', {"lead_id":"lead_8c41d2"}); 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
readPOST 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
| Name | Type | Description |
|---|---|---|
| export_id required | string | Export ID from export_lead_report. |
Request
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"}' result = client.call("crexi", "get_export", {"export_id":"export_8c41d2"}) const result = await cotlet.call('crexi', 'get_export', {"export_id":"export_8c41d2"}); 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"
} List saved searches
readPOST 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 -X POST https://cotlet.dev/api/v1/crexi/list_saved_searches \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("crexi", "list_saved_searches") const result = await cotlet.call('crexi', 'list_saved_searches'); cotlet call crexi list_saved_searches Example response
{
"searches": [
{
"saved_search": "Dallas retail under $3M"
}
]
} Run saved search
readPOST https://cotlet.dev/api/v1/crexi/run_saved_search
Runs one saved search, by name or ID as saved in Crexi, and returns the listings Crexi shows for it. It does not change the saved search.
Parameters
| Name | Type | Description |
|---|---|---|
| saved_search required | string | Name or ID of a saved search, as saved in Crexi (see list_saved_searches). |
| limit | integer | Maximum listings to return. |
Request
curl -X POST https://cotlet.dev/api/v1/crexi/run_saved_search \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"saved_search":"saved search"}' result = client.call("crexi", "run_saved_search", {"saved_search":"saved search"}) const result = await cotlet.call('crexi', 'run_saved_search', {"saved_search":"saved search"}); cotlet call crexi run_saved_search --data '{"saved_search":"saved search"}' Example response
{
"saved_search": "Dallas retail under $3M",
"listings": [
{
"name": "Greenville Ave Retail Strip",
"address": "5400 Greenville Avenue, Dallas, TX 75206",
"asking_price": 2650000
}
]
} Search comps
readPOST 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
| Name | Type | Description |
|---|---|---|
| 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 -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"}' result = client.call("crexi", "search_comps", {"location":"1200 Oak Street, Austin, TX 78701","property_type":"Industrial","sold_after":"2024-10-01"}) const result = await cotlet.call('crexi', 'search_comps', {"location":"1200 Oak Street, Austin, TX 78701","property_type":"Industrial","sold_after":"2024-10-01"}); 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
} Export lead report
writePOST 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
| Name | Type | Description |
|---|---|---|
| from | date | Start date, at most 12 months ago. Default: 30 days ago. |
| to | date | End date. Default: today. |
Request
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"}' result = client.call("crexi", "export_lead_report", {"from":"2026-09-01","to":"2026-09-30"}) const result = await cotlet.call('crexi', 'export_lead_report', {"from":"2026-09-01","to":"2026-09-30"}); 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"
} 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
| Name | Type | Description |
|---|---|---|
| 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 -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."}' 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."}) 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."}); 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"
} 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
| Name | Type | Description |
|---|---|---|
| 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 -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"}' result = client.call("crexi", "create_listing", {"type":"sale","name":"Jane Doe","address":"address","property_type":"property type"}) const result = await cotlet.call('crexi', 'create_listing', {"type":"sale","name":"Jane Doe","address":"address","property_type":"property type"}); 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"
} 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
| Name | Type | Description |
|---|---|---|
| listing_id required | string | Listing ID from list_my_listings. |
| status required | string | New status, as offered in the property dashboard. |
Request
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"}' result = client.call("crexi", "update_listing_status", {"listing_id":"listing_8c41d2","status":"status"}) const result = await cotlet.call('crexi', 'update_listing_status', {"listing_id":"listing_8c41d2","status":"status"}); cotlet call crexi update_listing_status --data '{"listing_id":"listing_8c41d2","status":"status"}' Example response
{
"listing_id": "1874523",
"status": "Under Contract"
}