Public API · v1
Gauge REST API
Authenticate with a Bearer token (format cn_live_xxx for production, cn_test_xxx for test mode). Generate one in Settings → API Keys. The raw key is shown exactly once at creation time.
Scopes
readGET endpoints only. Default for new keys.
Rate limit: 60 requests / minute / key
read_writeGET, POST, PUT, DELETE. Required for write operations.
Rate limit: 600 requests / minute / key
Endpoints
/api/v1/keysList your active API keys. Raw secrets are never returned.
Auth
Clerk session OR Bearer cn_live_…Response
{
"keys": [
{
"id": "ck_abc123",
"name": "Zapier integration",
"prefix": "cn_live_a1b2c3d4",
"scope": "read",
"lastUsedAt": "2026-06-20T17:00:00Z",
"createdAt": "2026-06-15T10:00:00Z"
}
]
}Error codes
401 Unauthorized500 Internal error
/api/v1/keysCreate a new key. Returns the raw key ONCE — store it now.
Auth
Clerk session (creation only — UI recommends Settings → API Keys)Request body
{
"name": "Zapier integration",
"scope": "read" // optional, default "read"
}Response
{
"id": "ck_abc123",
"name": "Zapier integration",
"prefix": "cn_live_a1b2c3d4",
"scope": "read",
"createdAt": "2026-06-20T17:00:00Z",
"raw": "cn_live_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"
}Error codes
400 Invalid JSON / name required (1-64 chars)401 Unauthorized500 Internal error
/api/v1/keys/[id]Revoke a key. Audit row is retained; resolveApiKey returns null after.
Auth
Clerk session OR Bearer cn_live_… (must own the key)Response
{ "ok": true }Error codes
401 Unauthorized404 Not found (key does not exist or is not yours)409 Already revoked500 Internal error
/api/v1/callsList your most recent 50 calls.
Auth
Clerk session OR Bearer cn_live_… (read scope minimum)Response
{
"calls": [
{
"id": "call_xyz",
"filename": "discovery-acme-2026-06-20.mp3",
"createdAt": "2026-06-20T17:00:00Z",
"healthScore": 8.4,
"duration": 1394,
"source": "upload"
}
]
}Error codes
401 Unauthorized403 Insufficient scope (need read or read_write)429 Rate limit exceeded (with Retry-After)500 Internal error
/api/webhooksRegister a team webhook endpoint. Secret is auto-generated (32-byte hex) when omitted and returned exactly once on create.
Auth
Clerk session (Business plan — webhooks feature)Request body
{
"url": "https://example.com/hooks/gauge",
"secret": "optional-signing-secret",
"events": ["call.analyzed"] // subset of call.created, call.analyzed, call.deleted
}Response
{
"id": "wh_abc123",
"url": "https://example.com/hooks/gauge",
"events": ["call.analyzed"],
"hasSecret": true,
"secret": "returned-once-on-create"
}Error codes
400 url required / must start with https://400 events must be a subset of [call.created, call.analyzed, call.deleted]400 Webhooks require a team workspace401 Unauthorized403 Webhooks are a Business plan feature500 Internal error
/api/cron/webhook-dispatchDispatch up to 20 pending/retrying webhook deliveries due for retry. Retries with 5s timeout + HMAC signature, backoff, max 8 attempts.
Auth
Bearer CRON_SECRET (server cron only)Response
{
"processed": 20,
"delivered": 18,
"failed": 2
}Error codes
401 Unauthorized (missing or invalid CRON_SECRET)500 CRON_SECRET not configured
/api/v1/botsDispatch a meeting bot via paste-a-link. Without RECALL_API_KEY the session is stored as pending_manual; with a key the bot joins and a meeting.summary_ready event is enqueued on completion.
Auth
Bearer cn_live_… (requires read_write scope)Request body
{
"meetingUrl": "https://meet.google.com/abc-defg-hij",
"title": "Acme discovery"
}Response
{
"id": "bot_xyz",
"status": "pending",
"mode": "recall",
"meetingUrl": "https://meet.google.com/abc-defg-hij",
"platform": "googleMeet"
}Error codes
401 Unauthorized403 Insufficient scope (need read_write)400 INVALID_MEETING_URL429 Rate limit exceeded (with Retry-After)502 BOT_DISPATCH_FAILED
/api/slack/digestPost a per-meeting digest (summary + action items + health score) to the team's Slack channel. Accepts an optional risk payload (riskScore, riskFlags, nextQuestions) surfaced in the Slack blocks. When callId is provided, the caller's access is verified with the same IDOR guard as POST /api/slack.
Auth
Clerk session (team workspace required)Request body
{
"title": "Acme discovery — 2026-09-27",
"summary": "Agreed on pilot scope…",
"actionItems": ["Send proposal by Friday"],
"healthScore": 82,
"callId": "call_xyz"
}Response
{
"delivered": true,
"channel": "#general"
}Error codes
400 title required400 team workspace required401 Unauthorized403 Forbidden (call belongs to another team)404 Call not found (when callId provided)500 Slack digest failed
/api/calls/[id]/deal-scoreScore a call's deal risk: riskScore out of 64 with risk flags, missing MEDDPICC/BANT fields, and follow-up questions.
Auth
Clerk session (must own the call)Response
{
"riskScore": 42,
"riskFlags": ["No economic buyer identified"],
"missingFields": ["budget", "decision_process"],
"nextQuestions": ["Who signs off on budget?"]
}Error codes
401 Unauthorized403 Forbidden (call belongs to another user)404 Call not found
Quickstart
Once you have a key, list your calls:
curl -H "Authorization: Bearer cn_live_YOUR_SECRET" \
https://usegauge.com/api/v1/callsThe middleware automatically excludes /api/v1/* from Clerk session checks so API-key-only requests pass without a browser cookie.
Need a feature?
Want webhooks, additional scopes, or write endpoints (POST/PUT /api/v1/calls)? Open an issue or email api@usegauge.com. Public request log at github.com/Poilsarr/sales-call-notes.
