> ## Documentation Index
> Fetch the complete documentation index at: https://devtools.waterfall.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Waterfall for DevTools

> Enrichment and company data APIs for teams growing a developer product.

export const DevToolJourney = () => {
  const [path, setPath] = useState('signup');
  const [replay, setReplay] = useState(0);
  const [tip, setTip] = useState(null);
  const explain = (label, text) => {
    const show = event => {
      if (event.target.closest('.wf-endpoint')) {
        setTip(null);
        return;
      }
      const box = event.currentTarget.getBoundingClientRect();
      const frame = event.currentTarget.closest('.wf-journey').getBoundingClientRect();
      setTip({
        label,
        text,
        top: box.top - frame.top - 8,
        left: Math.max(12, Math.min(frame.width - 292, box.left - frame.left + box.width / 2 - 140))
      });
    };
    return {
      tabIndex: 0,
      role: 'group',
      'aria-label': label,
      'aria-describedby': tip?.label === label ? 'wf-step-tooltip' : undefined,
      onMouseOver: show,
      onMouseLeave: () => setTip(null),
      onFocus: show,
      onBlur: () => setTip(null),
      onKeyDown: event => {
        if (event.key === 'Escape') setTip(null);
      }
    };
  };
  const paths = [{
    id: 'visit',
    label: 'Website visitor'
  }, {
    id: 'signup',
    label: 'New signup'
  }, {
    id: 'customer',
    label: 'Existing customer'
  }];
  const captions = {
    signup: 'Match the signup to a person, enrich their company, then find the relevant team.',
    visit: 'An IP can resolve to a company. Contact search finds relevant people there, not the individual visitor.',
    customer: 'Follow a customer to their new company, enrich the account, and find other stakeholders.'
  };
  const endpoint = (x, y, width, label, href, route) => <a href={href} aria-label={`${label} API reference`} className="wf-endpoint">
    <title>{`POST ${route}`}</title><rect x={x} y={y} width={width} height="28" rx="7" /><text x={x + width / 2} y={y + 19} textAnchor="middle">{label} ↗</text>
  </a>;
  return <div className="wf-journey not-prose">
    <div className="wf-journey-controls" role="group" aria-label="Choose a customer journey">
      {paths.map(item => <button key={item.id} type="button" aria-pressed={path === item.id} onClick={() => {
    setTip(null);
    setPath(item.id);
    setReplay(replay + 1);
  }}>{item.label}</button>)}
    </div>
    <p className="wf-journey-help">Hover or focus a box for details. API labels open the reference.</p>
    <svg key={path + replay} viewBox={`0 0 720 ${path === 'customer' ? 1080 : 930}`} role="group" aria-label={captions[path]} className="wf-journey-canvas">
      <defs>
        <pattern id="wf-dots" width="22" height="22" patternUnits="userSpaceOnUse"><circle cx="3" cy="3" r="0.8" fill="#bed0ef" /></pattern>
        <linearGradient id="wf-surface" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stopColor="#ffffff" /><stop offset="1" stopColor="#f0f5ff" /></linearGradient>
      </defs>
      <rect width="720" height={path === 'customer' ? 1080 : 930} rx="16" fill="#f7f9fd" />
      <rect width="720" height={path === 'customer' ? 1080 : 930} rx="16" fill="url(#wf-dots)" />
      <circle cx="30" cy="30" r="3" fill="#006aff" />
      <text x="42" y="35" className="wf-label">{path === 'customer' ? 'A CUSTOMER MOVES COMPANIES' : 'TWO WAYS INTO AN ACCOUNT'}</text>
      {path !== 'customer' ? <>
        <g {...explain('New signup', 'Start with the personal or work email someone used to sign up.')} className={path === 'signup' ? 'wf-stage wf-stage-1' : 'wf-muted'}>
          <rect x="24" y="72" width="300" height="124" rx="10" className="wf-node" />
          <text x="174" y="102" textAnchor="middle" className="wf-label">NEW SIGNUP</text>
          <text x="174" y="138" textAnchor="middle" className="wf-code">james.dev@gmail.com</text>
          <text x="174" y="170" textAnchor="middle" className="wf-detail">Personal or work email</text>
        </g>
        <g {...explain('Pricing page visit', 'Send the visitor IP from your own site or analytics. Keep page and campaign details as metadata.')} className={path === 'visit' ? 'wf-stage wf-stage-1' : 'wf-muted'}>
          <rect x="396" y="72" width="300" height="124" rx="10" className="wf-node" />
          <text x="416" y="102" className="wf-label">PRICING PAGE VISIT</text><text x="416" y="138" className="wf-code">203.0.113.42</text><text x="416" y="170" className="wf-detail">/pricing · paid search</text>
        </g>
        {path === 'signup' ? <>
          <path d="M174 196V218H360V240" className="wf-wire wf-wire-1" />
          <g {...explain('Match the signup', 'Contact Enrichment looks up a professional profile from the email. Receive the result by polling or webhook.')} className="wf-stage wf-stage-2">
            <rect x="110" y="240" width="500" height="128" rx="10" className="wf-node" />
            <text x="132" y="270" className="wf-label">EMAIL → PERSON</text>
            {endpoint(393, 250, 205, 'Contact Enrichment', '/v1/enrich-signups', '/v1/enrichment/contact')}
            <circle cx="151" cy="318" r="23" fill="#dceaff" /><text x="151" y="324" textAnchor="middle" className="wf-label">JL</text>
            <text x="191" y="313" className="wf-name">James Lee</text><text x="191" y="341" className="wf-detail">Senior Platform Engineer · Northstar</text>
          </g>
          <path d="M360 368V416" className="wf-wire wf-wire-2" />
        </> : <>
          <path d="M546 196V218H360V240M360 368V416" className="wf-wire wf-wire-1" />
          <g {...explain('Identify the visiting company', 'Look for the company behind the IP, rather than the individual visitor.')} className="wf-stage wf-stage-2">
            <rect x="110" y="240" width="500" height="128" rx="10" className="wf-node" />
            <text x="132" y="270" className="wf-label">IP → COMPANY</text>
            {endpoint(414, 250, 184, 'Company Reveal', '/v1/identify-visitors', '/v1/company-reveal')}
            <text x="132" y="313" className="wf-name">northstar.example</text><text x="132" y="341" className="wf-detail">Company match · high confidence</text>
          </g>
        </>}
        <g {...explain('Enrich the company', 'Use the domain to get company size, industry, technologies, and funding when available. Apply your own fit rules.')} className="wf-stage wf-stage-3">
          <rect x="110" y="416" width="500" height="152" rx="10" className="wf-node" />
          <text x="132" y="446" className="wf-label">COMPANY PROFILE</text>
          {endpoint(381, 426, 217, 'Company Enrichment', '/v1/enrich-accounts', '/v1/enrichment/company')}
          <text x="132" y="482" className="wf-name">Northstar</text><text x="132" y="508" className="wf-detail">northstar.example · Streaming Services</text>
          <line x1="132" y1="523" x2="588" y2="523" stroke="#d5e1f2" /><text x="132" y="549" className="wf-detail">201–500 people</text><text x="588" y="549" textAnchor="end" className="wf-detail">San Francisco</text>
        </g>
        <path d="M360 568V588H546V610" className="wf-wire wf-wire-3" />
        <path d="M360 588H174V610M324 674H396M386 667L396 674L386 681" className="wf-wire wf-optional-wire" />
        <g {...explain('Discover company titles', "Optional: see the company's titles, then choose matches yourself or with your agent. Skip this if you already know your filters.")} className="wf-stage wf-stage-4">
          <rect x="24" y="610" width="300" height="120" rx="10" className="wf-node wf-optional-node" />
          <text x="44" y="637" className="wf-label">OPTIONAL · BETA</text>
          {endpoint(44, 650, 184, 'Company Titles', '/v1/discover-roles', '/v1/company-titles')}
          <text x="44" y="708" className="wf-detail">Discover this company's titles</text>
        </g>
        <g {...explain('Search for relevant people', 'Find people at this company using titles, Boolean filters, or department and seniority.')} className="wf-stage wf-stage-5">
          <rect x="396" y="610" width="300" height="120" rx="10" className="wf-node" />
          {endpoint(416, 623, 172, 'Search Contact', '/v1/find-people', '/v1/search/contact')}
          <text x="416" y="680" className="wf-name">Find matching people</text>
          <text x="416" y="708" className="wf-detail">Use your role filters</text>
        </g>
        <path d="M546 730V765H360V780M130 780H590M130 780V810M360 780V810M590 780V810" className="wf-wire wf-wire-4" />
        <g className="wf-stage wf-stage-6">
          {[{
    x: 24,
    name: 'Aisha Khan',
    role: 'Platform Lead'
  }, {
    x: 254,
    name: 'Marco Rossi',
    role: 'VP Engineering'
  }, {
    x: 484,
    name: 'Sam Taylor',
    role: 'CTO'
  }].map(person => <g key={person.name} {...explain(person.name, `${person.role} at the matched company. This is an example contact matching your filters, not proof of product use or buying intent.`)}><rect x={person.x} y="810" width="212" height="72" rx="10" className="wf-node" /><text x={person.x + 106} y="839" textAnchor="middle" className="wf-name">{person.name}</text><text x={person.x + 106} y="867" textAnchor="middle" className="wf-detail">{person.role}</text></g>)}
          <text x="360" y="914" textAnchor="middle" className="wf-label">COMPANY DOMAIN + YOUR ROLE FILTERS → MATCHING PEOPLE</text>
        </g>
      </> : <>
        {endpoint(509, 16, 187, 'Job Change', '/v1/track-users', '/v1/job/change')}
        <g {...explain('Previous company', 'Start with the company on your customer record and a person identifier. Employment end dates are shown when available; Aug 2026 is an example.')} className="wf-stage wf-stage-1">
          <rect x="40" y="210" width="272" height="218" rx="12" className="wf-node" />
          <text x="62" y="245" className="wf-label">PREVIOUS COMPANY</text><text x="62" y="288" className="wf-company">Northstar</text>
          <text x="62" y="325" className="wf-detail">Senior Platform Engineer</text>
          <text x="62" y="358" className="wf-detail">Ended Aug 2026</text>
          <line x1="62" y1="377" x2="290" y2="377" stroke="#d5e1f2" /><text x="62" y="406" className="wf-detail">Used your product here</text>
        </g>
        <path d="M312 304H408M397 294L408 304L397 314" className="wf-wire wf-wire-1" />
        <g {...explain('New company', 'Job Change returns the new employer, role, and employment dates when available. Sep 2026 is an example start month.')} className="wf-stage wf-stage-3">
          <rect x="408" y="210" width="272" height="218" rx="12" className="wf-node wf-new-company" />
          <text x="430" y="245" className="wf-label">NEW COMPANY</text><text x="430" y="288" className="wf-company">Orbit</text>
          <text x="430" y="325" className="wf-detail">Head of Platform Engineering</text>
          <text x="430" y="358" className="wf-detail">Started Sep 2026</text>
          <line x1="430" y1="377" x2="658" y2="377" stroke="#d5e1f2" /><text x="430" y="406" className="wf-detail">orbit.example</text>
        </g>
        <g {...explain('James Lee, customer', 'A customer you already know. Check their employment on your own schedule to see whether they have moved companies.')} className="wf-customer-slide"><rect x="40" y="87" width="230" height="84" rx="12" fill="#006aff" /><circle cx="71" cy="129" r="19" fill="#ffffff26" /><text x="71" y="134" textAnchor="middle" className="wf-inverse-detail">JL</text><text x="103" y="122" className="wf-inverse-name">James Lee</text><text x="103" y="147" className="wf-inverse-detail">Customer</text></g>
        <g {...explain('Job change found', 'Only pay when a job change is found. Unchanged or inconclusive results have no job-change charge.')} className="wf-stage wf-stage-4"><rect x="413" y="444" width="262" height="34" rx="17" fill="#e1edff" /><text x="544" y="467" textAnchor="middle" className="wf-label">✓ JOB CHANGE FOUND</text></g>
        <path d="M544 478V510H360V540" className="wf-wire wf-wire-3" />
        <g {...explain('Enrich the new account', 'Enrich the new company to check its fit and update your CRM. This is a separate, billable enrichment request.')} className="wf-stage wf-stage-4">
          <rect x="110" y="540" width="500" height="124" rx="12" className="wf-node" />
          <text x="132" y="570" className="wf-label">NEW ACCOUNT</text>
          {endpoint(381, 550, 217, 'Company Enrichment', '/v1/enrich-accounts', '/v1/enrichment/company')}
          <text x="132" y="611" className="wf-name">Enrich Orbit</text><text x="132" y="641" className="wf-detail">Company size · industry · tech stack · funding</text>
        </g>
        <path d="M360 664V712" className="wf-wire wf-wire-4" />
        <g className="wf-stage wf-stage-5">
          <rect x="40" y="712" width="640" height="326" rx="12" className="wf-node" />
          <g {...explain('Find other stakeholders', 'Search Orbit by title, department, or seniority. These example roles show where James fits by seniority, not verified reporting relationships. Contact search is a separate API request.')}>
            <text x="62" y="746" className="wf-label">FIND OTHER STAKEHOLDERS</text>
            {endpoint(486, 727, 172, 'Search Contact', '/v1/find-people', '/v1/search/contact')}
            <text x="62" y="777" className="wf-detail">Roles at Orbit · grouped by seniority</text>
          </g>
          {[{
    y: 796,
    level: 'EXECUTIVE',
    name: 'Maya Chen',
    role: 'CTO'
  }, {
    y: 874,
    level: 'FUNCTION LEAD',
    name: 'James Lee',
    role: 'Head of Platform Engineering',
    known: true
  }, {
    y: 952,
    level: 'PRACTITIONER',
    name: 'Alex Nguyen',
    role: 'Platform Engineer'
  }].map(person => <g key={person.name} {...explain(person.name, person.known ? 'Your existing customer, now leading platform engineering at Orbit. Use their role to understand where they fit in the account.' : `${person.role} at Orbit. An example stakeholder found through contact search; their reporting relationship to James is not verified.`)}>
            <text x="62" y={person.y + 36} className="wf-label">{person.level}</text>
            <rect x="218" y={person.y} width="440" height="66" rx="9" className={person.known ? 'wf-node wf-new-company' : 'wf-node'} />
            <text x="236" y={person.y + 26} className="wf-name">{person.name}</text><text x="236" y={person.y + 51} className="wf-detail">{person.role}</text>
            {person.known && <><rect x="536" y={person.y + 10} width="106" height="24" rx="12" fill="#e1edff" /><text x="589" y={person.y + 27} textAnchor="middle" className="wf-label">CUSTOMER</text></>}
          </g>)}
        </g>
        <text x="360" y="1066" textAnchor="middle" className="wf-label">JOB CHANGE: ONLY PAY WHEN A CHANGE IS FOUND</text>
      </>}
    </svg>
    {tip && <div id="wf-step-tooltip" role="tooltip" className="wf-step-tooltip" style={{
    top: tip.top,
    left: tip.left
  }}><strong>{tip.label}</strong><span>{tip.text}</span></div>}
    <div className="wf-journey-caption"><p aria-live="polite">{captions[path]}</p><button type="button" onClick={() => {
    setTip(null);
    setReplay(replay + 1);
  }} aria-label="Replay journey animation">Replay ↻</button></div>
  </div>;
};

