Gong Sensor
What it ingests
Recorded sales calls and their transcripts from Gong — titles, participants, timing, and the speaker-tagged conversation. Each call that has a usable transcript lands as a Meeting in the knowledge graph, with Person ATTENDED edges for every party Gong named, and an LLM pass over the transcript for Topics, Decisions, ActionItems, and mentioned Organizations.
Transcripts are the capture gate
A call that has not been transcribed produces nothing for this source to ingest — no Meeting, no attendee list. Gong often finishes transcription a few minutes after the call ends; the sensor re-reads a 30-minute window on every poll so a late transcript is still seen. Private calls (isPrivate) are skipped.
Read-only and poll-based. Historical ingest is owned by Backfill; the first poll after enable seeds the watermark to now and emits nothing, so turning the source on does not dump years of calls in one tick.
This is one sensor. Zoom transcripts, Greenhouse, inbound webhook, Salesforce, and the local file watcher are not modes of this type.
Credential
References a gong_access_key credential by id. The secret is JSON with both halves of the pair Gong mints together:
{ "access_key": "…", "access_key_secret": "…" }Gong authenticates every request as HTTP Basic (access_key as username, access_key_secret as password). Splitting the pair across two vault rows would force two rotations for one credential, so they are stored as one blob — the same shape as aws_access_key and microsoft_graph.
curl -sS -X POST https://your-corveil-host/api/credentials \
-H "Authorization: Bearer <admin>" -H "Content-Type: application/json" \
-d '{"type":"gong_access_key","name":"acme-gong","secret":"{\"access_key\":\"…\",\"access_key_secret\":\"…\"}"}'OAuth (Gong's marketplace app flow) is not supported in v1. Create an API key, not a public app.
Config fields
| Key | Required | Notes |
|---|---|---|
workspace_id | no | Numeric Gong workspace id. Blank polls every workspace the key can read. Unknown (non-numeric) values are rejected at configure time. |
Provider-side setup
- In Gong, go to Company Settings → Ecosystem → API.
- Create an Access Key. Copy the access key and the access key secret (the secret is shown only once).
- Grant the key permission to read calls and transcripts. Technical users who should not appear in Gong's UI still need API access.
- Note a workspace id only if you want to restrict ingest to one workspace (the number in the Gong URL, or from
GET /v2/workspaces).
Gong's documented rate limit is about 3 requests per second, shared with every other integration in the workspace. Corveil paces under that ceiling; a 401/403 parks the sensor on a long backoff rather than retrying every tick.
Wire-up
POST /api/sensors
{
"sensor_type": "gong",
"name": "Acme Gong",
"config": {
"workspace_id": "623457276584334"
},
"credentials": { "gong_credential": "<gong_access_key credential id>" }
}Omit workspace_id to poll every workspace the key can read.
Verify
Run Test connection. It authenticates against GET /v2/users so a bad key fails at save rather than on the first poll.
Once polling, each tick's summary log reports events, skipped_private, and skipped_empty_transcript. A sensor that stays at zero events while Gong has recent recorded calls is usually a missing transcript permission, not a bad key — Test connection would have failed for a bad key.
Signals
| Signal | Ontology entity | Hydration |
|---|---|---|
call | Meeting | deterministic (title, parties, timing) |
call | Topic / Decision / ActionItem / Project / Organization / Technology | LLM over the transcript |
Person nodes come from party IdentityHints (email + display name), not a binding row — the same identity path Google Meet uses for attendees, so a rep who also appears in HubSpot or Slack canonicalizes to one Person.