Skip to main content

Lead Lists

Create and manage lists of domains for organizing your sales pipeline. Track domains through funnel stages (discovered → contacted → qualified → converted) and import/export via CSV.

API Playground

tip

Try this endpoint live in the API Playground.

Endpoints

MethodEndpointDescription
GET/v1/listsList all your lead lists
POST/v1/listsCreate a new list
GET/v1/lists/{id}Get list with items
GET/v1/lists/{id}/enrichedGet list items with full domain data
PUT/v1/lists/{id}Update list name/description
DELETE/v1/lists/{id}Delete a list
POST/v1/lists/{id}/itemsAdd domains to a list
DELETE/v1/lists/{id}/items/{domain}Remove a domain
PUT/v1/lists/{id}/items/{domain}/statusUpdate funnel status
POST/v1/lists/{id}/bulk-statusBulk update statuses
GET/v1/lists/{id}/funnelGet funnel analytics
POST/v1/lists/import-csvImport domains from CSV

Limits

  • Maximum 50 lists per account
  • Maximum 1,000 items per list

List All Lists

GET /v1/lists
curl -H "Authorization: Bearer cdb_your_api_key_here" \
"https://api.crondb.com/v1/lists"

Response

{
"data": [
{
"id": 1,
"name": "Q1 SaaS Prospects",
"description": "SaaS companies registered in January",
"leads_count": 45,
"created_at": "2026-03-01T10:00:00Z",
"updated_at": "2026-03-20T15:00:00Z"
}
],
"count": 3
}

Create List

POST /v1/lists
ParameterTypeRequiredDescription
namestringYesList name (1–200 chars)
descriptionstringNoDescription (max 1,000 chars)
import requests

response = requests.post(
"https://api.crondb.com/v1/lists",
headers={"Authorization": "Bearer cdb_your_api_key_here"},
json={"name": "Hot Leads", "description": "High-intent domains from this week"},
)
new_list = response.json()

Add Domains to List

POST /v1/lists/{list_id}/items
ParameterTypeRequiredDescription
itemsarrayYesArray of {domain, notes} objects

Duplicates are automatically skipped.

curl -X POST \
-H "Authorization: Bearer cdb_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"items": [
{"domain": "example.com", "notes": "From intent feed"},
{"domain": "startup.io", "notes": "High confidence"}
]
}' \
"https://api.crondb.com/v1/lists/1/items"

Response (201)

{
"added": 2,
"leads_count": 47
}

Get Enriched List

GET /v1/lists/{list_id}/enriched

Returns list items enriched with full domain intelligence data from PostgreSQL (industry, tech stack, contacts, confidence).

{
"id": 1,
"name": "Q1 SaaS Prospects",
"items": [
{
"id": 10,
"domain": "example.com",
"notes": "From intent feed",
"status": "contacted",
"added_at": "2026-03-15T10:00:00Z",
"lead": {
"domain": "example.com",
"industry": "Technology",
"business_type": "B2B SaaS",
"confidence": 0.92,
"website_email": "hello@example.com",
"registrant_country": "US"
}
}
]
}

Update Funnel Status

PUT /v1/lists/{list_id}/items/{domain}/status

Track domains through your sales funnel.

StatusDescription
discoveredInitial state — just added to list
contactedOutreach sent
qualifiedLead confirmed as a good fit
convertedDeal closed or goal achieved
curl -X PUT \
-H "Authorization: Bearer cdb_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"status": "contacted"}' \
"https://api.crondb.com/v1/lists/1/items/example.com/status"

Funnel Analytics

GET /v1/lists/{list_id}/funnel

Get funnel stage counts, conversion rates, and average time in each stage.

Response

{
"total": 45,
"stages": [
{"stage": "discovered", "count": 20, "percentage": 44.4},
{"stage": "contacted", "count": 15, "percentage": 33.3},
{"stage": "qualified", "count": 7, "percentage": 15.6},
{"stage": "converted", "count": 3, "percentage": 6.7}
],
"conversions": [
{"from": "discovered", "to": "contacted", "rate": 75.0},
{"from": "contacted", "to": "qualified", "rate": 46.7},
{"from": "qualified", "to": "converted", "rate": 42.9}
],
"avg_days_in_stage": {
"discovered": 3.2,
"contacted": 5.1,
"qualified": 8.4,
"converted": 2.0
},
"conversion_goal": 15.0
}

