Enterprise-grade contact data, plus a signal that a company is already shopping.
ZoomInfo is the premium end of B2B data. Your agent searches it for people and companies, resolves emails and direct dials, and pulls intent signals showing which accounts are in market right now. It costs more than the alternatives, and it covers more.
ZoomInfo can start a pipeline or rescue one. Use it to discover accounts, or to fill the gaps a cheaper enricher left behind.
confirm an intent signal against live job postings
qualify an account by the stack it actually runs
a cheaper first pass before you spend ZoomInfo credits
enterprise data belongs on the enterprise record
Ask for the outcome and your agent composes the run itself. Or start from a skill, a whole pipeline it already knows end to end.
browse all skills →Every tool ships with a written playbook, and the agent loads it before the first call. Auth, rate limits, what each call costs, which actions need your approval, and the mistakes worth avoiding. It is the difference between an agent that knows the tool and one that guesses at it.
Read the ZoomInfo docs →HOW in lib/zoominfo.py. Paths CONFIRMED from docs.zoominfo.com (2026-06-01); index: reference/docs/zoominfo/raw/endpoints.md.
https://api.zoominfo.com/gtm (families: oauth/v1, data/v1, copilot/v1).POST /gtm/oauth/v1/token — HTTP Basic client_id:client_secret, body grant_type=client_credentials (+ optional scope), x-www-form-urlencoded → Bearer (expires_in ~1h). The adapter caches the token, refreshes before expiry, and re-auths once on a 401.ZOOMINFO_CLIENT_ID, ZOOMINFO_CLIENT_SECRET (DevPortal app), optional ZOOMINFO_SCOPE. Never hardcode. Per-endpoint scopes (api:data:contact, api:data:company, …) must be granted to the app; omit scope to get all configured.Enrich (CONFIRMED): enrich_contacts, enrich_companies (≤25 records, body {"data":{matchXInput:[…], outputFields:[…]}}), enrich_scoops, enrich_intent. Search (CONFIRMED): search_contacts, search_companies (filters in body data; page[number]/page[size] 1-100 + sort as query). Copilot (CONFIRMED): company_lookalikes, contact_recommendations. user_usage (credits). Pattern-inferred (verify on pilot): enrich_news/technologies/org_charts/corporate_hierarchy/hashtags, search_intent/news/scoops, contact_lookalikes. Everything else (lookup, insights, entitlements, agent-teams, account-summary, ICP/persona/competitor config, audiences, GTM-Studio columns/folders/rows, workflows, engagements) → generic request("POST"|"GET", "data/v1/…"|"copilot/v1/…", json=…).
user_usage() to check balance. Pilot a 1-record enrich first; gate bulk behind approval. Enrich is capped at 25 records/call.Net-new sourcing + enrichment layer: search_companies/search_contacts (discover) → enrich_* (resolve emails/phones/firmographics) → signals (enrich_intent/enrich_scoops) for prioritization → hand to sequencers / ATS. Premium alternative/complement to [[apollo]] and the waterfall enrichers.
lib/zoominfo.pyImport: from lib.zoominfo import ZoomInfo → instantiate ZoomInfo() (reads key from env). Base: https://api.zoominfo.com/gtm. Generic passthrough: request(method, path, *, params, json).
company_lookalikes(**params) -> Any — GET /copilot/v1/companies/lookalikes — similar companies (CONFIRMED).contact_lookalikes(**params) -> Any — GET /copilot/v1/contacts/lookalikes (inferred — verify on pilot).contact_recommendations(**params) -> Any — GET /copilot/v1/contacts/recommendations — recommended contacts (CONFIRMED).enrich_companies(payload: dict) -> Any — POST /data/v1/companies/enrich — up to 25. data.matchCompanyInput + outputFields. scope api:data:company.enrich_contacts(payload: dict) -> Any — POST /data/v1/contacts/enrich — up to 25 records. data.matchPersonInput + outputFields. scope api:data:contact.enrich_corporate_hierarchy(payload: dict) -> Any — POST /data/v1/corporate-hierarchy/enrich (inferred slug — verify).enrich_hashtags(payload: dict) -> Any — POST /data/v1/hashtags/enrich (inferred).enrich_intent(payload: dict) -> Any — POST /data/v1/intent/enrich — intent signals.enrich_news(payload: dict) -> Any — POST /data/v1/news/enrich (inferred).enrich_org_charts(payload: dict) -> Any — POST /data/v1/org-charts/enrich (inferred slug — verify).enrich_scoops(payload: dict) -> Any — POST /data/v1/scoops/enrich — company scoops (signals).enrich_technologies(payload: dict) -> Any — POST /data/v1/technologies/enrich (inferred).search_companies(payload: dict, *, page_number: int | None = None, page_size: int | None = None, sort: str | None = None) -> Any — POST /data/v1/companies/search — page[number]/page[size] (1-100, default 25) + sort as query params.search_contacts(payload: dict, *, page_number: int | None = None, page_size: int | None = None, sort: str | None = None) -> Any — POST /data/v1/contacts/search — body holds filters under data; page[number]/page[size]/sort are query params.search_intent(payload: dict, **params) -> Any — POST /data/v1/intent/search (inferred).search_news(payload: dict, **params) -> Any — POST /data/v1/news/search (inferred).search_scoops(payload: dict, **params) -> Any — POST /data/v1/scoops/search (inferred).user_usage(**params) -> Any — GET /data/v1/users/usage — API usage/credits (CONFIRMED; safe read-only pilot).