Agent skill
blitz-api
Search and enrich companies, people, and job postings with the Blitz API (blitz-api.ai) without falling into its silent-failure traps.
Filed under Prospecting and list building.
From OneGTM/gtm-skills · 9 skill entries · 0 · pushed 2026-09-30
What it does when it runs
Search and enrich companies, people, and job postings with the Blitz API (blitz-api.ai) without falling into its silent-failure traps. Use whenever building lead lists, sizing a TAM, pulling hiring signals, finding employees at an account, or enriching emails through Blitz. Covers the real filter schema, pagination, full-text matching traps, and the checks that catch a query that quietly filtered nothing.
Automated analysis of the skill and the 0 files bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.
- Keys and connectors you must supply
- BLITZ_API_KEY
- Hosts it reaches
- api.blitz-api.ai
- docs.blitz-api.ai
- Tool permissions it declares
- No
allowed-toolsin the frontmatter. It does act, so it runs under whatever permissions your session already grants. - Actions present in the files
- shell
Install it
View source on GitHub ↗git clone --depth 1 --filter=blob:none --sparse https://github.com/OneGTM/gtm-skills.git /tmp/gtm-skills git -C /tmp/gtm-skills sparse-checkout set "skills/blitz-api" mkdir -p ~/.claude/skills/blitz-api cp -R "/tmp/gtm-skills/skills/blitz-api/." ~/.claude/skills/blitz-api/
Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗
Or take the whole library
This repo ships a .claude-plugin manifest, so Claude Code can install all 9 skills at once. Plugin skills are invoked as /<plugin>:<skill>, so they never collide with your own.
/plugin marketplace add OneGTM/gtm-skills /plugin
The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.
Before you install: this skill will not complete its job on a bare agent. It needs BLITZ_API_KEY, which you have to obtain separately.
The skill
Source on GitHub ↗Reproduced in full from OneGTM/gtm-skills/blob/36da828338f8062c90f6a4a8ea8b918e4160f1e5/skills/blitz-api/SKILL.md, which is licensed MIT (repository). 813 words, 7 headings.
Blitz API
Base https://api.blitz-api.ai, header x-api-key. Spec: https://docs.blitz-api.ai/api-reference/v2.openapi.json (index at /llms.txt). Check your plan and allowed routes with GET /v2/account/key-info before a big run.
Endpoints worth knowing
| Endpoint | Use |
|---|---|
POST /v2/search/companies | Company search over ~66M companies |
POST /v2/search/people | People search, filterable by company and person fields |
POST /v2/search/employee-finder | Every employee at one company_linkedin_url |
POST /v2/jobs/search | Job postings, filterable by recency (job.date_posted.last_days) |
POST /v2/jobs/company | Postings at one company |
POST /v2/company/tam-by-jobs | Companies sized by who is hiring for what |
POST /v2/enrichment/email | person_linkedin_url to work email |
POST /v2/enrichment/domain-to-linkedin | Domain to company LinkedIn URL (use for exact account matching) |
POST /v2/enrichment/company-distribution-by-department | Headcount by department (how big is their GTM team, really) |
POST /v2/search/waterfall-icp-keyword | Ordered title tiers; tier N+1 runs only if tier N is empty |
The traps (each one cost us a day)
- Unknown filter keys return 200 and filter nothing. A typo reads as a 66-million-company market. Real filters are nested under
company,people, orjob. Always compare the filteredtotal_resultsagainst the unfiltered total and fail loudly if it did not drop. max_resultsis the page size.per_page,limit, andpage_sizeare accepted and ignored (you get 10). The cap is 50; 100 is a 422. Pagination iscursoronly.page,offset, andfromare silently ignored, so a page loop re-fetches page 1 forever and reports success.- The filter shape is inconsistent. Most keys take
{"include": [...], "exclude": [...]}. These take plain arrays:employee_range,hq.country_code,hq.continent,hq.sales_region,company.linkedin_url,people.job_function,people.job_level. These take{"min","max"}:founded_year,employee_count,revenue,web_traffic,ad_spend,total_funding. - To learn the real schema, send the wrong type, not the wrong key. A wrong key is silent; a wrong type 422s and names the expected shape.
industryis a strict enum that does not match returned labels. Some labels that appear on records are rejected as filters. One bad value 422s the whole request and names the index, not the string. Validate each industry value on its own before shipping a segment.- Name and title matching is full-text.
company.name: "Check"returns Check Point employees; on one real run 64% of returned people worked at a company we never asked for.job_title: "President"matches "Vice President of Client Services". Bracket for exact match ("[CEO]"), and when you know the account, filter oncompany.linkedin_url(exact) instead of name. Re-check every returned person'scompany_linkedin_urlagainst the account you requested. - Funding, revenue, traffic, and ad spend are filter-only. You can target on them but they never come back in the payload. Anything you need to store or cite has to come from another provider.
employee_countandsizedisagree.employee_countfilters observed LinkedIn headcount;sizeis the self-reported band shown in results. Expect about 20% of a pull to sit outside the band you asked for.- Search returns the current role only. No tenure history. Education and skills do come back.
- Email enrichment is not a job-change check. Recent leavers still resolve to their old employer's address with
found: true, because the source is LinkedIn's current-company field. - Job posting counts lie.
matched_jobscounts postings, not roles. One company showed 146 GTM roles that were two titles reposted across cities. Re-score on distinct titles before ranking anyone on hiring volume. Gate geography oncompany.hq, notjob.location(job country codes are unreliable). - The waterfall catch-all leaks. With
include_headline_search: true, a loose tier grabs whoever sounds senior. Bracket full titles in any tier that also searches headlines.
Minimal client
import json, os, subprocess
BASE = "https://api.blitz-api.ai"
def call(path, body, timeout=60):
"""Returns (status, parsed). Uses curl so an exception never prints the key."""
cmd = ["curl", "-s", "--max-time", str(timeout), "-w", "\n%{http_code}",
"-X", "POST", BASE + path,
"-H", "x-api-key: " + os.environ["BLITZ_API_KEY"],
"-H", "Content-Type: application/json", "-d", json.dumps(body)]
out = subprocess.run(cmd, capture_output=True, text=True).stdout
text, _, code = out.rpartition("\n")
return int(code or 0), (json.loads(text) if text.strip() else {})
def search_all(path, body, limit=500):
body = {**body, "max_results": 50}
rows, cursor = [], None
while len(rows) < limit:
if cursor:
body["cursor"] = cursor
status, data = call(path, body)
if status != 200:
raise RuntimeError(f"{status}: {data}")
batch = data.get("results") or []
rows += batch
cursor = data.get("cursor")
if not batch or not cursor:
break
return rows[:limit]
Example: recent job postings for a title
rows = search_all("/v2/jobs/search", {
"job": {"title": {"include": ["GTM Engineer"]}, "date_posted": {"last_days": 30}},
}, limit=1000)
# Dedupe on (company_linkedin_url, normalized title) before counting anything.
Before you trust a run
- The filtered total dropped versus the unfiltered baseline.
- The first page's records actually match the filters you sent (eyeball five).
- People were re-checked against the requested
company_linkedin_url. - Counts are on distinct roles or distinct companies, not raw postings.
Other skills for the same job
Different authors, same problem. Matched on the words in the skill name, across every library in the catalogue except this one.
- blitz-list-builder by growthenginenowoslawski · 739
- prospeo-search-api by growthenginenowoslawski · 739
- smartlead-api by growthenginenowoslawski · 739
- extruct-api by extruct-ai · 109
- gtm-api-linkedin by gtm-api · 89
- ai-api-developer-gtm by 0xF4ng · 6
- ga4-api-reporting by Ad-Superpowers · 5
- blitz-list-builder by timyakubson · 3
Need help setting it up?
This page tells you what blitz-api does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.
Book a call →The directory stays free. There is nothing gated behind this.