Waterfall for DevTools helps you learn more about the people and companies using your product. Enrich signups, qualify accounts, find relevant contacts, identify visiting companies, and check where your customers work now.

When you get thousands of registrations, enrichment costs add up quickly. But an email alone tells you little about the person signing up. We're building this offering to make reliable, fresh data affordable at that volume.

Use the endpoints you need and send the results into your own product, marketing, and sales systems.

## See how the APIs work together

A company can visit your docs before someone signs up. A developer can register with a personal email. An existing customer can move to a new employer. Choose an example below to see which APIs to use.

<DevToolJourney />

## What you can build

<CardGroup cols={2}>
  <Card title="Qualify signups and accounts" icon="user-plus" href="/v1/qualify-signups">
    **Start here.** Add person and company context to your product signals. Tailor onboarding and flag accounts for sales.
  </Card>

  <Card title="Find the relevant team" icon="users" href="/v1/find-buying-team">
    Search an account by department, seniority, or titles chosen for your persona.
  </Card>

  <Card title="Follow customers across companies" icon="arrows-rotate" href="/v1/follow-customers">
    Check for a new employer and role. Only pay when a job change is found.
  </Card>

  <Card title="Evaluate traffic to your docs" icon="globe" href="/v1/evaluate-traffic">
    Identify visiting companies where possible. Compare account fit across campaigns and channels.
  </Card>
