Ingest
POST
/users/{user_id}/meeting-signals
const url = 'https://example.com/users/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/meeting-signals';const options = { method: 'POST', headers: {'Content-Type': 'application/json'}, body: '{"meetings":[{"duration_min":1,"external_id":"example","meeting_type":"one_on_one","occurred_at":"2026-04-15T12:00:00Z","participant_count":1,"rubric_version":"example","scorer":"example","sentiment_arousal":1,"sentiment_valence":1,"talk_share":1,"turn_count":1}]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://example.com/users/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/meeting-signals \ --header 'Content-Type: application/json' \ --data '{ "meetings": [ { "duration_min": 1, "external_id": "example", "meeting_type": "one_on_one", "occurred_at": "2026-04-15T12:00:00Z", "participant_count": 1, "rubric_version": "example", "scorer": "example", "sentiment_arousal": 1, "sentiment_valence": 1, "talk_share": 1, "turn_count": 1 } ] }'Bulk-upsert derived meeting signals (idempotent on user+external_id) and recompute the affected days’ meeting metrics (sentiment / engagement / count).
Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”user_id
required
User Id
string format: uuid
Request Bodyrequired
Section titled “Request Bodyrequired”Media typeapplication/json
MeetingSignalsBatchIngest
object
meetings
required
Meetings
Array<object>
MeetingSignalIngestOne captured meeting’s derived signals. The transcript is read + scored upstream (Claude via
the Granola MCP); only these scores are sent. external_id is Granola’s opaque meeting UUID and
the dedup key — re-deriving the same meeting updates its row in place.
object
external_id
required
External Id
string
occurred_at
required
Occurred At
string format: date-time
Responses
Section titled “Responses”Successful Response
Media typeapplication/json
MeetingSignalsIngestResult
object
created
required
Created
integer
days_recomputed
required
Days Recomputed
integer
updated
required
Updated
integer
Examplegenerated
{ "created": 1, "days_recomputed": 1, "updated": 1}Validation Error
Media typeapplication/json
HTTPValidationError
object
detail
Detail
Array<object>
ValidationErrorobject
loc
required
Location
Array
msg
required
Message
string
type
required
Error Type
string
Examplegenerated
{ "detail": [ { "loc": [ "example" ], "msg": "example", "type": "example" } ]}