Contact Goat: How Printing Press Finds Verified Emails via LinkedIn Without a Public API
Contact Goat cross-checks LinkedIn with Happenstand and runs deep email verification — all without a public API. Here's how to use it inside Claude Code.
Finding Someone’s Verified Email Without Knowing Their API
Contact Goat does something that sounds simple until you try to build it yourself: given a person’s name and company, it finds their verified email address by cross-checking LinkedIn with Happenstand and then running a deep email verification pass. No guessing. No spray-and-pray. A verified address or nothing.
The reason this is interesting isn’t the outcome — it’s the mechanism. LinkedIn has no public API for this kind of lookup. Happenstand isn’t something you’d normally chain into a workflow. And “deep email verification” usually means a third-party SaaS with its own pricing tier. Contact Goat wraps all of that into a single CLI command that Claude Code can call natively, without any of those services needing an MCP server or a custom API integration.
This post walks through what Contact Goat is, how it fits into the Printing Press ecosystem, and how you’d actually use it inside Claude Code to build a verified email lookup workflow.
What You’re Actually Getting Here
Before the setup steps, it’s worth being concrete about the outcome.
You ask Claude Code something like: “Find me the verified email for the head of engineering at Acme Corp.” Claude calls the Contact Goat CLI. The CLI looks up the person on LinkedIn, cross-checks the result against Happenstand (which independently indexes professional contact data), and then runs a deep email verification — meaning it actually checks whether the address is deliverable, not just whether it’s formatted correctly.
Remy doesn't build the plumbing. It inherits it.
Other agents wire up auth, databases, models, and integrations from scratch every time you ask them to build something.
Remy ships with all of it from MindStudio — so every cycle goes into the app you actually want.
What comes back into your Claude context is a short, clean result. Not 40KB of JSON. Not a paginated API response you have to parse. Something like 200 tokens of clean text: name, title, verified email, confidence score.
That compression matters. One of the benchmarks from the Printing Press team shows that MCP servers use 35x more tokens than CLI tools on the same task, and reliability drops from 100% with CLIs to 72% with MCP as tasks get harder. If you’re running any kind of outbound research workflow at scale — even a small one — that token overhead compounds fast.
The broader Printing Press library (available at printingpress.dev) includes CLIs for Amazon, Craigslist, eBay, TikTok Shop, Shopify, Airbnb, Hacker News, Linear, ESPN, and more. Contact Goat is the LinkedIn-focused one, and it’s the most interesting for anyone doing sales research, recruiting, or partnership outreach.
What You Need Before Starting
Go (the programming language). All Printing Press CLIs are written in Go — a free, open-source language from Google designed for fast, portable command-line tools. You don’t need to write any Go yourself, but you do need it installed. If you don’t have it, just tell Claude Code “I need to install Go” and follow the prompts. It takes about a minute.
Claude Code. This workflow is built around Claude Code specifically, not the Claude web interface. If you’re new to keeping Claude Code running reliably for longer tasks, the post on keeping your Claude Code agent running 24/7 covers the basics of preventing your machine from sleeping mid-task.
Printing Press installed. You need both the starter pack and the factory. The starter pack gives you the pre-built CLIs (ESPN, Flight Goat, Movie Goat, Recipe Goat, and others). The factory is what lets you build new ones. Both are installed via commands you’ll find at printingpress.dev — drop all three relevant URLs (the main site, the GitHub library, and the factory page) into Claude Code and tell it to set everything up.
A LinkedIn account. Contact Goat authenticates against LinkedIn using a real session, not a scraping workaround. You’ll need to provide your credentials or session token during setup. These are stored locally by the CLI — the auth token lives in the CLI itself, not in your Claude context.
Optional: Happenstand account. The cross-check step uses Happenstand. Depending on how Contact Goat handles this, you may need an API key. Check the CLI’s README in the Printing Press GitHub library for current requirements.
Now you have everything you need to install and run Contact Goat.
Setting Up Contact Goat in Claude Code
Step 1: Install the Printing Press starter pack and factory
Open a Claude Code session and paste in the three URLs from printingpress.dev: the main site, the GitHub CLI library, and the factory page. Tell Claude:
“Read all three of these. This is a tool called Printing Press that has pre-built CLIs and a factory for building new ones. Install everything I need to get started.”
How Remy works. You talk. Remy ships.
Claude will figure out the install commands, flag that you need Go if you don’t have it, and walk you through the setup. The main install command for the starter pack is on printingpress.dev — Claude will find it and run it.
Now you have the Printing Press factory and starter CLIs installed locally.
Step 2: Pull the Contact Goat CLI from the catalog
The Printing Press GitHub library lists all available CLIs. Contact Goat is in the catalog under the LinkedIn section. In Claude Code, say:
“Can you check the Printing Press catalog and install Contact Goat for me?”
Claude will use the printingpress catalog skill to find it, pull the GitHub repo, and install the binary. If it asks you to confirm anything, say yes.
Now you have the Contact Goat CLI installed and available as a local command.
Step 3: Authenticate with LinkedIn
This is the step where most people get stuck, so pay attention here.
Contact Goat needs a LinkedIn session to do its lookups. The CLI holds the auth token — it doesn’t pass your credentials through Claude. Run the authentication step by telling Claude:
“Can you help me authenticate Contact Goat with my LinkedIn account?”
The CLI will prompt for your credentials or walk you through a session token flow. Once authenticated, the token is stored locally. You won’t need to do this again unless your session expires.
Now you have an authenticated Contact Goat CLI that can query LinkedIn on your behalf.
Step 4: Run your first lookup
Try a simple test. In Claude Code:
“Use Contact Goat to find the verified email for [Name] at [Company].”
Claude will call the Contact Goat CLI, which runs the three-step process: LinkedIn lookup → Happenstand cross-check → deep email verification. The result comes back into your context as clean text — name, company, email, verification status.
The key thing to notice: the raw data Contact Goat fetches from LinkedIn and Happenstand might be substantial. But what enters your Claude context is a compact, pre-formatted summary. This is the same pattern as the School CLI example from the Printing Press team, where fetching 10 posts returned 132,000 tokens from School but only 2,000 tokens entered the Claude context window — a 66x compression. Contact Goat does the same thing: heavy lifting happens outside your context, clean result comes in.
Now you have a working email lookup that returns verified results without bloating your session.
Step 5: Build a skill around it
A raw CLI call works, but the real value comes from wrapping Contact Goat in a Claude Code skill — a reusable instruction set that tells Claude when and how to invoke the CLI automatically.
Tell Claude:
“Can you build a skill around Contact Goat so I can just say ‘find the email for X at Y’ and it knows to use the CLI?”
Claude will create a skill file that maps natural language patterns to the correct CLI invocations. Once this is set up, you don’t have to think about the CLI at all — you just describe what you want.
Now you have a natural-language email lookup that runs verified checks automatically.
Chaining Contact Goat Into a Larger Workflow
- ✕a coding agent
- ✕no-code
- ✕vibe coding
- ✕a faster Cursor
The one that tells the coding agents what to build.
A single email lookup is useful. A workflow that does research, finds contacts, verifies emails, and drafts outreach is more interesting.
Here’s a concrete example. Say you want to reach out to engineering leaders at companies that recently posted about scaling problems on Hacker News. You could chain:
- Hacker News CLI (also in the Printing Press catalog) to pull recent posts matching a topic
- Contact Goat to find verified emails for the authors or relevant people at those companies
- A Claude prompt to draft personalized outreach based on what they posted
Each CLI returns compact, pre-formatted output. Each step feeds cleanly into the next without blowing up your context window. This is the composability that makes CLIs genuinely better than MCP servers for this kind of agent workflow — not just more token-efficient, but more reliable as the chain gets longer.
If you’re thinking about how to build skills that chain multiple tools like this, the post on automating social media content repurposing with Claude Code skills shows the same pattern applied to a different domain — useful for understanding the skill architecture.
For teams that want to share these workflows without sharing credentials, the Printing Press approach is clean: package the CLI and skill into a GitHub repo, push it to a private repository, and have each team member clone it and substitute their own API keys. The CLI holds auth tokens locally, so there’s no credential-sharing problem. You can also build more sophisticated orchestration on top of this — platforms like MindStudio handle multi-agent coordination with 200+ models and 1,000+ integrations if you want a visual layer over what you’re building in Claude Code.
Where Things Go Wrong
LinkedIn session expiration. LinkedIn sessions don’t last forever. If Contact Goat starts returning errors or empty results, the first thing to check is whether your session token has expired. Re-run the authentication step.
Happenstand cross-check failures. If the LinkedIn lookup succeeds but the Happenstand cross-check fails, you’ll get a result with lower confidence or no verified email. This isn’t a bug — it means the two sources didn’t agree on a match. The CLI should tell you this explicitly. Don’t use an unverified result for cold outreach.
Rate limits. Contact Goat uses a real LinkedIn session, which means LinkedIn’s rate limits apply. If you’re running bulk lookups, you’ll hit them. The CLI’s local SQLite mirror helps here — results are cached, so repeated lookups for the same person don’t hit LinkedIn again. But for large lists, pace your requests.
Go not in PATH. If Claude Code can’t find the CLI binary after installation, Go’s bin directory might not be in your PATH. Claude can usually diagnose this if you tell it the command isn’t working. The fix is adding ~/go/bin to your PATH in your shell config.
The person isn’t on LinkedIn. Contact Goat’s LinkedIn lookup is the first step in the chain. If the person doesn’t have a LinkedIn profile, or their profile is too sparse to match, the whole chain fails. This is expected behavior, not a bug.
Seven tools to build an app. Or just Remy.
Editor, preview, AI agents, deploy — all in one tab. Nothing to install.
CLI output looks wrong. The Printing Press CLIs go through what the team calls “dog food runtime verification and scoring” — Claude actually runs the CLI and checks the output during the build process. But if you’re seeing malformed output, check the GitHub repo for the CLI version you installed. The library is actively maintained and bugs get fixed.
Where to Take This Further
Contact Goat is one CLI in a library that’s growing. The same pattern — CLI wraps a complex data source, returns clean output, lives locally — applies to everything in the Printing Press catalog.
A few directions worth exploring:
Build your own CLI for a site that matters to you. The Printing Press factory (installed alongside the starter pack) lets Claude Code research any site, catalog its features, generate a Go CLI, and verify it works — in roughly 10 minutes for simple cases. If there’s a tool you use daily that has no good API, this is how you get a CLI for it. The browser automation with Claude Code and Playwright post covers a complementary approach for sites that need a real browser session.
Share CLIs across your team. Package a CLI and its skill into a GitHub repo, push it privately, and have teammates clone it with their own credentials. This is how you build internal tooling without everyone having to set it up from scratch.
Chain Contact Goat with outreach tools. The verified email is the starting point. What you do with it — drafting, scheduling, tracking — is a separate workflow. If you’re building the kind of agent that handles the full outreach loop autonomously, the post on building AI agents for marketing teams covers what that architecture looks like end-to-end.
Think about what you’re building on top of this. CLIs give you clean, reliable data. If you’re turning that data into a product — a lead enrichment tool, a recruiting assistant, a partnership research workflow — the question becomes how you ship it. Remy takes a different approach to that problem: you write an annotated markdown spec describing your application, and it compiles into a complete TypeScript backend, SQLite database, auth, and deployment. The spec is the source of truth; the code is derived output. Useful when the CLI workflow you’ve built needs to become something your team can actually hand to other people.
The Printing Press library is new — it launched recently and the catalog is still growing. But the underlying idea is sound: CLIs are the right interface between agents and the web, and building them shouldn’t require knowing Go or reverse-engineering authentication flows by hand. Contact Goat is a good first test of whether this approach works for your use case. Run a few lookups, check the verification quality, and see whether the results are good enough to build on.
If they are, the rest of the catalog is worth exploring. If they’re not, the factory is there to help you build something better.