wikis / Cloudflare OS / wiki / entities / gatekeeper-zoominfo.md view as markdown report a mistake
Overview
The ZoomInfo gatekeeper integrates Gadgets with ZoomInfo's GTM (go-to-market) API via OAuth2 (Authorization Code + PKCE), letting a gadget look up controlled filter values, search company/contact/intent/scoop/news data for free, enrich matched records (consuming credits), use Copilot features (lookalikes, recommendations, AI account summaries), and read usage/credit counters — all for one connected ZoomInfo account.
Characteristics
- Single whole-account resource:
https://app.zoominfo.com/, scoped to one connected account's OAuth grant and package entitlements. ZoomInfo is not a sign-in provider (getAuthenticatedEmail()returnsnull). - Capabilities: Lookup (resolve controlled filter values, discover entitled enrich fields — free); Search (companies, contacts, intent signals, scoops, news — free, full firmographic/technographic filters); Enrich (turn matches into full detail — consumes credits); Copilot (lookalikes, contact recommendations, AI account summaries + ask, curated insight signals); Usage (credit/limit counters).
- Auth: OAuth2 Authorization Code + PKCE (S256), with refresh-token rotation; the
authorization_codeexchange posts Client ID + Secret as HTTP Basic auth (form-urlencoded) to the token endpoint. - Scopes requested (verbatim, no wildcard/
lookupscope):api:data:company api:data:contact api:data:intent api:data:news api:data:scoops api:recommendations:read api:account-summary:read api:insights:read - Redirect URI:
${BASE_URL}/gatekeeper/zoominfo/oauth(http://localhost:8787/gatekeeper/zoominfo/oauthlocally). - Config (verbatim), seeded from root
.dev.vars:
Optional overrides:ZOOMINFO_CLIENT_ID=<oauth app client id> ZOOMINFO_CLIENT_SECRET=<oauth app client secret>BASE_URL(defaulthttp://localhost:8787/gatekeeper/zoominfo) andZOOMINFO_API_BASE_URL(defaulthttps://api.zoominfo.com/gtm). - Credits: search/lookup/recommendations/insights/account summaries are free; enrichment costs roughly one credit per newly-enriched record (already-owned or no-match/error results are free);
getCreditUsage()is authoritative — the per-recordcreditChargedflag is a display-only upper bound. - Approvals: reads are logged as observations; each
enrich*call is submitted to the approval queue and spends credits only once approved, with results fetched afterward viagetEnrichmentResult(ticket). Enrichments are not simulated — they carryawaitDecision, so the agent's turn suspends until the decision. - Constraints: intent/scoop search filters by firmographics only (no company identity); to target a known company use
enrichIntent/enrichScoopsinstead.stateandcountryare mutually exclusive — ZoomInfo silently ignoresstatewhencountryis set, so the gatekeeper rejects the combination up front. Every call is scoped to the account's package entitlements; unentitled fields return empty.
How to Use
- Create an OAuth application in the ZoomInfo Developer Portal.
- Set the redirect URI to
${BASE_URL}/gatekeeper/zoominfo/oauth. - Enable all eight API scopes listed above.
- Copy Client ID/Secret into
ZOOMINFO_CLIENT_ID/ZOOMINFO_CLIENT_SECRET(root.dev.vars); ensure the app issues refresh tokens (enable the refresh-token grant). - Connect the account through the Connections UI; use
getCreditUsage()to track spend before/after enrichment calls.
Common errors: "ZoomInfo Gatekeeper Not Configured" (missing credentials), invalid_scope (scope mismatch with the eight listed), redirect URI mismatch, "ZoomInfo did not return a refresh token" (refresh-token grant not enabled).
Related Entities
- gatekeepers
- writing a gatekeeper
- gatekeeper supabase — comparable OAuth2 + Management/GTM API connector with approval-gated writes
- gatekeepers catalog
