Pre-Black Friday: 20% off, for as long as you stayEARLYBFon Solo and AgencyEnds Nov 28Start free

How-to guide

How to Build a B2B Lead List for Construction (Who to Target and How)

Pick the buyers, find them with five filters, size the list for free, then spend records only on the people you will write to.

Get your free API key →Free to start. No credit card. 1,000 records to spend whenever you like.

Construction is a field-and-office business, so the buyer is rarely the person on the job site. Target the executives and department heads at mid-size contractors, size the list with a free count, and spend records only on the people you will write to.

TL;DR

  • Target owners, C-team, VPs and directors at US contractors with 51 to 1,000 employees. A free count on 21 October 2026 found 62,901 mailable people at 7,090 companies.
  • It takes 30 to 45 minutes. Sizing costs 0 records. A 25-row test pull costs 25 records.
  • The Free plan has 1,000 records for life, so you can validate the whole list before paying anything.

Prerequisites

  • A LeadOcean account and API key from https://app.leadocean.io/register. Export it as $LEADOCEAN_API_KEY.
  • curl and jq, or any HTTP client.
  • Optional: Claude Desktop or Claude Code connected to the hosted MCP server at https://api.leadocean.io/mcp (OAuth sign-in, no key pasted).
  • A one-line description of what you sell to contractors. The filters follow from it.
bash
export LEADOCEAN_API_KEY="your_key_here"

Step 1: Pick the buying committee

Decide who signs, who uses and who blocks before you touch a filter. In construction the committee is smaller than in software, and titles differ by firm size.

RoleWhy they matterLeadOcean filter
Owner, founder, presidentSigns at firms under 200 peopleseniority: owner, founder, c_suite
VP or Director of OperationsOwns project delivery and costjobLevel: VP, Director with jobFunction: Operations
Purchasing or procurement leadControls suppliers, materials, equipmentjobFunction: Purchasing
Estimating or preconstruction headDecides which tools bid teams usetitle: estimating, preconstruction
CFO or controllerApproves software and financingjobFunction: Finance & Accounting

Pick two roles for the first campaign. At a 200-person contractor, the owner and the operations director cover most deals.

Step 2: Resolve the industry values

Industry is a closed list of 534 exact strings, and construction is split across several. Resolve them before you filter. The free leadocean_list_enum_values MCP tool does it; the REST equivalent is GET /v1/enums/industry?q=....

bash
for q in construction contractors; do
  curl -s "https://api.leadocean.io/v1/enums/industry?q=$q" \
    -H "x-api-key: $LEADOCEAN_API_KEY" | jq -r '.data.values[]'
done

The core values are Construction, Building Construction, Residential Building Construction, Nonresidential Building Construction, Specialty Trade Contractors. Also check Highway; Street; and Bridge Construction, Utility System Construction, Civil Engineering and Building Equipment Contractors. A wrong spelling returns an empty result, not an error. Copy the strings exactly.

Step 3: Size the list for free

A count spends no records. Send count=true as a query parameter with limit 1. The body stays flat JSON with arrays.

bash
curl -s -X POST "https://api.leadocean.io/v1/people/search?count=true" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "industry": ["Construction", "Building Construction", "Residential Building Construction",
                 "Nonresidential Building Construction", "Specialty Trade Contractors"],
    "country": ["US"],
    "jobLevel": ["C-Team", "VP", "Director"],
    "employeeRange": ["51-200", "201-500", "501-1000"],
    "limit": 1
  }' | jq '.meta'

meta.total is capped at 100,000, so a broad filter can read as exactly 100,000. Narrow it until the number is below the cap. The MCP tool leadocean_count_leads also returns distinctCompanies, which tells you how many employers the people span.

To size the companies, ask Claude with the MCP server connected: "Use leadocean_count_companies for US construction companies with 51 to 1,000 employees." It is free too.

Step 4: Narrow to the committee

Add the function filter for the roles you picked in Step 1. Purchasing and operations leaders at the same companies make a tight first list. Save the body as committee.json.

json
{
  "industry": ["Construction", "Building Construction", "Residential Building Construction",
               "Nonresidential Building Construction", "Specialty Trade Contractors"],
  "country": ["US"],
  "jobLevel": ["C-Team", "VP", "Director"],
  "jobFunction": ["Purchasing", "Operations"],
  "employeeRange": ["51-200", "201-500", "501-1000"],
  "limit": 25
}

Run it as a normal search (no count) to pull the first 25 rows. That spends 25 records. Check titles and company names before you export more.

bash
curl -s -X POST "https://api.leadocean.io/v1/people/search" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "content-type: application/json" \
  -d @committee.json | jq '.meta'

