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. curlandjq, 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 group | Economic buyer | Champion | Gatekeeper |
|---|---|---|---|
| Agency or tour operator | Owner, CEO, President | Director of Operations or Product | Finance, IT |
| Hotel or lodging group | General Manager, VP Operations | Director of Revenue or Sales | Owner group, procurement |
| Experience provider | Founder, COO | Director of Marketing or Distribution | Finance |
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.
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[]'
doneThe 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.
{
"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.
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.
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.jsonA 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.
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.
| Buyer | Their pressure | First line angle |
|---|---|---|
| Agency owner | Margin per booking, supplier terms | Time saved on quoting and supplier admin |
| Hotel GM | Occupancy, rate, labor cost | One number: direct bookings or hours saved |
| Director of Revenue | Channel mix, commission cost | Shifting share from OTAs to direct |
| Experience provider, founder | Seasonal cash flow, reviews | Filling 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:
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.
- Agencies and tour operators. Industry
Travel ArrangementsandLeisure; Travel and Tourism,jobLevelC-Team. Owners read their own email, so keep it short and lead with margin. - Hotels and lodging. Industry
Hotels and MotelsandBed-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. - Experience providers. Industry
Sightseeing TransportationandLeisure; 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.
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}/peoplefor 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.
{
"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.
{
"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
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key header | Check $LEADOCEAN_API_KEY is exported and sent in the x-api-key header |
| 429 | More than the plan's rate limit (5 requests a second on Free, 200 on Agency) | Wait for the Retry-After seconds, then retry slower |
| 402 | The 1,000 Free records are spent | Move to a paid plan or reduce the pull; counts still work |
| Empty results | An enum value is not an exact string, such as "Travel" or "Tourism" | Resolve the value with list_enum_values first |
unsupported_filters on a count | A filter such as fundingType or hqCity is not supported in people counts | Drop it and count without it |
meta.depthCapped: true | One search stops at 10,000 rows | Split 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.
Related
- Hub: all lead generation guides
- Lead generation for web3
- Lead generation for telecom
- Lead generation for solar
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 →