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

How-to guide

How to Find an Email From Podcast Guest Lists (2026)

Start at a show's episode list, end with a checked work email for each guest. One guest by hand, a whole season with one export.

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

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_status in 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, jq and python3.
  • An API key in your shell as $LEADOCEAN_API_KEY. Free keys get both scopes, search and enrich.
bash
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.

bash
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.json

Guests 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.

bash
first="jane"; last="doe"; domain="acme.com"
for p in "$first.$last" "$first" "${first:0:1}$last" "$first$last"; do
  echo "$p@$domain"
done

Every 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.

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 "{\"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.

bash
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.

bash
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.

bash
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.

bash
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")
EOF

The 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.

json
{
  "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.

json
{
  "success": true,
  "data": {
    "email": "jane.doe@acme.com",
    "status": "verified",
    "verified_batch_date": "2026-09-20"
  }
}

Troubleshooting

ErrorCauseFix
401Missing, wrong or revoked keyRe-copy the key from app.leadocean.io and export $LEADOCEAN_API_KEY again.
429Above 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.
402The 1,000 free records are spentCheck GET /v1/account, or move to Solo ($97 a month) or Agency ($497 a month) on pricing.
Search returns no rowsA filter value outside the catalogueCheck exact strings with GET /v1/enums or leadocean_list_enum_values.
data: null on the work emailNo address at the current employer is verified, catch_all_valid or catch_allIt still costs one record. Try POST /v1/people/enrich with reveal_email.
400 export_limit_rowsThe export limit is above 50,000 rowsSplit 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?
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).

Where do I find more recipes?

The blog hub lists them all, and plans are on pricing.

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 →