One search pages to 10,000 rows. If meta.depthCapped is true, split by state or headcount band instead of walking further.

Step 5: Export the list

For more than a few hundred rows, export instead of paging. Exports take up to 50,000 rows a request and 500,000 a day. Bulk CSV export is not on the Free plan, so use the 25-row pull and the API for validation there.

bash
curl -s -X POST "https://api.leadocean.io/v1/exports" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "name": "us-construction-ops-purchasing",
    "filters": {
      "industry": ["Construction", "Specialty Trade Contractors"],
      "country": ["US"],
      "jobLevel": ["C-Team", "VP", "Director"],
      "jobFunction": ["Purchasing", "Operations"],
      "employeeRange": ["51-200", "201-500", "501-1000"]
    },
    "limit": 2740
  }'

You can also build the same export in the app at https://app.leadocean.io: filter builder, column picker, a price preview before you start, and a CSV download. The app has no sequencer or CRM, so load the CSV into the tool you already send from.

Read email_status on every row before sending. Bounced emails are not refunded.

Step 6: Match the message to the role

Contractors answer short, specific, local messages. Lead with the job, not the software.

  • Owners: margin and cash flow. Name one cost your product removes, with your own proof, not an invented stat.
  • Operations directors: schedule slip and rework. Name the cost of a day lost on site.
  • Purchasing leads: lead time and price lock on materials or equipment.
  • Estimators: bid volume. How many more bids a week the team can price.

Keep emails under 90 words, plain text, one question. Mention the state or the project type you saw in their profile. Do not claim you saw their projects unless you did.

What you get

This is the output of the free counts on 21 October 2026, run through the LeadOcean MCP tools. Counts include only addresses with verified, catch_all_valid or catch_all email status (the tool default).

QueryMailable peopleDistinct companiesWithout email filter
Construction industries (5 values), US, C-Team or VP or Director, 51 to 1,000 employees62,9017,090251,742
Same, plus jobFunction Purchasing or Operations2,7401,43610,003

leadocean_count_companies for US companies in the same five industries with 51 to 1,000 employees returned 19,021 companies on 21 October 2026. Of these, 15,606 have 51 to 200 employees, 2,566 have 201 to 500 and 849 have 501 to 1,000.

The Purchasing and Operations cut leaves 2,740 mailable people. At 25 records a test pull, you can check the segment before committing to the rest.

Response shape from the API reference (placeholder values, not a real person):

json
{
  "success": true,
  "data": [
    {
      "profile_data": {
        "profile_full_name": "Jane Doe",
        "profile_headline": "Director of Operations at Acme"
      },
      "contact_data": {
        "has_email": true,
        "email_status": "verified",
        "contact_current_experiences": [{
          "job_title": "Director of Operations",
          "company_name": "Acme",
          "company_domain": "acme.com"
        }]
      }
    }
  ],
  "meta": { "count": 1, "limit": 25, "credits": 1, "nextCursor": "CURSOR", "depthCapped": false }
}

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-keyCheck $LEADOCEAN_API_KEY is exported and the header name is exact
429Above the plan's rate limit (5 requests a second on Free, 200 on Agency)Back off for the Retry-After seconds, then retry
402Out of records (Free is 1,000 for life)Counts and filter lookups stay free. Move to Solo ($97 a month) or Agency ($497 a month) to keep pulling
Empty dataAn industry or jobLevel string is not an exact enum valueResolve it with GET /v1/enums/{name} or leadocean_list_enum_values and copy it verbatim
meta.total stuck at 100,000The count is cappedAdd employeeRange, country or a function filter until it drops
Export refusedOver 50,000 rows a request or 500,000 a day, or Free planSplit the export by state or headcount band. Bulk CSV is not on Free

FAQ

How many construction contacts can I get for free?

The Free plan gives 1,000 records for life, with no card. Counting is free and unlimited, so you can size the full market first and spend records only on the sample.

Which industry values cover construction?

Construction is split across several strings, including Construction, Building Construction, Specialty Trade Contractors and Civil Engineering. Resolve them with the free enum lookup before you search.

Should I target the owner or the project manager?

At contractors under 200 people, the owner usually decides. Above that, go to operations or purchasing directors. Use the count to compare the sizes of each group.

Does LeadOcean send the emails?

No. LeadOcean returns the data. Export the CSV and load it into your sender. Plans are on the pricing page.

Where do I see how other industries compare?

See the playbooks for Web3, Travel and Telecom, or return to the blog hub.

Size your construction list for free, then pull the first 25 rows

Free to start. No credit card. 1,000 records to spend whenever you like.

Get your free API key →