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 Travel (Buyers, Filters and Messaging)

Pick the buying committee, count the list for free, then spend records only on the people you will email.

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

Travel is three buyer groups under one label: travel sellers (agencies and tour operators), lodging (hotels and resorts) and experience providers. Each has its own committee, so you build one list per group.

This guide picks the roles, finds them with LeadOcean filters, sizes the list with a free count and drafts the first message for each.

TL;DR

  • Target agencies and tour operators, hotels and lodging groups, and experience providers separately. Titles, budgets and seasons differ.
  • Size first with a free count. On 2026-10-21, five travel industries held 7,913 mailable C-level, VP and director contacts at 878 mid-sized US companies.
  • The recipe takes about 45 minutes and spends about 30 records, so it fits inside the Free plan's 1,000.

Prerequisites

  • A LeadOcean account on the Free plan. Sign up at app.leadocean.io, no card.
  • An API key exported as $LEADOCEAN_API_KEY.
  • curl and jq, or any HTTP client.
  • Optional: the hosted MCP server at https://api.leadocean.io/mcp if you would rather run the counts from Claude.

Step 1: Pick the buying committee

Travel deals rarely close on one signature. Name the roles before you touch a filter.

Buyer groupEconomic buyerChampionGatekeeper
Agency or tour operatorOwner, CEO, PresidentDirector of Operations or ProductFinance, IT
Hotel or lodging groupGeneral Manager, VP OperationsDirector of Revenue or SalesOwner group, procurement
Experience providerFounder, COODirector of Marketing or DistributionFinance

Independent hotels and small agencies often have no published work email. Start with groups of 51 or more people, where titles and company pages exist.

LeadOcean has no single "travel" industry. Look up the exact strings first, because enum values are exact.

bash
for q in travel hotel hospitality tourism sightseeing hostel; do
  curl -s -G "https://api.leadocean.io/v1/enums/industry" \
    --data-urlencode "q=$q" \
    -H "x-api-key: $LEADOCEAN_API_KEY" | jq -r '.data.values[]'
done

The same lookup is free through the MCP tool leadocean_list_enum_values. On 2026-10-21 it returned Leisure; Travel and Tourism, Travel Arrangements, Hotels and Motels, Hospitality, Bed-and-Breakfasts; Hostels; Homestays and Sightseeing Transportation.

Step 2: Turn the committee into filters

Write the filters as flat JSON. Every filter is an array, even when it holds one value.

json
{
  "industry": [
    "Leisure; Travel and Tourism",
    "Travel Arrangements",
    "Hotels and Motels",
    "Bed-and-Breakfasts; Hostels; Homestays",
    "Sightseeing Transportation"
  ],
  "jobLevel": ["C-Team", "VP", "Director"],
  "employeeRange": ["51-200", "201-500", "501-1000"],
  "country": ["US"]
}

Hospitality is left out on purpose. On 2026-10-21 a company count of US mid-sized companies in the six travel industries put 10,629 of 12,733 under Hospitality. A company count of that bucket alone put 6,102 of its 10,629 companies under NAICS code 621111, which is physicians' offices. Treat that bucket as noisy. Add it only in a second pass with a title filter and check the test batch.

Narrow by function when one product has one owner. A revenue-management tool sells to Sales & Business Development and Finance & Accounting. A booking engine sells to Information Technology and Operations.

Step 3: Size the list with a free count

Count before you pull. A count costs no records and you can run it as often as you like.

bash
curl -s "https://api.leadocean.io/v1/people/search?count=true" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "industry": ["Leisure; Travel and Tourism","Travel Arrangements","Hotels and Motels","Bed-and-Breakfasts; Hostels; Homestays","Sightseeing Transportation"],
    "jobLevel": ["C-Team","VP","Director"],
    "limit": 1
  }' | jq '.meta'

count=true goes in the query string. The JSON body rejects unknown fields. The response has no rows, only meta.total (capped at 100,000) and meta.countOnly: true.

For the company side, GET /v1/companies/count takes the company-search filters and returns an exact total with breakdowns by industry, headcount band, HQ country and HQ state. Use it to see where the accounts sit before you pick a region.

Step 4: Pull a 25-row test batch

Pull a small batch first. Read the titles. If half are the wrong role, tighten the filters before you spend more.

bash
curl -s "https://api.leadocean.io/v1/people/search" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "industry": ["Leisure; Travel and Tourism","Travel Arrangements","Hotels and Motels"],
    "jobLevel": ["C-Team","VP","Director"],
    "employeeRange": ["51-200","201-500"],
    "country": ["US"],
    "limit": 25
  }' > batch.json

jq '.data | length' batch.json

A page of 25 is 25 records. Page with cursor from meta.nextCursor when you want more. One search pages to 10,000 rows, and the last page carries meta.depthCapped: true. Narrow the filters instead of walking further.

Each row carries contact_data.email_status. Send to verified and catch_all_valid. LeadOcean does not credit back bounces, so read the status before you send.

Step 5: Enrich the champions you will contact

Enrich only the people you will contact. Enrich takes exactly one of linkedin_url, email, phone or person_id.

bash
curl -s -X POST "https://api.leadocean.io/v1/people/enrich" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "content-type: application/json" \
  -d '{"person_id": "PERSON_ID_FROM_SEARCH", "reveal_email": true}'

Enrich also returns career history in resume_data: past roles, education and certifications. A prior role at a hotel brand or an airline is a better opener than a job title. An enrichment that finds nothing is a 404 and costs nothing.

For a phone number, call GET /v2/people/phone. A v2 contact call costs one record even when it finds nothing.

Step 6: Write messages that fit the buyer

