Waterfall ICP Search

Tiered ICP contact waterfall. Checks tier 1 first, then 2, then 3, and stops when a tier returns contacts.

Endpoint

POST /api/v1/contacts/waterfall-icp

Authentication

All requests require the X-Satellyte-API-Key header. See Quickstart.

Request body

FieldTypeRequiredNotes
company_domainstringConditionalRequired if company_linkedin_url is absent.
company_linkedin_urlstringConditionalLinkedIn company URL.
max_resultsnumberNo1 to 25 contacts per matched tier. Defaults to 3.
cascadeobject[]YesOrdered role tiers to try. Min 1, max 10.
cascade[].rolestringYesRole label (decision_maker, budget_owner, influencer).
cascade[].include_titlesstring[]YesTitles to include for this tier.
cascade[].exclude_titlesstring[]NoTitles to exclude.
cascade[].locationsstring[]NoLocations or WORLD.

cURL

curl -i -X POST "https://api-staging.satellyte.ai/api/v1/contacts/waterfall-icp" \
  -H "X-Satellyte-API-Key: $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "company_domain": "stripe.com",
    "max_results": 3,
    "cascade": [
      {
        "role": "decision_maker",
        "include_titles": ["Chief Revenue Officer", "VP Sales", "Head of Sales"],
        "exclude_titles": ["assistant", "intern", "junior"],
        "locations": ["WORLD"]
      },
      {
        "role": "budget_owner",
        "include_titles": ["CEO", "Founder", "Co-Founder"],
        "locations": ["WORLD"]
      },
      {
        "role": "influencer",
        "include_titles": ["Sales Manager", "Growth Manager", "RevOps"],
        "locations": ["WORLD"]
      }
    ]
  }'

Response (200)

{
  "data": {
    "matched": false,
    "matched_tier": null,
    "matched_role": null,
    "items": [],
    "waterfall": [
      { "tier": 1, "role": "decision_maker", "status": "not_matched", "result_count": 0 },
      { "tier": 2, "role": "budget_owner",   "status": "not_matched", "result_count": 0 },
      { "tier": 3, "role": "influencer",     "status": "not_matched", "result_count": 0 }
    ]
  }
}

Response fields

FieldTypeNotes
matchedbooleanWhether any tier returned contacts.
matched_tiernumber | null1-indexed tier that produced results.
matched_rolestring | nullRole label of the matched tier.
items[]object[]Contacts from the matched tier (same shape as /contacts/find).
waterfall[]object[]Per-tier outcome. Each entry has tier, role, status (matched/not_matched), result_count.