TL;DR
- A podcast guest list gives you names and companies, not emails. Copy the company website, then look the guest up by domain.
- It takes about 20 minutes for 10 guests. The API route spends about 40 LeadOcean records: up to 30 for the domain search, plus 1 per work-email lookup.
- For a whole season, run one export. You read
email_statusin the CSV before you send.
Prerequisites
- A LeadOcean account from app.leadocean.io. The free plan has no card and 1,000 records, one-off.
curl,jqandpython3.- An API key in your shell as
$LEADOCEAN_API_KEY. Free keys get both scopes, search and enrich.
export LEADOCEAN_API_KEY="paste-your-key-here"Step 1: Collect guests and their company websites
Open the show's episode list. Most episode pages name the guest, their role and their company in the title or show notes. Write one guest per line: name, role, website.
Keep the list short on the first run. Put the websites in a file, then strip them to bare domains and build the JSON array the later steps send as domain.
cat > guests.csv <<'EOF'
Jane Doe,Founder,https://www.acme.com/
John Roe,CEO,http://example.org
EOF
cut -d, -f3 guests.csv | sed -E 's#^https?://##; s#^www\.##; s#/.*$##' | sort -u > domains.txt
jq -R . domains.txt | jq -s -c . > domains.json
cat domains.jsonGuests who run a solo show or a personal brand often list no company. Skip them or find their site first. This guide does not scrape podcast apps. Copy by hand, or use a list you already hold.
Step 2: Find one guest by hand
For one guest, the manual route is to guess the address from the name and the domain, then test it. This prints the usual candidates for a placeholder name.
first="jane"; last="doe"; domain="acme.com"
for p in "$first.$last" "$first" "${first:0:1}$last" "$first$last"; do
echo "$p@$domain"
doneEvery line is a guess. A domain that accepts all mail answers the same for a real and a fake address, so a guess can look fine and still bounce. Use this for one or two people, then move to the API.
Step 3: Size the list for free
Ask how many senior people we hold across your domains before you spend a record. Send count=true as a query parameter with limit at 1. It costs nothing.
curl -s "https://api.leadocean.io/v1/people/search?count=true" \
-H "x-api-key: $LEADOCEAN_API_KEY" -H "content-type: application/json" \
-d "{\"domain\": $(cat domains.json), \"title\": [\"founder\", \"ceo\"], \"limit\": 1}" \
| jq '.meta | {total, totalIsExact}'title is a keyword match, so "founder" also matches "co-founder". A total of 0 means we hold nobody there, so drop that domain.
Step 4: Search by domain, then get the work email
There is no name plus domain lookup in the API. Search the domains, find your guest in the rows, then use the person_id. Each person returned costs one record, so keep limit close to the number you need.
curl -s "https://api.leadocean.io/v1/people/search" \
-H "x-api-key: $LEADOCEAN_API_KEY" -H "content-type: application/json" \
-d "{\"domain\": $(cat domains.json), \"title\": [\"founder\", \"ceo\"], \"limit\": 30}" \
| jq '.data[] | select(.profile_data.profile_full_name // "" | test("Jane Doe"; "i"))
| {name: .profile_data.profile_full_name, person_id: .meta.source_ids.person_id}'Swap Jane Doe for the guest's name. A search row is thin: name, headline, role and flags such as has_email, but no address. The name is at profile_data.profile_full_name and the id at meta.source_ids.person_id. Send that person_id to the work-email endpoint.
PERSON_ID="paste-person_id-from-the-search"
curl -s "https://api.leadocean.io/v2/people/email/work?person_id=$PERSON_ID" \
-H "x-api-key: $LEADOCEAN_API_KEY" | jq '.data'It returns one address or null, and costs one record either way. It returns only an address at the person's current employer that is verified, catch_all_valid or catch_all. For every email and phone we hold, call POST /v1/people/enrich with reveal_email true instead.
Step 5: Export the whole season
For more than a few dozen guests, export. Bulk CSV export is not on the Free plan: it comes with Solo ($97 a month) and Agency ($497 a month). One request takes up to 50,000 rows and a day takes up to 500,000. Each row written costs one record.
curl -s https://api.leadocean.io/v1/exports \
-H "x-api-key: $LEADOCEAN_API_KEY" -H "content-type: application/json" \
-d "{
\"name\": \"Podcast guests\",
\"filters\": {
\"domain\": $(cat domains.json),
\"title\": [\"founder\", \"ceo\"],
\"emailStatus\": [\"verified\", \"catch_all_valid\", \"catch_all\"]
},
\"limit\": 100,
\"preset\": \"full\"
}" | jq '.data | {id, status}'Poll GET /v1/exports/{id}, then fetch GET /v1/exports/{id}/download when the status is done. The app does the same on its Exports page, with a filter builder, a column picker and the record price before you start.
Step 6: Match the file back to your guests
An export returns everyone at the domain who fits the titles, not only your guest. Join it to guests.csv by name and keep the status columns.
python3 - <<'EOF'
import csv
guests = {l.split(",")[0].lower() for l in open("guests.csv")}
rows = list(csv.DictReader(open("podcast-guests.csv")))
hits = [r for r in rows if r.get("profile_full_name", "").lower() in guests
and r.get("email_1_status") in ("verified", "catch_all_valid")]
print(len(rows), "rows,", len(hits), "guests ready to send")
EOFThe full preset carries profile_full_name, current_company_domain and the numbered email_N_* columns. GET /v1/exports/columns is free and lists every column id. LeadOcean gives no refund or credit-back for bounced emails. Read email_1_status before you send.
What you get
The Step 3 sizing call is a real run. We ran it on 2026-10-21 with leadocean_count_leads, which spends 0 records, for people in the US with "Founder" in the title and "podcast" in their own profile text.
{
"total": 1967,
"totalIsExact": true,
"totalAll": 4660,
"distinctCompanies": 1864
}This is a different query from Step 3: it sizes podcast-adjacent founders across the US, not one show's guests. That is 1,967 people on 2026-10-21 at the default mailable filter (verified, catch_all_valid or catch_all). Without an email filter the same query matches 4,660. Your own count will depend on your domains.
The work-email call returns the shape below. This is the response shape from the API reference, with placeholder values.
{
"success": true,
"data": {
"email": "jane.doe@acme.com",
"status": "verified",
"verified_batch_date": "2026-09-20"
}
}Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing, wrong or revoked key | Re-copy the key from app.leadocean.io and export $LEADOCEAN_API_KEY again. |
| 429 | Above your plan's rate limit (5 a second on Free, 50 on Solo, 200 on Agency) | Slow the loop, or use an export for large batches. |
| 402 | The 1,000 free records are spent | Check GET /v1/account, or move to Solo ($97 a month) or Agency ($497 a month) on pricing. |
| Search returns no rows | A filter value outside the catalogue | Check exact strings with GET /v1/enums or leadocean_list_enum_values. |
data: null on the work email | No address at the current employer is verified, catch_all_valid or catch_all | It still costs one record. Try POST /v1/people/enrich with reveal_email. |
400 export_limit_rows | The export limit is above 50,000 rows | Split the domain list and run several exports. |
FAQ
Do podcast guest lists include emails?
No. Episode pages name the guest, role and company. You take the website from there and look the person up.
How many records does it cost?
One per person returned by a search and one per work-email call. Counts are free. Ten guests with a search at limit 30 and about 10 lookups spend about 40.
How do I know the email is real?
Each address has a status. The work-email endpoint returns only verified, catch_all_valid or catch_all. Only catch_all_valid confirms a mailbox on a catch-all domain.
What if I want the host, not the guests?
Read how to find a podcast host's email address. For other lists, see how to find emails from a list of domains and from the YC company list.
Can an AI agent run this for me?
Yes. The hosted MCP server signs in with OAuth, so no key is pasted. Paste the domains and ask it to count with leadocean_count_leads, which is free, then search or export.
Can I do this on the free plan?
Yes, up to Step 4. Counts are free, and search rows and work-email lookups spend from the 1,000 free records. Bulk CSV export in Step 5 starts at Solo ($97 a month).
Turn a podcast guest list into checked work emails, free
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →