You can use the webhook integration in automations to export your meeting data and and build custom integrations.
Setup
Open Automations and select Create automation.
Add automation conditions to limit which meetings the automation runs after and select Next.
Select Send webhook request.
Enter the endpoint URL you'd like to send webhook requests to and the meeting outcomes you'd like included.
Optionally, send a test request for the most recent meeting to verify that it's working.
Select Done.
Give your automation a name at the top and select Create.
Now, every meeting that matches your automation conditions will be sent to your webhook endpoint.
Requests
Once configured, you’ll start receiving POST requests at the provided endpoint URL with a JSON body that includes the following fields:
id(number): Circleback meeting ID, can be used to generate a link to the meeting on Circleback (https://app.circleback.ai/meetings/${id})name(string): meeting namecreatedAt(string): meeting creation date formatted in ISO stringduration(number): meeting duration in secondsurl(string or null): URL of the virtual meeting (i.e. Zoom, Google Meet, Microsoft Teams)recordingUrl(string or null): URL of the meeting’s recording file which is only valid for 24 hours (only available if saving meeting recordings is enabled in settings)tags(array of strings): names of the tags added to the meetingicalUid(string or null): unique identifier of the calendar event associated with the meetingattendees(array of objects): meeting attendeesname(string or null): calendar event invitee name if associated with calendar event or name of meeting participantemail(string or null): calendar event invitee email if associated with calendar event
notes(string): Circleback meeting notes with Markdown formattingactionItems(array of objects): array of action items created for meetingid(number): Circleback action item IDtitle(string): action item titledescription(string): action item descriptionassignee(object or null): action item assignee object or null if unassignedname(string or null): assignee nameemail(string or null): assignee email
status(string): action item status, one of 'PENDING' or 'DONE'
transcript(array of objects): meeting transcript segmentsspeaker(string): speaker nametext(string): words spokentimestamp(number): timestamp in seconds that marks the beginning of the segment
insights(object):[insightName](string object key): name of the user-created insightarray of objects
insight(string or object if insight has custom fields): the insight resultspeaker(string or null): speaker the insight is associated with (if any)timestamp(number or null): the timestamp in seconds the insight is associated with (if any)
Example
{
"id": 1234,
"name": "Event Venue Review",
"createdAt": "2023-07-25T20:30:57.926Z",
"duration": 1306.09,
"url": "https://meet.google.com/abc-defgh-xyz",
"recordingUrl": null,
"tags": ["Events"],
"icalUid": "[email protected]",
"attendees": [
{ "name": "John Appleseed", "email": "[email protected]" },
{ "name": "Samantha Grey", "email": "[email protected]" }
],
"notes": "#### Overview\n* Several options for event venues were reviewed...",
"actionItems": [
{
"id": 252,
"title": "Contact event venues",
"description": "Reach out to Sunriver Events and other potential event venues to see if they would be open to hosting the event this summer.",
"assignee": {
"name": "John Appleseed",
"email": "[email protected]"
},
"status": "PENDING"
},
{
"id": 253,
"title": "Review and finalize venue options",
"description": "Review pricing and availability of venues and pick a venue for the event.",
"assignee": null,
"status": "PENDING"
}
],
"transcript": [
{
"speaker": "John Appleseed",
"text": "Hey, how's it going?",
"timestamp": 4.56
},
{
"speaker": "Samantha Grey",
"text": "Going well, just testing webhooks in Circleback.",
"timestamp": 18.32
}
],
"insights": {
"Customer details": [
{
"insight": {
"Company name": "Initech",
"Number of employees": 120
},
"speaker": "John Appleseed",
"timestamp": 800.00
}
],
"Questions": [
{
"insight": "Is this thing on?",
"speaker": "Samantha Grey",
"timestamp": 49.15
},
{
"insight": "When will the webhook integration be ready?",
"speaker": "John Appleseed",
"timestmap": 120.12
}
]
}
}Verifying incoming requests (optional)
To ensure the the webhook events received are from Circleback, you can choose to verify incoming requests using a signing secret. This is an optional step, but it is recommended for added security.
When you configure the webhook in an automation, you will be provided with a signing secret. This signing secret is a unique, secure string that is used to generate a cryptographic signature for each webhook event.
To verify the signature, you can follow these steps:
Extract the signature from the incoming request headers. The signature is in a header named
x-signature.Generate the expected signature using the signing secret and the request body.
Compare the expected signature with the provided signature. If they match, the request is considered valid and you can proceed to process the webhook event.
Here's an example implementation in TypeScript:
import crypto from 'crypto';
export const verifyWebhookSignature = (
requestBody: string,
signature: string, // 'X-Signature' header in the incoming request
signingSecret: string // Signing secret from Settings → Webhook (whsec_...)
): boolean => {
// Generate the expected signature
const expectedSignature = crypto.createHmac('sha256', signingSecret)
.update(requestBody)
.digest('hex');
// Compare the expected signature with the provided signature
return expectedSignature === signature;
};
// Example usage in a webhook endpoint handler
export const webhookEndpointHandler = async (req: express.Request, res: express.Response) => {
try {
// Extract the necessary data from the request
const { body: requestBody } = req;
const signature = req.headers['x-signature'] as string;
const signingSecret = 'your-signing-secret';
// Verify the signature
if (!verifyWebhookSignature(JSON.stringify(requestBody), signature, signingSecret)) {
return res.status(401).json({ error: 'Invalid signature.' });
}
// Process the webhook event
await processWebhookEvent(requestBody);
// Return a success response
return res.status(200).json({ message: 'Webhook event processed successfully.' });
} catch (error) {
console.error('Error processing webhook event.', error);
return res.status(500).json({ error: 'Error processing webhook event.' });
}
};
Make sure to replace 'your-signing-secret' with the actual signing secret from the webhook automation step.
By verifying the signature, you can ensure that the webhook events you receive are from Circleback and have not been tampered with. This helps to protect your application from unauthorized access and potential attacks.