Travel buyers answer to occupancy, margin and season. Open with the number they watch this quarter.

BuyerTheir pressureFirst line angle
Agency ownerMargin per booking, supplier termsTime saved on quoting and supplier admin
Hotel GMOccupancy, rate, labor costOne number: direct bookings or hours saved
Director of RevenueChannel mix, commission costShifting share from OTAs to direct
Experience provider, founderSeasonal cash flow, reviewsFilling the shoulder season

Timing matters. Hotels plan the next year in the autumn, and operators are busy in peak season. Send in the quiet weeks and keep the email under 80 words.

Plain example for a hotel group:

text
Subject: Direct bookings for Acme Hotels

Hi Jane,

Acme Hotels pays OTA commission on most weekday stays. We help
groups your size move a share of those bookings to the direct channel.

Open to a 15-minute call after the autumn planning cycle?

Names, domain and subject are placeholders. Use your own product and a claim you can back up.

Step 7: Split the list into three campaigns

Do not send one message to the whole list. Split by buyer group and run each segment on its own copy.

  1. Agencies and tour operators. Industry Travel Arrangements and Leisure; Travel and Tourism, jobLevel C-Team. Owners read their own email, so keep it short and lead with margin.
  2. Hotels and lodging. Industry Hotels and Motels and Bed-and-Breakfasts; Hostels; Homestays, plus the Hospitality second pass with title filters such as "General Manager" and "Revenue". Target VP Operations and Director titles in sales and revenue.
  3. Experience providers. Industry Sightseeing Transportation and Leisure; Travel and Tourism, founders and COOs. Seasonal cash flow drives the pitch.

Run the count again for each segment. The totals will not add up to the combined list, because a person can match more than one filter set. Use the combined count for planning and the segment counts for sending.

Step 8: Check where the accounts sit

Send time and local events matter in travel. A free company count by HQ state shows where the accounts are before you pick a region. POST /v1/companies/count takes the same filters as a JSON body.

bash
curl -s -X POST "https://api.leadocean.io/v1/companies/count" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "content-type: application/json" \
  -d '{"industry":["Travel Arrangements","Leisure; Travel and Tourism","Hotels and Motels"],"employeeRange":["51-200","201-500","501-1000"],"hqCountry":["US"]}' | jq '.data.facets.hq_state'

Pick two or three states and run them as separate sends. Coastal and resort states follow a different calendar from business-travel hubs, so the same email lands differently in each.

Step 9: Rank accounts before you send

A list of 7,913 people is too many to write by hand. Rank the accounts and send to the top group first.

  • Count people per company in the test batch. An account with three matching titles is a committee you can reach from several sides.
  • Prefer a work email marked verified. It bounces less than a catch-all address.
  • Use GET /v1/companies/{domain}/people for your top accounts. It lists the other people at one domain, so you can add missing roles.
  • Drop accounts where the only match is a Staff or Other level title.

Then send in batches of 50 to 100 and read the replies. If replies cluster on one role, move effort toward it.

What you get

Output of leadocean_count_leads on 2026-10-21 for the Step 2 industries with jobLevel C-Team, VP and Director, headcount 51-1000 and country US. The count includes only people whose best email is verified, catch_all_valid or catch_all.

json
{
  "total": 7913,
  "totalIsExact": true,
  "totalAll": 27365,
  "distinctCompanies": 878
}

Add the Hospitality industry to the same filters and the count on the same date rises to 46,767 people at 4,630 companies. That gain includes the physicians' offices Step 2 describes. With no headcount or country filter and all six industries, the count was 346,510 people at 66,145 companies.

Response shape from the API reference (placeholder values). Search rows carry no contact points. Enrich with reveal_email for the address.

json
{
  "success": true,
  "data": [
    {
      "profile_data": {
        "profile_full_name": "Jane Doe",
        "profile_headline": "VP Sales at Acme",
        "profile_url": "https://www.linkedin.com/in/jane-doe"
      },
      "contact_data": {
        "has_email": true,
        "has_phone": false,
        "email_status": "verified",
        "email_type": "work"
      },
      "meta": { "source_ids": { "person_id": "1234567890" } }
    }
  ],
  "meta": { "count": 1, "credits": 1, "nextCursor": "CURSOR" }
}

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-key headerCheck $LEADOCEAN_API_KEY is exported and sent in the x-api-key header
429More than the plan's rate limit (5 requests a second on Free, 200 on Agency)Wait for the Retry-After seconds, then retry slower
402The 1,000 Free records are spentMove to a paid plan or reduce the pull; counts still work
Empty resultsAn enum value is not an exact string, such as "Travel" or "Tourism"Resolve the value with list_enum_values first
unsupported_filters on a countA filter such as fundingType or hqCity is not supported in people countsDrop it and count without it
meta.depthCapped: trueOne search stops at 10,000 rowsSplit by country or headcount band

FAQ

Is there a travel industry filter?

Not one. LeadOcean has 534 industry values. Travel sits across Travel Arrangements, Leisure; Travel and Tourism, Hotels and Motels, Hospitality and a few smaller values. Build the segment from those and check the title mix on a 25-row batch.

Why leave out Hospitality?

It is the largest bucket and the noisiest. On 2026-10-21 its US mid-sized companies included many physicians' offices by NAICS code. Use it only with title filters.

How many records does this cost?

About 30: 25 for the test batch and a handful of enrichments. Counts, enum lookups and GET /v1/companies/count are free.

Can I download the whole list as a CSV?

Yes, on a paid plan. Bulk CSV export is not on Free. Solo is $97 a month and Agency is $497 a month, both with a fair-use pace instead of credits. See pricing.

Count your travel buyers free, then pull only the ones you will email

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

Get your free API key →