</CardGroup>

## Monitor changes over time

We're also exploring company monitoring for DevTool teams: mentions of your brand, new jobs at target accounts, and companies hiring for specific technologies. These are **experimental Waterfall concepts**, separate from the available enrichment APIs.

[Plan brand-mention alerts](/v1/monitor-brand-mentions) · [Explore hiring signals](/v1/monitoring)

## Use the APIs with your existing tools

Call the endpoints you need and keep your own scoring and routing rules. Poll for enrichment results or receive them by webhook. Your integration can then write the data to PostgreSQL, Clay, Snowflake, or the systems you already use.

[Read about security and data handling](/v1/security-and-privacy), including encryption, compliance, and retention.

We're still testing the dedicated high-volume setup. [Why Waterfall](/v1/why-waterfall) explains how we're approaching cost, data quality, and the needs of different teams.

Need a hand with implementation? [Work directly with our developers](/v1/why-waterfall#work-directly-with-our-developers) through an onboarding call and a shared Slack channel.

<CardGroup cols={2}>
  <Card title="Make your first request" icon="code" href="/v1/quickstart">Start with an email and retrieve a professional profile.</Card>
  <Card title="Choose a use case" icon="route" href="/v1/use-cases">Choose the workflow you want to build.</Card>
</CardGroup>
