DEV Community

Sebastian Casvean
Sebastian Casvean

Posted on • Originally published at zenndra.com

Find Medium Influencers and Top Writers by Tag (CRM-Ready Lists)

Find Medium Influencers and Top Writers by Tag (CRM-Ready Lists)

Guessing handles from Google is slow. search/users, top_writers/{tag}, and recommended_users/{tag} return ranked names with API-stable ids for HubSpot, Airtable, or Notion.

Tool outcome: export-influencers.js → CSV with user_id, bio, followers, last post date.


Workflow

  1. Pick a tag aligned with your campaign (devops, product-management, …).
  2. Pull top_writers + recommended_users.
  3. Enrich with /user/{user_id} (bio, followers).
  4. Filter inactive accounts via /user/{user_id}/articles.
  5. Export with user_id in a custom CRM field.

Discovery + enrich

const API = 'https://api.zenndra.com';
const headers = { Authorization: `Bearer ${process.env.ZENNDRA_API_KEY}` };
const tag = 'artificial-intelligence';

async function listInfluencers(tag) {
  const [top, rec] = await Promise.all([
    fetch(`${API}/top_writers/${encodeURIComponent(tag)}`, { headers }).then((r) => r.json()),
    fetch(`${API}/recommended_users/${encodeURIComponent(tag)}`, { headers }).then((r) => r.json()),
  ]);

  const ids = [...new Set([...(top.users ?? []), ...(rec.users ?? [])].map((u) => u.user_id ?? u.id))];

  const profiles = [];
  for (const userId of ids) {
    const profile = await fetch(`${API}/user/${userId}`, { headers }).then((r) => r.json());
    const { articles } = await fetch(`${API}/user/${userId}/articles`, { headers }).then((r) => r.json());
    const lastPublished = articles?.[0]?.published_at ?? null;
    profiles.push({
      user_id: userId,
      name: profile.name,
      username: profile.username,
      followers: profile.followers_count,
      lastPublished,
    });
  }
  return profiles;
}
Enter fullscreen mode Exit fullscreen mode

Filters that save outreach

Signal Rule of thumb
Followers Campaign-dependent floor
lastPublished Skip if > 90 days idle
Bio keywords Match ICP manually or with simple regex

Search fallback

When you know a name but not a tag:

const q = 'kelsey higgins';
const res = await fetch(`${API}/search/users?query=${encodeURIComponent(q)}`, { headers });
const { users } = await res.json();
Enter fullscreen mode Exit fullscreen mode

Always persist user_id after the first resolve (id guide).


Keywords

medium influencer search, medium top writers api, medium outreach list, find medium authors, medium expert directory.


Further reading

Top comments (0)