Import CSV

POST /v1/lists/import-csv

Import domains from a CSV file. The file should have a domain column (or the first column is used).

Parameters (multipart form)

ParameterTypeRequiredDescription
filefileYesCSV/TSV file (max 5MB)
list_idintegerNoAdd to existing list
list_namestringNoCreate new list with this name
curl -X POST \
-H "Authorization: Bearer cdb_your_api_key_here" \
-F "file=@leads.csv" \
-F "list_name=Imported Leads" \
"https://api.crondb.com/v1/lists/import-csv"
import requests

with open("leads.csv", "rb") as f:
response = requests.post(
"https://api.crondb.com/v1/lists/import-csv",
headers={"Authorization": "Bearer cdb_your_api_key_here"},
files={"file": f},
data={"list_name": "Imported Leads"},
)

result = response.json()
print(f"Added {result['domains_added']}, skipped {result['domains_skipped']}")

Response (201)

{
"list_id": 5,
"list_name": "Imported Leads",
"domains_added": 87,
"domains_skipped": 13,
"total_in_file": 100
}

Funnel Analytics

Each domain in a lead list carries a status (one of discovered, contacted, qualified, converted). The funnel endpoint rolls those up into stage counts, conversion rates between adjacent stages, and average days-in-stage.

Endpoint

GET /v1/lists/{list_id}/funnel

Example Request

curl -X GET \
-H "Authorization: Bearer cdb_your_api_key_here" \
"https://api.crondb.com/v1/lists/5/funnel"

Response

{
"total": 142,
"stages": [
{ "stage": "discovered", "count": 88, "percentage": 62.0 },
{ "stage": "contacted", "count": 32, "percentage": 22.5 },
{ "stage": "qualified", "count": 14, "percentage": 9.9 },
{ "stage": "converted", "count": 8, "percentage": 5.6 }
],
"conversions": [
{ "from": "discovered", "to": "contacted", "rate": 36.4 },
{ "from": "contacted", "to": "qualified", "rate": 43.8 },
{ "from": "qualified", "to": "converted", "rate": 57.1 }
],
"avg_days_in_stage": {
"discovered": 18.2,
"contacted": 4.1,
"qualified": 6.8,
"converted": 21.4
},
"conversion_goal": null
}

Response Fields

FieldDescription
totalAll items in the list, regardless of stage.
stages[]Stage-level rollup. percentage is the share of total.
conversions[]Adjacent-stage conversion rates. rate = to.count / from.count × 100. Use this to find the leakiest stage in your funnel.
avg_days_in_stageAverage days an item has been in its current stage (using status_changed_at, falling back to added_at). High values for non-terminal stages flag stalled deals.
conversion_goalOptional list-level target conversion rate, if set on the list.

Update an item's stage

Use the standard list-item PATCH endpoint to advance an item:

curl -X PATCH \
-H "Authorization: Bearer cdb_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"status": "contacted"}' \
"https://api.crondb.com/v1/lists/5/items/{item_id}"

Status updates stamp status_changed_at automatically — that timestamp drives the days-in-stage calculation.

CSV export

GET /v1/lists/{list_id}/funnel/export

Returns text/csv with columns: Domain, Status, Notes, Added At, Status Changed At. Useful for piping to spreadsheets or BI tools.


Notes

  • URLs in CSV are automatically cleaned (protocol/path stripped)
  • Invalid domain formats are skipped
  • Duplicate domains (already in list) are skipped
  • Supported column names: domain, domains, website, url, site
  • Funnel stages are fixed: discovered → contacted → qualified → converted. They cannot be customized per list (yet).
  • For cross-list funnel rollups, see Intelligence → Funnel Trends.

Next Steps