The filtrat API lets you do from code what you do in the app: verify and find work emails, capture leads from LinkedIn, watch posts and events, score and enrich lists. Every endpoint lives under https://api.filtrat.io/v1 and takes and returns JSON.
This guide gets you from no key to your first two results in a few minutes.
1. Create an API key
- In the app, open API in the sidebar.
- Press Create key, give it a name you'll recognise later (for example
ProductionorCRM sync) and press Create. - Copy the key. It starts with
ak_and is shown only once.
Keep the key out of front-end code, public repositories and shared documents. Anyone with the key can spend your credits. If it leaks, revoke it on the same page and create a new one.
2. Verify an email
Replace ak_your_key with your key:
curl -X POST https://api.filtrat.io/v1/verify/email \
-H "Authorization: Bearer ak_your_key" \
-H "Content-Type: application/json" \
-d '{"email": "jane.doe@acme.com"}'The answer comes back in the same response. The fields you'll use most:
| Field | What it tells you |
|---|---|
status | verified, invalid, catchall, risky or unknown |
diagnosis | Why, when the address isn't verified |
disposable, role_account | A throwaway address, or a shared one like info@ |
domain_intelligence.catch_all | The domain accepts mail for any address |
credits_used, credits_remaining | What this call cost and what's left |
A verified or invalid result costs 1. Catch-all, risky and unknown results are free. Add "resolve_catchall": true to turn a catch-all result into verified or invalid (5 more, only when it gets a clear answer). See What each result means.
3. Find an email
curl -X POST https://api.filtrat.io/v1/finder/search \
-H "Authorization: Bearer ak_your_key" \
-H "Content-Type: application/json" \
-d '{"first_name": "Jane", "last_name": "Doe", "domain": "acme.com", "company_name": "Acme"}'Read found_email and status (found or not_found). An email found costs 20, or 25 when it needed catch-all resolution. Not found is free. Finding an email behind a catch-all domain with resolve_catchall on (the default) costs 5 on top of the found email: 20 + 5 = 25. The 25 are held when the request starts. If the email isn't found, they're all given back, so a not-found costs nothing. If the email is found on a domain that didn't need resolution, the extra 5 are given back and you pay 20.
Always send company_name when you have it, and linkedin_url too. They help when the website's domain doesn't receive mail, and complete a shortened last name like "Jane D.". See Why add the company name.
4. Go further
| To do this | Start with |
|---|---|
| Verify a whole list | POST /v1/bulk/jobs/from-list, then follow the job |
| Find emails for many people | POST /v1/bulk-finder/jobs/from-list, then follow the job |
| Save people from a Sales Navigator search, a post or an event | POST /v1/capture-jobs/ |
| Check your balance | GET /v1/credits/balance |
Anything with many rows runs in the background as a job. Long-running jobs explains how to start one, follow it and read its rows.
Every endpoint, field and example is in the full API reference.
Prefer not to write code?
- Use filtrat from Claude, Claude Code or Cursor with MCP.
- Add a column to a Clay table: Use filtrat in Clay.
- Import a ready workflow into n8n: Workflow templates.