# Circleback API (/docs/api) The Circleback API lets you read your meetings, notes, action items, transcripts, people, and companies. Use it to sync meeting data into your own tools, build automations, or search across your conversations. ## Authentication Send your API key as a bearer token in the `Authorization` header of every request: ```bash curl https://circleback.ai/api/meetings \ -H "Authorization: Bearer cb_" ``` ### Get an API key To get started, go to **Settings → API keys** in Circleback and create an API key. Keys look like `cb_` and are shown once at creation, so store yours somewhere safe. ### Base URL ``` https://circleback.ai/api ``` The API accepts and returns JSON. ## Pagination List endpoints return one page of results at a time. Omit `cursor` from the first request. When another page is available, the response includes an RFC 8288 `Link` header with `rel="next"`: ```http Link: ; rel="next" ``` Follow that URL to request the next page. Cursors are opaque and should not be modified or reused with different filters. ## Rate limits Requests are counted per Circleback account, across all API keys and MCP or CLI OAuth tokens for the account. Limits are based on the plan the account is on. | Plan | Per second | Per minute | | ---------- | ---------- | ---------- | | Free | 3 | 20 | | Pro | 20 | 300 | | Business | 20 | 300 | | Enterprise | 20 | 300 | Every response reports whichever of the two windows you are closest to exhausting. `RateLimit-Limit` is that window's allowance, so you can tell the windows apart: `20` in the example below is the Free per-minute limit, not the per-second one. `RateLimit-Reset` is the seconds until that same window refills: ```http RateLimit-Limit: 20 RateLimit-Remaining: 14 RateLimit-Reset: 24 ``` Requests over the limit are rejected with `429 Too Many Requests` and a `Retry-After` header holding the number of seconds to wait before trying again. The JSON body is the same error envelope as other API failures, and its message names the plan whose limit you hit: ```json { "error": "Ratelimit exceeded for the Free plan.", "code": "RATE_LIMITED" } ``` ## Explore the reference Endpoints are grouped by resource in the sidebar: Meetings, Action items, Calendar, Companies, People, and Tags. Every page documents the request and response shapes and lets you try the endpoint with your API key. # Circleback Support (/docs/support) - [Account and setup](/docs/support/account-and-setup): Set up Circleback and dial in your settings - [Recording](/docs/support/recording): Record online and in-person meetings - [Meetings](/docs/support/meetings): View, edit, and share your meetings - [Automations](/docs/support/automations): Automatically perform actions after meetings and update other apps - [Assistant](/docs/support/assistant): Get answers using the context of all conversations - [Workspace and teams](/docs/support/workspace-and-teams): Set up and manage a workspace for your team - [Billing](/docs/support/billing): Manage your subscription and payments - [Security](/docs/support/security): Security and privacy information - [Platform](/docs/support/platform): Connect Circleback to your apps and AI tools with our API, MCP, and CLI # Ask Circleback Assistant (/docs/support/assistant/ask-circleback-assistant) Circleback Assistant can answer questions about anything discussed in your meetings. When you ask a question, it searches across every meeting you have access to, finds relevant information, and provides an answer with citations so you can verify the source. If you've [connected your email](/docs/support/account-and-setup/connect-your-email), it searches across your emails too, giving you one place to find information from all your conversations. ## Ask a question Go to the **Ask** page and type in your question, for example: - "What did Sarah say about the Q4 roadmap?" - "What's the latest on the Initech deal?" - "What were the action items from last week's standup?" - "What timeline did we share with Initech in January?" ## Filter your search Type **@** to mention people, companies, tags, or specific meetings. Use filters when you want to focus on a particular project, client, or type of meeting. ## Connect your tools Connectors let Assistant search and take action in tools you already use. Open **Connectors** from the **Ask** page to connect [Linear](/docs/support/assistant/connectors/ask-circleback-about-linear), [Notion](/docs/support/assistant/connectors/ask-circleback-about-notion), [Asana](/docs/support/assistant/connectors/ask-circleback-about-asana), [HubSpot](/docs/support/assistant/connectors/ask-circleback-about-hubspot), [PostHog](/docs/support/assistant/connectors/ask-circleback-about-posthog), [Attio](/docs/support/assistant/connectors/ask-circleback-about-attio), [Ashby](/docs/support/assistant/connectors/ask-circleback-about-ashby), or [Intercom](/docs/support/assistant/connectors/ask-circleback-about-intercom). ## Ask about a specific meeting When viewing a meeting, you can use Assistant in the panel on the right to ask questions about that specific meeting. This is useful when you want to quickly find something discussed in a particular call without searching across all your conversations. ## Ask how to use Circleback Assistant can also answer questions about Circleback itself. If you're unsure how to do something in the product, just ask — for example, "How do I share a meeting?" or "How do I set up automations?" ## View sources Every answer includes sources showing which conversations the information came from. Hover on a source to see specific references, select it for the full context. ## View past chats You can view and search through past chats by selecting the history icon in the top-right of the **Ask** page. You can also find past chats by opening the search modal: select the search icon in the top-left or press **/** on your keyboard. Select a chat to return to it and continue the conversation. # Assistant (/docs/support/assistant) - [Ask Circleback Assistant](/docs/support/assistant/ask-circleback-assistant): Search across all your meetings and emails and get answers with cited sources - [Use Assistant on mobile](/docs/support/assistant/use-assistant-on-mobile): Ask Circleback questions from your phone - [Use Assistant in Slack](/docs/support/assistant/use-assistant-in-slack): Mention @Circleback in any channel to ask questions about your meetings - [Connectors](/docs/support/assistant/connectors): Ask Circleback to search and take action in connected apps # Use Assistant in Slack (/docs/support/assistant/use-assistant-in-slack) You can use Circleback Assistant directly in Slack without leaving your workspace. ## Ask a question in Slack Mention @Circleback in any channel followed by your question, or send your question as a direct message to the Circleback app on Slack. Circleback will search across your conversations and reply with an answer. For follow-up questions, reply in the same thread. In channels, you'll need to mention @Circleback again. In direct messages, just reply to the thread–no mention needed. For example: - "@Circleback what did we decide about the pricing update?" - "@Circleback what was the main takeaway of this week's chat with Initech?" ### Connect Slack To use Assistant in Slack, you'll need to connect your Slack workspace. Go to Settings → Connected accounts to connect Slack. # Use Assistant on mobile (/docs/support/assistant/use-assistant-on-mobile) Circleback Assistant is available on the Circleback [mobile apps](https://circleback.ai/mobile), so you can search across your conversations from anywhere. Open the Circleback app and go to the search tab. Type your question and tap Ask. Circleback will search across all your conversations and provide an answer with cited sources. # Add custom vocabulary (/docs/support/account-and-setup/add-custom-vocabulary) You can add custom words to improve how Circleback transcribes specific terms in your meetings. This is useful for industry jargon, acronyms, or product names that might not be recognized correctly by default. You don't need to add people's names or your company name, those are included automatically. ## How to add vocabulary 1. Go to Settings → Preferences. 2. Scroll to the **Vocabulary** section. 3. Add the words or phrases you'd like. Custom vocabulary applies to future meetings only–it's used when the transcript is being generated. Workspace admins can set vocabulary as a default or enforce it for everyone from [Default and enforced workspace settings](/docs/support/workspace-and-teams/default-and-enforced-workspace-settings). # Change account email (/docs/support/account-and-setup/change-account-email) 1. Go to Settings → Account. 2. Click the pencil icon. 3. Enter the code that we sent to your **current** email address. 4. Enter the new email address you'd like to use. 5. Enter the code sent to your **new** email address. **Note:** If you have previously tried to log in with the new email then an account may already exist for it. You will need to [delete the account](/docs/support/account-and-setup/delete-your-account) associated with the new email prior to updating your current account. # Connect your calendar (/docs/support/account-and-setup/connect-your-calendar) Connecting your calendar lets Circleback match your recordings to their calendar events–so you automatically get the right meeting title, participant names, and context. This works regardless of how you record: whether Circleback joins as a participant, you use the desktop app, or you record on your phone. With a connected calendar, you can also set up [meeting joining preferences](/docs/support/account-and-setup/meeting-joining-preferences) to have Circleback automatically join and capture your online meetings. ## How to connect 1. Go to Settings → Calendar. 2. Select **Connect** on either Google Calendar or Microsoft Outlook Calendar. 3. Authenticate with your calendar provider to connect your calendar to Circleback. You can connect up to two Google Calendars and two Microsoft Outlook Calendars for a total of four connected calendars. Once connected, you can choose which meetings Circleback joins from [meeting joining preferences](/docs/support/account-and-setup/meeting-joining-preferences), or toggle joining on or off for individual meetings from Home. Circleback can only access the primary calendar on each connected account — this is the first calendar listed under the Calendars section in both Google Calendar and Outlook. If your meetings are on a shared or secondary calendar, they won't be visible to Circleback. If you're connecting a Microsoft calendar and your organization requires admin consent, your IT admin will need to [enable Circleback for your organization](/docs/support/account-and-setup/enable-circleback-for-a-microsoft-organization) first. # Connect your email (/docs/support/account-and-setup/connect-your-email) Connecting your email gives Circleback context from your email conversations alongside your meetings. This helps in three ways: - **Full conversation history**: see recent email conversations alongside previous meetings with the same people. When you're preparing for a call or reviewing a past meeting, you can catch up on the full history in one place. - **Better meeting notes**: when generating notes for a meeting, Circleback looks at recent email conversations with the meeting's invitees to provide richer context–so your notes reflect the full picture, not just what was said on the call. - **Search across everything**: when you [ask the Assistant](/docs/support/assistant/ask-circleback-assistant) a question, Circleback searches across both your meetings and emails to find the answer, showing you which sources are relevant. ## How to connect 1. Go to Settings → Connected accounts. 2. Select **Connect** on Gmail or Outlook Mail. ## Privacy Circleback accesses your emails on-demand–when generating notes for a meeting or when you ask the Assistant a question. Circleback does not store copies of your emails. You can disconnect your email at any time from Settings → Connected accounts. # Customize meeting participant (/docs/support/account-and-setup/customize-meeting-participant) When Circleback joins a meeting as a bot participant, you can customize the name and image it shows up with. ## Customize name and image 1. Go to Settings → Preferences. 2. Scroll to the **Meeting participant** section. 3. Update the **Name** and **Image** to your preference. ## Chat message When Circleback joins a meeting, it sends a brief message in the meeting chat introducing itself. The message includes whether audio and video recordings are being stored and whether participants will receive the notes via email. The chat message cannot be disabled. If you'd prefer not to have a bot join your meetings at all, you can [record with the desktop app](/docs/support/recording/desktop-app/record-meetings-with-the-desktop-app) instead. ## Multiple users in the same meeting When multiple people have Circleback set to join the same meeting, only one bot will join. Its name and chat message will reflect the names of the people or workspaces it's joining on behalf of. # Delete your account (/docs/support/account-and-setup/delete-your-account) Deleting your account will delete all associated data, including all meetings data (e.g. notes, recordings), automations, insights, billing information, and any other data associated with your account. This is immediate and irreversible, meaning your account cannot be restored once deleted. 1. Go to Settings → Account. 2. Scroll down and select **Delete account**. To delete an account that was recently created and has not yet completed onboarding, select **?** in the bottom-left corner. # Email preferences (/docs/support/account-and-setup/email-preferences) ## Meeting notes After a meeting ends, Circleback can automatically send you an email with the notes. You can configure this from Settings → Emails. When a meeting is shared with someone, they'll also receive an email with the notes and a link to open the meeting in Circleback. ## Weekly roundup Weekly roundup is a summary of all meetings from the last 7 days, sent to your inbox each week. Toggle this on from Settings → Emails. Workspace admins can set email preferences as a default or enforce them for all members from [Default and enforced workspace settings](/docs/support/workspace-and-teams/default-and-enforced-workspace-settings). # Enable Circleback for a Microsoft organization (/docs/support/account-and-setup/enable-circleback-for-a-microsoft-organization) A Microsoft admin from your organization, typically from IT, can follow these to enable Circleback for the organization: 1. Log in to Circleback at [circleback.ai](https://circleback.ai/). 2. Once they've created an account, select **Connect** next to Microsoft Outlook Calendar. 3. Tick the **Consent on behalf of your organization** box when connecting the Microsoft account. 4. Select **Accept**. Alternatively, the admin can switch the user consent settings to **Allow user consent for apps** by following [these instructions](https://learn.microsoft.com/en-us/entra/identity/enterprise-apps/configure-user-consent?pivots=portal#configure-user-consent-settings). Please keep in mind that with this approach, each user consent will need to be approved by the admin. # Export your account data (/docs/support/account-and-setup/export-your-account-data) You can download a copy of your Circleback account data, including notes, action items, insights, transcripts, and recording download links. 1. Go to **Settings → Account**. 2. Find the **Export** section. 3. Select **Export**. 4. Once your export is ready, select **Download**. We’ll also email you a download link when your export is ready. # Account and setup (/docs/support/account-and-setup) - [Connect your calendar](/docs/support/account-and-setup/connect-your-calendar): Connect your Microsoft Outlook or Google Calendar to Circleback - [Meeting joining preferences](/docs/support/account-and-setup/meeting-joining-preferences): Choose which meetings Circleback automatically joins - [Sharing preferences](/docs/support/account-and-setup/sharing-preferences): Choose default access for meeting invitees - [Email preferences](/docs/support/account-and-setup/email-preferences): Choose what you get emails for - [Connect your email](/docs/support/account-and-setup/connect-your-email): Add email context to your meetings and search across all your conversations - [Customize meeting participant](/docs/support/account-and-setup/customize-meeting-participant): Change the display name and image of the Circleback bot that joins your meetings - [Add custom vocabulary](/docs/support/account-and-setup/add-custom-vocabulary): Improve transcription accuracy for industry terms and acronyms - [Enable Circleback for a Microsoft organization](/docs/support/account-and-setup/enable-circleback-for-a-microsoft-organization): How to enable Circleback for your organization as a Microsoft admin - [Change account email](/docs/support/account-and-setup/change-account-email): Update the email address associated with your account - [Export your account data](/docs/support/account-and-setup/export-your-account-data): Request a download of your Circleback account data - [Troubleshoot missing emails](/docs/support/account-and-setup/troubleshoot-missing-emails): Restore email delivery if you're no longer receiving emails from Circleback - [Delete your account](/docs/support/account-and-setup/delete-your-account): Permanently delete your account and all associated data - [Switch to Circleback](/docs/support/account-and-setup/switch-to-circleback): Bring your meeting history with you when you switch to Circleback. # Meeting joining preferences (/docs/support/account-and-setup/meeting-joining-preferences) Once you've [connected your calendar](/docs/support/account-and-setup/connect-your-calendar), you can choose which types of meetings Circleback automatically joins. Circleback will only join meetings that have an online meeting link (Zoom, Google Meet, Microsoft Teams, or Webex). If you'd rather not have Circleback join as a participant, you can turn off all joining preferences and [record with the desktop app](/docs/support/recording/desktop-app/record-meetings-with-the-desktop-app) instead. ## Preferences for all meetings Go to Settings → Calendars. Under the Joining preferences section, you'll first choose which meeting types Circleback should join: - **Internal**: Everyone invited has the same email domain as the connected calendar. - On accounts with a personal email, this appears as **All meetings**. - **External**: Some people invited don't have the same email domain as the connected calendar. If both are off, Circleback won't automatically join any meetings. You can then further refine with additional filters: - **Organized by someone else**: Also join meetings where you're invited but not the organizer. If this is off, Circleback will only join meetings you organized. - **Declined or pending**: Also join meetings you've declined or haven't responded to yet. If this is off, Circleback will only join meetings you've accepted. For example: if you have Internal on, External off, and Organized by someone else on — Circleback will join internal meetings whether you organized them or not, but will skip any meeting with external participants. ## Preferences for a specific meeting You can override your global preferences for any individual meeting from Home. Toggle an upcoming meeting to turn joining on or off for that specific meeting. This works both ways: if your global preferences would normally skip a meeting, you can toggle it on. If they'd normally join, you can toggle it off. # Sharing preferences (/docs/support/account-and-setup/sharing-preferences) After a meeting ends, Circleback can automatically share the meeting with those invited to the calendar event. You can configure default access from **Settings → Sharing**. View, update, or remove meeting access at any time by opening the meeting and selecting **Share**. ## Invitee access - **Workspace invitees**: default meeting access given to workspace members who are invited to the meeting. - **External invitees**: default meeting access given to people outside your workspace who are invited to the meeting. Learn more about sharing and unsharing a meeting, as well as access permissions [here](/docs/support/meetings/share-a-meeting). Workspace admins can set sharing preferences as a default or enforce them for all members from [Default and enforced workspace settings](/docs/support/workspace-and-teams/default-and-enforced-workspace-settings). # Troubleshoot missing emails (/docs/support/account-and-setup/troubleshoot-missing-emails) If you’re no longer receiving emails from Circleback, first check your spam or junk folder. If you don’t find them there, log back into your account using the email method. If your email address was blocked from receiving emails after a failed delivery, logging in will automatically reactivate it so you can receive future emails. ## Restore email delivery 1. Check your spam or junk folder for emails from Circleback. If you find them there, mark them as not spam. 2. If you don’t find the emails, log in to Circleback using the email method with the email address that isn't receiving emails. If you're already logged in, log out and log back in. 3. Ask your IT team or mailbox provider to allowlist **circleback.ai** to help prevent future delivery failures. ## Why emails stopped If your mailbox provider rejects an email with a permanent delivery failure, known as a hard bounce, Circleback stops attempting to send emails to that address. This is called email suppression. Logging back in removes this suppression, but your mailbox provider may still reject future emails if the underlying issue hasn't been resolved. ## Still not receiving emails? - Check **Settings → Emails** to make sure the emails you want are enabled. See [Email preferences](/docs/support/account-and-setup/email-preferences). - If emails still aren't arriving, contact support with the email address affected and the type of email you're missing. # Automatically share meetings with your workspace (/docs/support/automations/automatically-share-meetings-with-your-workspace) Instead of sharing each meeting manually, you can set up an automation to share meetings with specific people, teams, or your entire workspace automatically. ## Set up automatic sharing 1. Select **Automations** from the left and create a new automation (or select an existing one). 2. Add conditions to control which meetings get shared. You can filter by tags, meeting name, participants, invitee emails, or invitee email domains. Combine multiple conditions with "and"/"or" logic. If you don't add any conditions, every meeting will be shared. 3. Add a **Share meeting** action. 4. Choose who to share with: specific people, a team, or the entire workspace. 5. Select **Done**, then **Save**. Once saved, the automation will run after each meeting that matches your conditions and share it with the people you selected. Shared meetings appear in the recipient's Meetings page. To share a single meeting on the spot, see [Share a meeting](/docs/support/meetings/share-a-meeting). To learn more about automations, see [Getting started with automations](/docs/support/automations/getting-started-with-automations). # Enable automations for your workspace (/docs/support/automations/enable-automations-for-your-workspace) Admins can turn on an automation for other people in the workspace so it runs on their meetings automatically — without each person having to set it up themselves. 1. Go to **Automations**. 2. Right-click the automation and select **Share**. 3. Choose who to share it with: the workspace, a team, or specific people. 4. Select "Enable this automation for people added" below the input. When you enable an automation for someone, it starts running on their future meetings that match its conditions. They'll receive an email letting them know. **Share vs. Enable:** When you share an automation without enabling it, the recipient can see it on their account and choose to run it manually on their own meetings or enable it themselves. When you enable it, it starts running on their meetings automatically. # Export meeting data with webhooks (/docs/support/automations/export-meeting-data-with-webhooks) You can use the webhook integration in automations to export your meeting data and build custom integrations. ## Setup 1. Open Automations and select **Create automation**. 2. Add automation conditions to limit which meetings the automation runs after and select **Next**. 3. Select **Send webhook request**. 4. Enter the endpoint URL you'd like to send webhook requests to and the meeting outcomes you'd like included. 5. Optionally, send a test request for the most recent meeting to verify that it's working. 6. Select Done. 7. 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. You can export your past meetings by [selecting all meetings](/docs/support/meetings/select-and-take-action-on-multiple-meetings) and choosing your new automation from the Actions menu. ## Requests Once configured, you’ll start receiving POST requests at the provided endpoint URL with a JSON body that includes the following fields: - `id` (string): Circleback meeting ID, can be used to generate a link to the meeting on Circleback (`https://circleback.ai/meetings/${id}`) - `name` (string): meeting name - `createdAt` (string): meeting creation date formatted in ISO string - `duration` (number): meeting duration in seconds - `url` (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 meeting - `icalUid` (string or null): unique identifier of the calendar event associated with the meeting - `attendees` (array of objects): meeting attendees - `name` (string or null): calendar event invitee name if associated with calendar event or name of meeting participant - `email` (string or null): calendar event invitee email if associated with calendar event - `notes` (string): Circleback meeting notes with Markdown formatting - `actionItems` (array of objects): array of action items created for meeting - `id` (number): Circleback action item ID - `title` (string): action item title - `description` (string): action item description - `assignee` (object or null): action item assignee object or null if unassigned - `name` (string or null): assignee name - `email` (string or null): assignee email - `status` (string): action item status, one of 'PENDING' or 'DONE' - `transcript` (array of objects): meeting transcript segments - `speaker` (string): speaker name - `text` (string): words spoken - `timestamp` (number): timestamp in seconds that marks the beginning of the segment - `insights` (object): - `[insightName]` (string object key): name of the user-created insight - array of objects - `insight` (string or object if insight has custom fields): the insight result - `speaker` (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": "WRweb12iCBimU6Vo8cD7z", "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": "1a2b3c@google.com", "attendees": [ { "name": "John Appleseed", "email": "john@example.com" }, { "name": "Samantha Grey", "email": "sam@example.com" } ], "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": "john@example.com" }, "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 } ], "Questions": [ { "insight": "Is this thing on?", "speaker": "Samantha Grey", "timestamp": 49.15 }, { "insight": "When will the webhook integration be ready?", "speaker": "John Appleseed", "timestamp": 120.12 } ] } } ``` ### Verifying incoming requests (optional) To ensure 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: 1. Extract the signature from the incoming request headers. The signature is in a header named `x-signature`. 2. Generate the expected signature using the signing secret and the request body. 3. 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 { createHmac, timingSafeEqual } from 'crypto' import express from 'express' // Mount this on the webhook route so req.body stays the raw bytes. // Do not use express.json() before verifying. export const rawJsonBody = express.raw({ type: 'application/json' }) export const verifyWebhookSignature = ( requestBody: Buffer, signature: string, signingSecret: string ) => { const expectedSignature = createHmac('sha256', signingSecret) .update(requestBody) .digest('hex') const expected = Buffer.from(expectedSignature) const provided = Buffer.from(signature) return ( expected.length === provided.length && timingSafeEqual(expected, provided) ) } export const webhookEndpointHandler = async ( req: express.Request, res: express.Response ) => { try { const requestBody = req.body const signature = req.headers['x-signature'] const signingSecret = 'your-signing-secret' if ( !Buffer.isBuffer(requestBody) || typeof signature !== 'string' || !verifyWebhookSignature(requestBody, signature, signingSecret) ) { return res.status(401).json({ error: 'Invalid signature.' }) } const payload = JSON.parse(requestBody.toString('utf8')) await processWebhookEvent(payload) 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.' }) } } app.post('/webhook', rawJsonBody, webhookEndpointHandler) ``` 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. # Generate insights with AI (/docs/support/automations/generate-insights-with-ai) An insight is an AI-generated output from a meeting. You define what you want–a follow-up email, a list of feature requests, customer details–and Circleback generates it from the meeting transcript each time the automation runs. Insights generally fall into two categories: extracting specific information (e.g. questions asked, candidate qualifications, customer pain points) and generating something new based on what was discussed (e.g. a follow-up email, a memo, a project proposal). ## Set up an insight 1. Go to **Automations** and create a new automation (or select an existing one). 2. Add a **Generate insights with AI** action. 3. Choose from a template or create your own. Templates are pre-built starting points–you can use them as-is or customize them. 4. If creating your own, enter a name and a description. The description tells the AI what to extract or generate–be specific about what you're looking for and include an example or template of the output you want. 5. Optionally, add custom fields to structure the output. For example, an insight called "Customer details" could have fields for Company, Budget, Timeline, and Pain points–instead of returning freeform text, the insight will fill in each field separately. 6. Select **Done** and save the automation. ## Viewing insights Once the automation runs, you can view the generated insight in the **Insights** tab of the meeting. You can also go to the **Insights** page from the left sidebar to see all generated insights across meetings. # Getting started with automations (/docs/support/automations/getting-started-with-automations) Automations automatically perform actions after your meetings–like sending notes to Slack, updating your CRM, or extracting details from a call. ## How they work Every automation has two parts: 1. **Conditions** (when to run): filter by tags, meeting name, participants, invitee emails, invitee email domains, or number of invitees. You can combine conditions with "and"/"or" logic. If you don't set any conditions, the automation runs after every meeting. 2. **Actions** (what to do): one or more things that happen after the meeting. You can chain multiple actions in a single automation. ## Available actions - [Generate insights with AI](/docs/support/automations/generate-insights-with-ai) - [Share meeting](/docs/support/automations/automatically-share-meetings-with-your-workspace) - [Send webhook request](/docs/support/automations/export-meeting-data-with-webhooks) - [Send notes to Slack](/docs/support/automations/integrations/integrate-with-slack) - [Update Notion](/docs/support/automations/integrations/integrate-with-notion) - [Create issues in Linear](/docs/support/automations/integrations/integrate-with-linear) - [Update HubSpot](/docs/support/automations/integrations/integrate-with-hubspot) - [Update Salesforce](/docs/support/automations/integrations/integrate-with-salesforce) - [Update Attio](/docs/support/automations/integrations/integrate-with-attio) - [Update Zoho contacts](/docs/support/automations/integrations/integrate-with-zoho) - [Create items in monday.com](/docs/support/automations/integrations/integrate-with-monday-com) - [Send notes to Zapier](/docs/support/automations/integrations/integrate-with-apps-using-zapier) ## Creating an automation 1. Select **Automations** from the left and click **New automation**. 2. Add conditions to limit which meetings trigger the automation, or leave it empty to run after every meeting. 3. Add one or more actions. 4. Give your automation a name and select **Create**. By default, automations run automatically. You can also disable auto-run and trigger them manually, [run them on past meetings](/docs/support/automations/run-automations-for-past-meetings), or [share and enable them for your workspace](/docs/support/automations/enable-automations-for-your-workspace). # Automations (/docs/support/automations) - [Getting started with automations](/docs/support/automations/getting-started-with-automations): How automations work, what you can do with them, and how to get started - [Automatically share meetings with your workspace](/docs/support/automations/automatically-share-meetings-with-your-workspace): How to use automations to share meetings with your workspace automatically - [Generate insights with AI](/docs/support/automations/generate-insights-with-ai): Use AI to extract information or generate outputs from your meetings - [Run automations for past meetings](/docs/support/automations/run-automations-for-past-meetings): View and manually run automations for past meetings - [Share an automation](/docs/support/automations/share-an-automation): Instructions on how to share automations with your team - [Enable automations for your workspace](/docs/support/automations/enable-automations-for-your-workspace): Turn on an automation for your whole workspace, a team, or specific members - [Export meeting data with webhooks](/docs/support/automations/export-meeting-data-with-webhooks): Use the webhook integration to export meeting data and build custom integrations - [Run automations for external meetings](/docs/support/automations/run-automations-for-external-meetings): Set automations to only run when someone from outside your team is invited - [Integrations](/docs/support/automations/integrations): Connect apps to have Circleback update them with automations # Run automations for external meetings (/docs/support/automations/run-automations-for-external-meetings) 1. Create an automation. 2. Add condition group. 3. Set email invitee domains to **are not all** and enter your company domain (e.g. initech.net). 4. Click **Next.** # Run automations for past meetings (/docs/support/automations/run-automations-for-past-meetings) Once an automation has been created and enabled, it will automatically run for future meetings that match its conditions. There are several ways to run an automation for past meetings. ## Automations relevant to a meeting You can view and manually run automations for an existing meeting by following these steps. 1. Right-click the meeting or open it and select ⋯ → Automations. 2. Run desired automations. ## Meetings relevant to an automation Additionally, you can view all past meetings relevant to an automation and run it for select meetings. 1. Right-click the automation or open it, then select ⋯ → Meetings. 2. Run the automation for desired meetings. ## Run an automation for multiple meetings You can also quickly run an automation for multiple meetings at once. 1. Select meetings from the meetings page. 2. Choose the run automation action from the menu. # Share an automation (/docs/support/automations/share-an-automation) You can share automations you create with your team or just specific teammates, here's how. 1. Open the automation. 2. Click the ⋯ menu in the top right. 3. Click Share. 4. Select a level of access for the team or specific users you'd like to share the automation with. Admins can also enable an automation for others when sharing. Alternatively, once the automation is shared, each user who it was shared with can enable it from their account to have it run for their meetings. # Add seats by invoice (/docs/support/billing/add-seats-by-invoice) If your workspace is on invoice billing, you can add multiple seats and receive an invoice for them. 1. Go to Settings → Billing. 2. Select ⋯ next to your plan and choose **Add seats by invoice**. 3. Enter the number of additional seats. The total is prorated for the remainder of your current billing period. 4. Select **Send invoice**. The seats are added to your plan right away, so you can [add members](/docs/support/workspace-and-teams/add-people-to-your-workspace) immediately.\ \ The invoice is emailed to your billing email and appears under Invoices in Settings → Billing, marked **Unpaid** until it’s paid. It’s due within 30 days. Only the billing owner can add seats by invoice, and the option is available once you’ve switched to invoice billing (see [Switch to invoice billing](/docs/support/billing/switch-to-invoice-billing)). If your payment is past due, pay the outstanding invoice first. # Cancel subscription (/docs/support/billing/cancel-subscription) 1. Go to Settings → Billing. 2. Select **View all plans**. 3. Downgrade to Free. # Consolidate workspace billing (/docs/support/billing/consolidate-workspace-billing) When you add someone to your workspace who already has their own Circleback subscription, their individual subscription is automatically canceled and refunded. Going forward, their usage is covered under the workspace's billing. This means you don't need to coordinate cancellations, just [add them to the workspace](/docs/support/workspace-and-teams/add-people-to-your-workspace) and billing is consolidated automatically. To update who manages billing, see [Transfer billing ownership](/docs/support/billing/transfer-billing-ownership). To update your plan or switch between monthly and annual billing, see [Update subscription plan](/docs/support/billing/update-plan). # Find past invoices and receipts (/docs/support/billing/find-past-invoices-and-receipts) 1. Go to Settings → Billing. 2. Select **View** next to an invoice to open it and download the invoice or receipt. 3. Select **View all invoices** to see your full history. # Billing (/docs/support/billing) - [Update plan](/docs/support/billing/update-plan): Switch between subscription plans or billing intervals - [Update payment method](/docs/support/billing/update-payment-method): Change the payment method used for billing - [Consolidate workspace billing](/docs/support/billing/consolidate-workspace-billing): How workspace billing works when you add members who already have their own subscriptions - [Find past invoices and receipts](/docs/support/billing/find-past-invoices-and-receipts): How to access invoices and receipts for your payments - [Receive email receipts](/docs/support/billing/receive-email-receipts): Update your settings to receive the invoice and receipt for each payment - [Transfer billing ownership](/docs/support/billing/transfer-billing-ownership): Make another user on your workspace the billing owner - [Referrals](/docs/support/billing/referrals): Give and get free Circleback by referring others - [Cancel subscription](/docs/support/billing/cancel-subscription): How to downgrade to the Free plan - [Switch to invoice billing](/docs/support/billing/switch-to-invoice-billing): Switch to invoice billing instead of automatic payments - [Add seats by invoice](/docs/support/billing/add-seats-by-invoice): Request an invoice for additional seats with invoice billing - [Update billing information](/docs/support/billing/update-billing-information): Change the billing email, company name, tax ID, or address shown on your invoices # Receive email receipts (/docs/support/billing/receive-email-receipts) 1. Go to Settings → Billing. 2. Under Invoices, toggle on **Email receipts**. With this setting enabled, the invoice and receipt will be sent to your account email after each payment. If you’re on invoice billing, each invoice is emailed to the billing email in your billing information instead. ## Team plan For users on a team plan, the above may be sufficient. If you'd like to send invoices and receipts to a different email address than the one associated with the account, you can do the following. 1. Go to [Settings → Team](https://circleback.ai/settings?tab=team). 2. Add the email address you'd like to receive receipts as a Viewer. This will ensure that you're not charged for that account. 3. Sign in to that account on Circleback, you'll need access to the email address to receive the login code. 4. Navigate to [Settings → Billing](https://circleback.ai/settings?tab=billing) and toggle on Email receipts. 5. Once the account is created, sign in to the original Circleback account and return to [Settings → Team](https://circleback.ai/settings?tab=team). 6. Select the ⋯ next to the user you'd like to receive billing emails and select Make billing owner. Going forward, your billing will be associated with that user and that email address will receive receipts and invoices. # Referrals (/docs/support/billing/referrals) When someone joins through your referral link or meeting notes emails, you both get a free month of Circleback. The referral tracking for meeting notes emails is done automatically and works for emails sent automatically or manually. You can get your referral link and see how many free months you've earned from Settings → Billing. You'll also receive an email each time you earn a free month through a referral. If you're part of a team, each referral earns your team a free seat for a month. # Switch to invoice billing (/docs/support/billing/switch-to-invoice-billing) Invoice billing is available on the Enterprise plan. Instead of charging your payment method automatically at each renewal, we email you an invoice to pay. 1\. Go to Settings → Billing. 2\. Under Billing information, select ⋯ next to **Payment method** and choose **Switch to invoice billing**. 3\. Check your billing information. Invoices are sent to the billing email shown here. Select **Edit** to change it. 4\. Select **Switch to invoice billing** to confirm. The change applies at the end of your current billing period. Your next renewal won't be charged to your payment method. Instead, we'll email the invoice to your billing email with a link to view and pay it online. Each invoice is due within 30 days. New invoices appear under Invoices in Settings → Billing and are marked **Unpaid** until they're paid (see [Find past invoices and receipts](/docs/support/billing/find-past-invoices-and-receipts)). If an invoice isn't paid by its due date, your workspace may be limited until it's paid. ## Switch back to automatic payments 1\. Go to Settings → Billing. 2\. Select ⋯ next to **Payment method** and choose **Switch to automatic payments**. Your next renewal will be charged to the payment method on file (see [Update payment method](/docs/support/billing/update-payment-method)). # Transfer billing ownership (/docs/support/billing/transfer-billing-ownership) An admin or the current billing owner on a workspace can transfer billing ownership to another user on the team. 1. Go to Settings → Workspace. 2. Select ⋯ next to the user you want to transfer billing ownership to and select **Transfer billing ownership**. If you'd like to add a user to the workspace just for the purposes of managing billing, you can add them as a viewer and transfer the billing ownership to them. # Update billing information (/docs/support/billing/update-billing-information) 1. Go to Settings → Billing. 2. Under Billing information, select **Edit**. 3. Update your billing email, company name, or address, then select **Update**. Changes apply to future invoices. Past invoices cannot be edited. Only the billing owner can update billing information (see [Transfer billing ownership](/docs/support/billing/transfer-billing-ownership)). # Update payment method (/docs/support/billing/update-payment-method) To add or update the payment method on your account, go to Settings → Billing, select ⋯ next to **Payment method** under Billing information, and choose **Add payment method** or **Update payment method**. We support a wide range of payment methods across different regions, including: **Cards** - Visa, Mastercard, American Express, JCB, Diners Club - Cartes Bancaires **Digital wallets** - Apple Pay - Google Pay - Cash App Pay - Amazon Pay - Link (by Stripe) **Buy now, pay later** - Klarna **Bank payments** - ACH Direct Debit (US) - Canadian pre-authorized debits - Bancontact (Belgium) - iDEAL (Netherlands) - Bank transfer **Regional methods** - Kakao Pay (South Korea) **Other** - Stablecoins Available payment methods may vary based on your region. Enterprise plans can also pay by invoice, see [Switch to invoice billing](/docs/support/billing/switch-to-invoice-billing). # Update plan (/docs/support/billing/update-plan) You can compare and switch between plans or change from monthly to annual billing from Settings → Billing. Changes are prorated–if you switch plans mid-cycle, you'll only be charged the difference. If your payment is past due, pay the outstanding amount first, then you can make changes to your plan. # Add your own notes (/docs/support/meetings/add-your-own-notes) You can add private notes to any meeting on Circleback before, during, and after the conversation. For upcoming or in-progress meetings, you can open the meeting to add notes. After the meeting is done, you'll find your notes under "Private notes" on the Notes tab, below the AI-generated notes. Your notes remain private, even when the meeting is shared, and enhance Circleback's AI-powered notes to better capture what matters most to you. For example, you can note how a client's name is spelled, or flag that a topic you only spent 30 seconds on was actually the most important part of the conversation. You can also use your notes as a scratchpad during the meeting. Jot down your thoughts, draft questions you want to ask, or outline key points you want to make sure get covered. It's a good way to stay organized and keep all the context for a meeting in one place. # Automatic meeting tagging (/docs/support/meetings/automatic-meeting-tagging) When enabled, Circleback can automatically add tags to your meetings after they finish processing. It looks at the content of the meeting and compares it against your existing tags to decide which ones are relevant. To make this decision, Circleback considers the tag's description and the content of recent meetings where each tag has been applied. It only chooses from tags you've already created–it won't create new ones. The more consistently you tag meetings, the better automatic tagging gets. Adding descriptions to your tags from Settings → Tags also helps improve accuracy. ## Configuration Enable or disable automatic meeting tagging from Settings → Tags. ## Manual override If you add a tag to a meeting yourself before it finishes processing, Circleback won't add any additional tags automatically. This lets you take control when you want to tag a meeting a specific way. # Claim meeting ownership (/docs/support/meetings/claim-meeting-ownership) When all owners of a meeting shared with your workspace are deactivated from the workspace, anyone else in the workspace with access to that meeting can claim ownership of it by navigating to the meeting's share modal and selecting "Make me owner" from the banner that appears. # Copy meeting notes or transcript (/docs/support/meetings/copy-meeting-notes-or-transcript) After a meeting has finished processing, you can copy the notes or the transcript to your clipboard if needed. 1. Open the meeting you wish to the copy notes or transcript of. 2. Select the ⋯ menu next to the meeting name to copy the meeting notes, transcript, and insights. If you find yourself copying notes to other apps, consider setting up an [automation](/docs/support/automations/getting-started-with-automations) to automatically send meeting data to other apps. You can also use the [MCP integration](/docs/support/platform/circleback-mcp) to connect Circleback to AI apps like ChatGPT or Claude. # Create a meeting clip (/docs/support/meetings/create-a-meeting-clip) A clip is a short segment of a meeting recording tied to a specific portion of the transcript. You can create clips to highlight key moments and share them with your team or externally. ## Create a clip 1. Open the meeting and go to the **Transcript** tab. 2. Highlight the portion of the transcript you'd like to clip. 3. Select **Create clip**. 4. Enter a name for the clip and select **Create**. Your clips will appear in the **Clips** tab of the meeting. ## Share a clip Right-click a clip or select **⋯** to share it. Clips can be shared with your workspace or externally using a shareable link. # Delete a meeting (/docs/support/meetings/delete-a-meeting) 1. Open the meeting. 2. Open the ⋯ menu in the top right and select **Delete**. 3. Confirm that you'd like to irreversibly delete the meeting. You can also delete a meeting by right-clicking it from the Meetings page. Deleted meetings are kept in **Recently deleted** for 30 days, then permanently deleted. You can also open Recently deleted to restore a meeting or permanently delete it right away. Once a meeting is permanently deleted, all associated data, including the notes, action items, transcript, and recording, is also permanently deleted. # Download meeting recording (/docs/support/meetings/download-meeting-recording) 1. Open the meeting you would like to download the video or audio file of. 2. Navigate to the **Transcript** tab. 3. Select **Download** below the player. Please note that the recording cannot be downloaded by external users (i.e. not a member of your team) that have link access to the meeting. # Edit meeting notes (/docs/support/meetings/edit-meeting-notes) The meeting name, notes, and action items are all editable. Simply select the text in an action item or the notes to make changes. The meeting name can be updated the same way. You can also select the assignee to reassign an action item or add an action item that came up after the meeting. To make edits before the meeting notes get sent out via email: turn off automatic invitee emails from settings, make any necessary edits, then select **Share** to email the meeting notes manually. # Import a meeting (/docs/support/meetings/import-a-meeting) You can import a meeting into Circleback by uploading an audio or video recording file. Circleback will transcribe and process the recording just like a live meeting, generating notes, action items, and insights. ## Import on web or desktop 1. Open the dropdown next to **New meeting** from the left sidebar and select **Import**. 2. Select the audio or video file you’d like to import (up to 2 GB). Most common formats are supported, including MP3, MP4, WAV, M4A, and MOV. 3. If the meeting is on your calendar, select the associated calendar event. This links the import to the event so you get the right meeting title and participant names. 4. Select **Import**. ## Import on mobile You can import recordings to Circleback on your phone from the Circleback app or from anywhere using share sheet. This is useful for recorded phone calls or recordings from other apps. ### From the Circleback app 1. Tap the new meeting button in the bottom-right corner. 2. If the meeting is on your calendar, tap the meeting name at the top and select the associated calendar event. This links the import to the event so you get the right meeting title and participant names. 3. Tap **⋯** in the top-right corner and select **Import**. 4. Select the audio or video file you’d like to import. The recording will appear in your meetings list while it uploads and gets processed. ### From any app using the share sheet You can also share a recording to Circleback from another app — like Voice Memos, Notes, your call recording app, or Files. 1. Open the recording you’d like to import and tap **Share**. 2. Select **Circleback** in the share sheet. Circleback will open and import the recording automatically. # Meetings (/docs/support/meetings) - [Share a meeting](/docs/support/meetings/share-a-meeting): Give other people access to meetings - [Tag meetings](/docs/support/meetings/tag-meetings): Organize meetings with tags and use them in automations and search - [Add your own notes](/docs/support/meetings/add-your-own-notes): Add private notes to any meeting before, during, or after the conversation - [Automatic meeting tagging](/docs/support/meetings/automatic-meeting-tagging): Have Circleback automatically tag meetings based on their content - [Download meeting recording](/docs/support/meetings/download-meeting-recording): Download the video or audio file from a meeting - [Delete a meeting](/docs/support/meetings/delete-a-meeting): How to delete all data associated with a meeting - [Meeting languages](/docs/support/meetings/meeting-languages): Supported languages and how to choose the language used for AI-powered meeting outcomes - [Edit meeting notes](/docs/support/meetings/edit-meeting-notes): Make changes to the meeting name, notes, and action items - [Import a meeting](/docs/support/meetings/import-a-meeting): Upload an audio or video recording to Circleback - [Copy meeting notes or transcript](/docs/support/meetings/copy-meeting-notes-or-transcript): How to copy notes or transcript from a Circleback meeting - [Update meeting participant names](/docs/support/meetings/update-meeting-participant-names): Edit the names of speakers in a meeting - [Share meeting moments](/docs/support/meetings/share-meeting-moments): Share a specific moment from a meeting transcript with a direct link - [Leave comments on a meeting](/docs/support/meetings/leave-comments-on-a-meeting): How to leave and reply to comments on a meeting - [Create a meeting clip](/docs/support/meetings/create-a-meeting-clip): Create and share a short segment from a meeting recording - [Select and take action on multiple meetings](/docs/support/meetings/select-and-take-action-on-multiple-meetings): Quickly select multiple meetings to perform bulk actions like sharing, managing tags, running automations, and deleting. - [Claim meeting ownership](/docs/support/meetings/claim-meeting-ownership): Claim ownership of meetings from deactivated accounts # Leave comments on a meeting (/docs/support/meetings/leave-comments-on-a-meeting) You can comment on a meeting transcript to share your thoughts, discuss a specific moment, or provide feedback. 1. Go to the meeting transcript. 2. Highlight the words you want to leave a comment on. 3. Select **Comment**. All users from your workspace with access to the meeting will receive an email notification when a new comment is added. Only people from your workspace can see comments. Existing comments will be highlighted on the transcript. Select a highlighted portion to view and reply to the comments. # Meeting languages (/docs/support/meetings/meeting-languages) Circleback automatically detects the predominantly-spoken language and transcribes the entire meeting in that language. ## Choosing the language of AI-powered meeting outcomes By default, all AI-powered meeting outcomes (e.g. notes, action items, insights) are written in the same language as the transcript. You can update this from settings. 1. Go to Settings → Preferences. 2. Select a language from the dropdown. When a language is selected in settings, all AI-powered meeting outcomes will be written in that language, regardless of the language spoken in the meeting. The meeting transcript will always be in the language that was spoken during the meeting. ## Supported languages The following languages are supported by Circleback. - Afrikaans - Albanian - Amharic - Arabic (العربية) - Armenian (Հայերեն) - Assamese (অসমীয়া) - Azerbaijani (Azərbaycanca) - Bashkir (Башҡорт) - Basque (Euskara) - Belarusian (Беларуская) - Bengali (বাঙালি) - Bosnian (Bosanski) - Breton (Brezhoneg) - Bulgarian (Български) - Burmese (မြန်မာ) - Castilian (Castellano) - Catalan (Català) - Chinese (中文) - Croatian (Hrvatski) - Czech (Čeština) - Danish (Dansk) - Dutch (Nederlands) - English - Estonian (Eesti) - Faroese (Føroyskt) - Finnish (Suomi) - Flemish (Vlaams) - French (Français) - Galician (Galego) - Georgian (ქართული) - German (Deutsch) - Greek (Ελληνικά) - Gujarati (ગુજરાતી) - Haitian - Haitian Creole (Kreyòl Ayisyen) - Hausa (هَوُسَ) - Hawaiian (ʻŌlelo Hawaiʻi) - Hebrew (עִבְרִית) - Hindi (हिन्दी) - Hungarian (Magyar) - Icelandic (Íslenska) - Indonesian (Bahasa Indonesia) - Italian (Italiano) - Japanese (日本語) - Javanese (Jawa) - Kannada (ಕನ್ನಡ) - Kazakh (Қазақ тілі) - Khmer (ភាសាខ្មែរ) - Korean (한국어) - Lao (ລາວ) - Latin (Latina) - Latvian (Latviešu) - Letzeburgesch (Lëtzebuergesch) - Lingala (Lingála) - Lithuanian (Lietuvių) - Luxembourgish (Lëtzebuergesch) - Macedonian (Македонски) - Malagasy (Malagasy) - Malay (Bahasa Melayu) - Malayalam (മലയാളം) - Maltese (Malti) - Maori (Māori) - Marathi (मराठी) - Moldavian - Moldovan - Mongolian (Монгол) - Myanmar (မြန်မာ) - Nepali (नेपाली) - Norwegian (Norsk) - Nynorsk (Nynorsk) - Occitan (Occitan) - Panjabi (ਪੰਜਾਬੀ) - Pashto (پښتو) - Persian (فارسی) - Polish (Polski) - Portuguese (Português) - Punjabi (ਪੰਜਾਬੀ) - Pushto (پښتو) - Romanian (Română) - Russian (Русский) - Sanskrit (संस्कृतम्) - Serbian (Српски) - Shona (Shona) - Sindhi (سنڌي) - Sinhala (සිංහල) - Sinhalese (සිංහල) - Slovak (Slovenčina) - Slovenian (Slovenščina) - Somali (Soomaali) - Spanish (Español) - Sundanese (Basa Sunda) - Swahili (Kiswahili) - Swedish (Svenska) - Tagalog (Filipino) - Tajik (Тоҷикӣ) - Tamil (தமிழ்) - Tatar (Татарча) - Telugu (తెలుగు) - Thai (ไทย) - Tibetan (བོད་ཡིག) - Turkish (Türkçe) - Turkmen (Türkmen) - Ukrainian (Українська) - Urdu (اردو) - Uzbek (Oʻzbek) - Valencian (Valencià) - Vietnamese (Tiếng Việt) - Welsh (Cymraeg) - Yiddish (ייִדיש) - Yoruba (Yorùbá) # Select and take action on multiple meetings (/docs/support/meetings/select-and-take-action-on-multiple-meetings) ## How to select meetings On the [meetings page](https://circleback.ai/meetings), you can select meetings to perform bulk actions like sharing, managing tags, running automations, and deleting. ### One at a time Hover over any meeting and click the checkbox that appears on the left. ### Select all Press **⌘/Ctrl A** to select every meeting that matches your current filters, including ones that haven't loaded on the page yet. ### Select a range 1. Select one meeting. 2. Hold **Shift** and click another meeting. 3. All meetings in-between will be selected. ### Clear your selection Press **Esc** or click the **×** in the action bar at the bottom. ## Actions When meetings are selected, an action bar appears at the bottom which you can use to take action on the selected meetings or delete them directly. - **Actions (⌘/Ctrl K)** – Add or remove tags, share or remove access, run automation, delete, and more - **Delete (⌘/Ctrl Backspace)** – Delete selected meetings ### Notes - You can only select meetings that are fully processed (not recording or processing) # Share a meeting (/docs/support/meetings/share-a-meeting) To share a meeting, you can either right-click it from the Meetings page or open it and select **Share** in the top-right. ## Share a meeting with specific people Share a meeting with your workspace, teams, or anyone else by entering their name or email, selecting their access in the dropdown, and selecting **Share**. ### Access permissions - **Limited viewer** - View meeting notes and action items - Mark their own action item as done - **Viewer** - View meeting notes, action items, transcript, and recording (if available) - Mark their own action item as done - **Editor** - View and edit meeting notes and action items, transcript, and recording (if available) You can configure defaults for how meetings are shared with invitees from **Settings → Sharing** and [use automations](/docs/support/automations/automatically-share-meetings-with-your-workspace) to automatically share meetings with people in your workspace, even when they're not invited to the meeting. ## Share a link to a meeting You can choose if your meeting should be available to anyone with the link or restricted to only the people with access. ### Access permissions - **Limited viewer** - View meeting notes and action items without needing to log in - Mark their own action item as done - **Viewer** - View meeting notes, action items, transcript, and recording (if available) without needing to log in - Mark their own action item as done - **Editor** - View and edit meeting notes and action items, transcript, and recording (if available) - To make any edits, the person will need to log in to Circleback ## Unshare a meeting You can update someone's access to a meeting by selecting the dropdown next to their name. To remove access, select **None**. You can update link access the same way by selecting the dropdown at the bottom of the share modal, next to the **Copy link** button. # Share meeting moments (/docs/support/meetings/share-meeting-moments) A moment link takes someone directly to a specific point in a meeting. They'll see the transcript and recording from that point, so they can read and listen to exactly what was said. The recipient needs access to the meeting to view a moment. If you haven't already shared the meeting, [share it](/docs/support/meetings/share-a-meeting) first. ## Share a moment 1. Open the meeting and go to the **Transcript** tab. 2. Highlight the portion of the transcript you'd like to share. 3. Select **Share moment**. A link will be copied to your clipboard. Anyone with access to the meeting can open the link and they'll be taken to that moment in the transcript with the recording. # Tag meetings (/docs/support/meetings/tag-meetings) Tags let you organize your meetings by project, client, meeting type, or anything else. Once tagged, you can filter meetings by tag, use tags as conditions in [automations](/docs/support/automations/getting-started-with-automations), and mention tags with @ when [asking the Assistant](/docs/support/assistant/ask-circleback-assistant) a question. You can also have tags applied automatically–see [Automatic meeting tagging](/docs/support/meetings/automatic-meeting-tagging). ## Tag a meeting There are a few ways to add or remove tags: - **From Home**: right-click an upcoming meeting. - **From the Meetings page**: right-click any meeting. - **From inside a meeting**: select **+ Add tag** at the top, or hover over an existing tag to remove it. ## Manage tags Go to Settings → Tags to create new tags, update a tag's name, description, and color, or delete tags. Adding a description to a tag also improves [automatic meeting tagging](/docs/support/meetings/automatic-meeting-tagging) accuracy. # Update meeting participant names (/docs/support/meetings/update-meeting-participant-names) You can edit the names of participants in a meeting from the transcript tab. 1. Open the meeting transcript tab. 2. Select a participant name. 3. Type or select a new name from the dropdown. The update will be reflected throughout the meeting, including in the transcript, notes, action items, and insights. Additionally, for meetings associated with a calendar event, the participant voice will be saved and automatically recognized in future meetings they're invited to. # Circleback API (/docs/support/platform/circleback-api) The Circleback API lets you access everything Circleback captures from your meetings: notes, action items, transcripts, recordings, people, companies, and more. Give your own AI agents context from your team's conversations: what was discussed with a customer, which action items are still open, what was decided on this morning's call. Or build internal tools, scripts, and dashboards on top of your meeting data. Create an API key from Settings → API keys, then explore the [API docs](/docs/api) and try every endpoint with your key. # Circleback CLI (/docs/support/platform/circleback-cli) Access everything from the command line, or give your AI agents the conversation context they need to get things done. Have OpenClaw follow up on action items from this morning's standup. Let Claude Code draft a spec based on your last product review. ## Setup Get started by installing the [Circleback CLI](https://www.npmjs.com/package/@circleback/cli): ``` npm install -g @circleback/cli ``` Then log in to your Circleback account: ``` cb auth login ``` This opens a browser window to log in. Once logged in, you are ready to go. To log in with an API key instead: ``` cb auth login --api-key ``` API-key login links to **[Settings → API keys](https://circleback.ai/settings?tab=api-access)**, verifies the key, and stores it locally on your device. For stateless automation, set `CIRCLEBACK_API_KEY` instead of logging in: ``` CIRCLEBACK_API_KEY=cb_your_api_key cb meetings --json ``` `CIRCLEBACK_API_KEY` takes precedence over stored credentials. To sign out on this device: ``` cb auth logout ``` ## What you can do The Circleback CLI has commands for searching and accessing data from your Circleback account like meetings, transcripts, calendar events, emails, people, companies, and more. | Command | Description | | ------------------------------ | -------------------------------------------------------------------------------------------- | | `cb auth login` | Log in to Circleback with your browser | | `cb auth login --api-key` | Log in with an API key | | `cb auth logout` | Sign out on this device | | `cb update` | Update CLI to the latest version | | `cb transcripts read ` | Get the full transcript for one or more meetings, with speaker labels and timestamps | | `cb action-items [search]` | Find action items by keyword, status (pending or done), assignee, tag, or date range | | `cb calendar` | Search upcoming and past calendar events, including attendees and meeting links | | `cb emails [search]` | Search connected email accounts for threads by keyword, sender, recipient, or date range | | `cb people ` | Look up people by name to see their profile and interaction history across meetings | | `cb companies ` | Look up companies by name or domain to find their domain and related meetings | | `cb tags` | List all tags in your workspace, useful for filtering meetings, transcripts, or action items | | `cb support [search]` | Search Circleback support documentation for help and how-to guides | ## Examples ### Meetings Find meetings about a specific topic: ``` cb meetings search "product review" ``` Find meetings from the last 7 days: ``` cb meetings search --last 7 ``` Find meetings in a date range: ``` cb meetings search --from 2026-04-01 --to 2026-04-18 ``` Read the full details of a meeting: ``` cb meetings read Vd6Pz8WqLm3xY2cRhTn7K ``` Read multiple meetings at once: ``` cb meetings read Vd6Pz8WqLm3xY2cRhTn7K 12345 ``` ### Transcripts Search transcripts for something someone said: ``` cb transcripts search "pricing change" ``` Get the full transcript of a meeting: ``` cb transcripts read Vd6Pz8WqLm3xY2cRhTn7K ``` Get transcripts for multiple meetings: ``` cb transcripts read Vd6Pz8WqLm3xY2cRhTn7K 12345 ``` ### Action items Find your incomplete action items: ``` cb action-items search --status pending ``` Search action items by keyword: ``` cb action-items search "follow up" ``` Find completed action items: ``` cb action-items search --status done ``` ### Calendar See calendar events in a date range: ``` cb calendar search --from 2026-04-18 --to 2026-04-25 ``` ### Emails Search emails by keyword: ``` cb emails search "quarterly report" ``` Search emails by participant: ``` cb emails search "participant:sarah@company.com" ``` Search emails from a specific sender: ``` cb emails search "from:ceo@company.com" ``` Search emails in a date range: ``` cb emails search "project update after:2026-01-01 before:2026-04-01" ``` ### People Look up a person: ``` cb people search "Sarah Kerrigan" ``` ### Companies Look up a company: ``` cb companies search "Acme" ``` ### Tags List all tags: ``` cb tags list ``` ### Support Search Circleback support articles: ``` cb support search "recording in-person meetings" ``` ## Options All commands support `--json` for raw JSON output, which is useful for scripting, piping into other tools, or feeding data to AI agents. ``` cb meetings search "standup" --last 7 --json ``` # Circleback MCP (/docs/support/platform/circleback-mcp) Circleback's Model Context Protocol (MCP) server provides a standardized interface that allows any compatible AI app like Claude and ChatGPT to access your Circleback data in a simple and secure way. Once connected, your AI assistant can search and access your meetings, emails, calendar events, and more all without leaving your AI app. This eliminates the need to copy and paste between Circleback and other AI apps. The MCP server follows the authenticated remote [MCP spec](https://modelcontextprotocol.io/specification/2025-03-26), so the server is centrally hosted and managed. ## Setup ### General The Circleback MCP server supports Streamable HTTP transports. It uses OAuth with dynamic client registration for authentication at [`https://circleback.ai/api/mcp`](https://circleback.ai/api/mcp). ### Claude⁠ 1. Go to **Settings** from the sidebar on web or desktop 2. Select **Connectors** in the settings sidebar and click **Browse connectors** 3. Search for Circleback and click **+** to connect ### ChatGPT Connect the Circleback ChatGPT app [here](https://chatgpt.com/apps/circleback/asdk_app_695308f21c648191a0dd48dc9965f4bb). Once connected, ChatGPT will automatically reference Circleback when relevant, like when you ask about meetings or conversations. You can also explicitly add Circleback in your message to make sure it's used. ### Raycast Click [here](raycast://mcp/install?%7B%22name%22%3A%22Circleback%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A//circleback.ai/api/mcp%22%7D) to install the Circleback MCP server in Raycast. In root search, AI Commands, or AI Chat, type @circleback to mention and use the tools provided by Circleback MCP. ### Claude Code 1. Open your terminal and run the following command ``` claude mcp add --transport http circleback https://circleback.ai/api/mcp ``` 2. Run `/mcp` once you've opened a Claude Code session to go through the authentication flow ### Cursor Click [here](https://cursor.com/marketplace/cursor/circleback) to add the Circleback plugin from the Cursor Marketplace. ### Codex The setup steps are the same regardless of whether you use the IDE Extension or the CLI since the configuration is shared. #### Configuration via CLI 1. Run the following command in Terminal ``` codex mcp add circleback --url https://circleback.ai/api/mcp ``` This will automatically prompt you to log in with your Circleback account and connect it to Codex.\ \ **Note**: If this is the first time you are using an MCP in Codex you will need to enable the `rmcp` feature for this to work. Add the following to your `~/.codex/config.toml` ``` [features] experimental_use_rmcp_client = true ``` #### Configuration through environment variables 1. Open the `~/.codex/config.toml` file in your preferred editor and add the following ``` [features] experimental_use_rmcp_client = true [mcp_servers.circleback] url = "https://circleback.ai/api/mcp" ``` 2. Run `codex mcp login circleback` to go through the authentication flow ## What you can do The Circleback MCP server has tools available for searching and accessing data from your Circleback account like meetings, transcripts, calendar events, emails, people, companies, and more powered by the tools below. - **SearchMeetings**: Find meetings by keyword, date range, tags, attendee, or domain. - **ReadMeetings**: Get detailed information for specific meetings, including notes, attendees, action items, insights, tags, and duration. - **SearchTranscripts**: Search across all meeting transcripts to find where something was mentioned. Returns matching results with timestamps. - **GetTranscriptsForMeetings**: Get the full transcript for one or more meetings, with speaker labels and timestamps. - **SearchActionItems**: Find action items by keyword, status (pending or done), assignee, tag, or date range. - **SearchCalendarEvents**: Search upcoming and past calendar events, including attendees, meeting links, and join status. - **SearchEmails**: Search connected email accounts for threads by keyword, sender, recipient, or date range. - **FindProfiles**: Look up people by name to see their profile and interaction history across meetings. - **FindCompanies**: Look up companies by name or domain to find their domain and related meetings. - **ListTags**: List all tags in your workspace, useful for filtering meetings, transcripts, or action items. - **SearchSupportArticles**: Search Circleback support documentation for help and how-to guides. # Platform (/docs/support/platform) - [Circleback API](/docs/support/platform/circleback-api): Everything Circleback captures from your meetings, one request away - [Circleback MCP](/docs/support/platform/circleback-mcp): Connect other AI apps like ChatGPT, Claude, Cursor, and more to Circleback - [Circleback CLI](/docs/support/platform/circleback-cli): Access Circleback data from the command line and give AI agents conversation context # Configure whether meeting recordings are saved (/docs/support/recording/configure-whether-meeting-recordings-are-saved) By default, Circleback saves the audio and video recordings from your meetings. You can turn this off if you'd prefer that no recordings are stored. 1. Go to Settings → Preferences. 2. Toggle off **Save meeting audio and video recordings**. With this turned off, Circleback will still generate notes, action items, transcripts, and insights. The audio and video are just not stored afterward–so you'll get all your meeting outcomes as usual, but there won't be a recording to play back or download. When Circleback joins a meeting with recordings disabled, it sends a message in the meeting chat letting participants know that no audio or video is being stored. Workspace admins can set this as a default or enforce it for all members from [Default and enforced workspace settings](/docs/support/workspace-and-teams/default-and-enforced-workspace-settings). # Getting started with recording (/docs/support/recording/getting-started-with-recording) Circleback gives you several ways to capture meetings. Which one you use depends on the type of meeting and whether you want Circleback to join as a participant. Whichever method you choose, we recommend [connecting your calendar](/docs/support/account-and-setup/connect-your-calendar) so that your recordings are automatically matched to their calendar events with the right title and participant names. ## Circleback joins as a participant Circleback can join your online meetings as a bot participant that captures the conversation. This works with Zoom, Google Meet, Microsoft Teams, and Webex. - **Calendar auto-join**: [Connect your calendar](/docs/support/account-and-setup/connect-your-calendar) and set your [joining preferences](/docs/support/account-and-setup/meeting-joining-preferences) to have Circleback automatically join the meetings you choose. Best for capturing online meetings without downloading anything. - **Meeting link**: [Manually invite Circleback](/docs/support/recording/bot/how-to-get-circleback-to-join-a-meeting) by pasting a link to a live meeting. Best for last-minute or impromptu meetings not on your calendar. ## Record without a bot participant If you'd prefer not to have Circleback appear in the meeting, you can record locally. - **Desktop app**: [Record with the desktop app](/docs/support/recording/desktop-app/record-meetings-with-the-desktop-app) (macOS and Windows) to capture your microphone and computer audio. The app can automatically detect when you're in a meeting and prompt you to record. Best for online meetings where you don't want a bot joining. - **Mobile app**: [Record with the mobile app](/docs/support/recording/mobile-app/record-meetings-with-the-mobile-app) (iOS and Android) to capture meetings using your phone's microphone. Best for in-person meetings, conferences, and coffee chats. ## Import a recording Already have a recording? [Import it](/docs/support/meetings/import-a-meeting) by uploading an audio or video file to Circleback. # Recording (/docs/support/recording) - [Getting started with recording](/docs/support/recording/getting-started-with-recording): Different ways to capture meetings with Circleback - [Configure whether meeting recordings are saved](/docs/support/recording/configure-whether-meeting-recordings-are-saved): Choose whether audio and video from your meetings are stored - [Desktop app](/docs/support/recording/desktop-app): Record meetings with the desktop app on macOS and Windows - [Bot](/docs/support/recording/bot): Record meetings by having Circleback join online meetings - [Mobile app](/docs/support/recording/mobile-app): Record in-person meetings with the mobile app on iOS and Android # Enable HIPAA compliance (/docs/support/security/enable-hipaa-compliance) Workspaces on the Enterprise plan can enter into a Business Associate Agreement (BAA) to support HIPAA-compliant use of Circleback. Circleback supports HIPAA as a business associate for PHI in a workspace where the BAA is enabled. Compliance is a shared responsibility. You are responsible for enabling the BAA, configuring retention and access, and making sure your use of Circleback meets HIPAA requirements. ## Enable HIPAA compliance Admins that are authorized to enter into a BAA with Circleback on behalf of their company can enable HIPAA compliance for the workspace. 1. Go to Settings → General (under Workspace). 2. Under HIPAA compliance, turn on Business Associate Agreement. 3. Review and accept the BAA. Circleback's BAA is available at [circleback.ai/baa](https://circleback.ai/baa). ## Frequently asked questions ### How does my organization enter into a BAA with Circleback? The BAA is included with Enterprise. A workspace admin turns on Business Associate Agreement in Settings → General (under Workspace). That puts the BAA in effect for that workspace. ### Does having a BAA mean my organization is HIPAA compliant? No. The BAA helps support your HIPAA compliance, but using Circleback does not automatically make you compliant. Your organization is responsible for its own compliance program and for using Circleback in a way that meets HIPAA. ### We provide software to healthcare customers. Do they need a BAA with Circleback? No. You enter the BAA with Circleback for your workspace. Your customers typically enter a BAA with you. They do not need a separate BAA with Circleback unless they also use Circleback themselves. ### What happens if there is a security incident involving PHI? Circleback will report incidents and breaches as described in the BAA. ### Can we change the BAA? No. Enterprise includes Circleback's standard BAA. Custom BAAs are not offered. ### Can we use Circleback for 42 CFR Part 2 records? No. Do not use Circleback to create, receive, maintain, or transmit substance use disorder records subject to 42 CFR Part 2. ### What if we turn the setting off or leave Enterprise? Stop submitting new PHI. The BAA applies only while the workspace is on Enterprise and Business Associate Agreement is on. # Security (/docs/support/security) - [Security](/docs/support/security/security): Details about Circleback's security, data privacy, and compliance - [Enable HIPAA compliance](/docs/support/security/enable-hipaa-compliance): Enter into a Business Associate Agreement (BAA) to use Circleback for Protected Health Information (PHI) - [Single sign-on](/docs/support/security/single-sign-on): Configure SSO for your workspace # Security (/docs/support/security/security) Circleback is SOC 2 Type II and EU-U.S. Data Privacy Framework-certified and uses industry-leading practices to handle customer data, including encrypting data at rest and in transit. We do not use customer data to train models. Our security portal at [security.circleback.ai](https://security.circleback.ai/) has more information, including a report of an external pentest done on our infrastructure. Circleback is HIPAA-compliant. HIPAA is included with Enterprise. See [Enable HIPAA compliance](/docs/support/security/enable-hipaa-compliance). ## GDPR Circleback supports customers’ obligations under the GDPR (EU) 2016/679. When we process personal data on your behalf, we do so as a processor under our [Data Processing Agreement (DPA)](https://circleback.ai/dpa), and as described in our [Privacy Policy](https://circleback.ai/privacy). Transfers of personal data from the EEA or the United Kingdom to Circleback in the United States can rely on Circleback’s EU-U.S. Data Privacy Framework certification, including the UK Extension to the EU-U.S. DPF for UK transfers. For unresolved complaints about personal data received under the UK Extension, Circleback cooperates with the UK Information Commissioner’s Office (ICO). Workspace admins can also control how long meeting data is kept. See [Data retention settings](/docs/support/workspace-and-teams/data-retention-settings). For questions about your Circleback account data, email [support@circleback.ai](mailto:support@circleback.ai). If you are a meeting participant and want to exercise privacy rights over meeting data, contact the Circleback customer who organized the meeting; we will assist that customer as required under our DPA. ## Agreements You can review Circleback’s security portal and legal agreements here: - [Security portal](https://security.circleback.ai/) - [Privacy Policy](https://circleback.ai/privacy) - [Terms of Service](https://circleback.ai/terms) - [Data Processing Agreement (DPA)](https://circleback.ai/dpa) - [Business Associate Agreement (BAA)](https://circleback.ai/baa) # Add multiple domains to your workspace (/docs/support/workspace-and-teams/add-multiple-domains-to-your-workspace) If your company uses several email domains, you can add all of them, so anyone with an email from any of those domains can join your workspace, or be added automatically when they sign up. 1. Go to [Settings → General](https://circleback.ai/settings?tab=workspace). 2. Click **+** next to domains. 3. Enter the domain name you want to add and an email with that domain. 4. Enter the code sent to that email. Once a domain is added to your workspace, people with emails from that domain can be added to your workspace. # Add people to your workspace (/docs/support/workspace-and-teams/add-people-to-your-workspace) ## Add a member 1. Go to Settings → Members (under Workspace). 2. Enter an email address and select a role: - **Admin**: can manage workspace settings, members, and automations. - **Member**: can use Circleback for their own meetings and access what's shared with them. - **Viewer**: can access what's been shared with them but cannot use Circleback for their own meetings. Viewers are free to add and don't count toward your subscription. You can [update someone's role](/docs/support/workspace-and-teams/update-workspace-roles) or [transfer billing ownership](/docs/support/billing/transfer-billing-ownership) at any time. ## Automatically add new users You can automatically add anyone who signs up for Circleback with an email matching your workspace's domain. 1. Go to Settings → General (under Workspace). 2. Enable **Automatically add new users to workspace**. New users will be added as members by default. Admins are notified via email each time someone is automatically added. ## Organize with teams Once you have people in your workspace, you can organize them into teams (e.g. Engineering, Sales, Design) to make it easier to share meetings and enable automations for specific groups. See [Teams](/docs/support/workspace-and-teams/teams) to learn more. # Create a workspace (/docs/support/workspace-and-teams/create-a-workspace) A workspace lets your team share meetings and meeting data, enable automations across the team, and configure settings for everyone in one place. With a workspace you can [share meetings](/docs/support/meetings/share-a-meeting) with team members, [enable automations](/docs/support/automations/enable-automations-for-your-workspace) for the whole team, [set default or enforced settings](/docs/support/workspace-and-teams/default-and-enforced-workspace-settings) across the workspace, and more. ## Create a workspace 1. Go to Settings → General (under Workspace). 2. Select **Create workspace**. 3. Add members by entering their email address and selecting a role: - **Admin**: can manage workspace settings, members, and automations. - **Member**: can use Circleback for their own meetings and access what's shared with them. - **Viewer**: can access what's been shared with them but cannot use Circleback for their own meetings. Viewers are free. The person who creates the workspace is the admin and billing owner by default. You can [make others admin](/docs/support/workspace-and-teams/update-workspace-roles) or [transfer billing ownership](/docs/support/billing/transfer-billing-ownership) at any time. The billing owner is the only person who can manage payment settings. There's no limit on how many people you can add to a workspace. You can also automatically add new users who sign up with an email matching your workspace's domain. # Data retention settings (/docs/support/workspace-and-teams/data-retention-settings) Workspace admins can control how long meeting data is stored on Circleback. Go to Settings → General (under Workspace) and scroll to the **Data retention** section. There are three categories, each with an adjustable slider: - **Recording**: audio or video recordings of meetings. - **Transcript**: meeting transcripts. - **All meeting data**: notes, action items, insights, and all other data associated with meetings. When a retention period expires, that data is permanently deleted and cannot be recovered. These settings apply to all meetings across the workspace. # Deactivate a workspace member (/docs/support/workspace-and-teams/deactivate-a-workspace-member) 1. Go to Settings → Workspace. 2. Select ⋯ next to the member to deactivate them. Once a member has been deactivated, they are effectively removed from the workspace and will no longer have access to anything that's been shared. Their shared meetings will remain accessible to other members. Once deactivated, the user will also be automatically logged out of Circleback on all devices. Deactivated members do not occupy a paid seat and the subscription is automatically updated at the end of the current billing cycle to reflect the change. # Default and enforced workspace settings (/docs/support/workspace-and-teams/default-and-enforced-workspace-settings) Admins can configure default and enforced settings for the team from Settings → General (under Workspace). Default settings will apply for new and existing members if they have not yet configured the setting. Selecting the lock next to a setting will enforce it for all members of the workspace. The following settings can be configured for the workspace: - Save meeting audio and video recordings - Automatic meeting tagging - Vocabulary - Meeting joining preferences - Sharing defaults - Email sending preferences - Meeting participant name and image - Data retention # Workspace and teams (/docs/support/workspace-and-teams) - [Add people to your workspace](/docs/support/workspace-and-teams/add-people-to-your-workspace): Add manually or have people from your company get added automatically - [Teams](/docs/support/workspace-and-teams/teams): Organize your workspace into teams to share meetings and automations with the right people - [Deactivate a workspace member](/docs/support/workspace-and-teams/deactivate-a-workspace-member): Deactivate a workspace to revoke access to the workspace - [Update workspace roles](/docs/support/workspace-and-teams/update-workspace-roles): Make others an admin, member, or viewer, transfer billing ownership, or deactivate a member - [Default and enforced workspace settings](/docs/support/workspace-and-teams/default-and-enforced-workspace-settings): Configure default and enforced settings for your workspace - [Data retention settings](/docs/support/workspace-and-teams/data-retention-settings): Control how long meeting recordings, transcripts, and other data are kept - [Usage dashboard](/docs/support/workspace-and-teams/usage-dashboard): View usage metrics for your workspace, teams, and specific people - [Update workspace details](/docs/support/workspace-and-teams/update-workspace-details): Instructions to update the name and image of an existing workspace - [Add multiple domains to your workspace](/docs/support/workspace-and-teams/add-multiple-domains-to-your-workspace): Add multiple domains to your workspace to invite people with different email domains - [Create a workspace](/docs/support/workspace-and-teams/create-a-workspace): Set up a workspace to share meetings and automations with your team # Teams (/docs/support/workspace-and-teams/teams) Teams let you organize workspace members into groups like Engineering, Sales, or Design. Once you have teams set up, you can [share meetings](/docs/support/meetings/share-a-meeting) and [enable automations](/docs/support/automations/enable-automations-for-your-workspace) for a specific team instead of the entire workspace or individual people. ## Create a team 1. Go to Settings → Teams (under Workspace). 2. Select **Create team**. 3. Enter a name for the team. ## Add members to a team 1. Go to Settings → Teams and select the team. 2. Select **Add members**. 3. Search for and select workspace members to add. A workspace member can be on multiple teams. Adding or removing someone from a team doesn't affect their workspace membership or role. ## Delete a team 1. Go to Settings → Teams and select the team. 2. Select **Delete** at the bottom. Deleting a team removes the group–members will remain in the workspace. # Update workspace details (/docs/support/workspace-and-teams/update-workspace-details) Admins can update workspace details like name, image, and more. 1. Navigate to Settings → General (under Workspace). 2. Update the name or image of your workspace. # Update workspace roles (/docs/support/workspace-and-teams/update-workspace-roles) 1. Go to [Settings → Workspace](https://circleback.ai/settings?tab=workspace). 2. Select ⋯ next to a user and choose an action. Admins can take the following actions on other users: - Make admin, member, or viewer - Transfer billing ownership - Deactivate or reactivate The current billing owner can also transfer billing ownership to another user that's active on the workspace. # Usage dashboard (/docs/support/workspace-and-teams/usage-dashboard) You can see how you and your team spend time in meetings with the usage dashboard. View metrics like the number of meetings, total time spent in meetings, unique people met with, and automations run over different time periods. The usage dashboard also shows a breakdown of internal and external meetings and a leaderboard to see how meeting activity compares across your workspace and teams. Workspace admins can view metrics for the entire workspace, specific teams, and individual team members. Everyone else can see their own personal metrics. Go to Settings → Usage to open the usage dashboard. # Ask Circleback about Asana (/docs/support/assistant/connectors/ask-circleback-about-asana) Connect Asana to Circleback Assistant to find work and update tasks or projects without leaving Circleback. Assistant can only access information available to the Asana account you connect. ## Connect Asana 1. Go to the **Ask** page in Circleback. 2. Select the plug icon next to the message box to open **Connectors**. 3. Find **Asana** and select **Connect**. 4. Sign in to Asana and approve the requested access. ## What Circleback can do - **Search**: Search across Asana objects and tasks. - **Tasks**: Read individual or multiple tasks, list your assigned tasks, create tasks, and update tasks. - **Projects**: List and read projects, create projects, and read project status overviews. - **Project status updates**: Create status updates for projects. - **Comments**: Add comments to tasks. - **People and teams**: Read your Asana profile and look up users and teams. ## Example requests - “Show my incomplete Asana tasks due this week.” - “Create tasks for the action items from this meeting in the launch project.” - “Post a project status update summarizing this week’s progress and blockers.” ## Disconnect Asana Open **Connectors** from the Ask page, find Asana, and select **Disconnect**. You can also disconnect it from **Settings → Connected accounts**. # Ask Circleback about Ashby (/docs/support/assistant/connectors/ask-circleback-about-ashby) Connect Ashby to Circleback Assistant to research candidates and keep recruiting work up to date without leaving Circleback. Assistant can only access information available to the Ashby account you connect. ## Connect Ashby 1. Go to the **Ask** page in Circleback. 2. Select the plug icon next to the message box to open **Connectors**. 3. Find **Ashby** and select **Connect**. 4. Sign in to Ashby and approve the requested access. ## What Circleback can do - **Search and inspect recruiting data**: Search records by name, filter records, inspect available object fields, and read record details. - **Candidates**: Read candidate details and create candidates. - **Candidate notes**: Add notes to candidate profiles. - **Applications**: Move an application to another stage and consider a candidate for a job. - **Interviews**: List upcoming interviews, read interview details and interview plans, and read submitted feedback. - **Jobs and work queues**: Read job pipelines and list pending tasks. - **Ashby help**: Search Ashby product documentation. ## Example requests - “Show the upcoming interviews for this week and who is interviewing each candidate.” - “Add our debrief notes to the candidate and move the application to the next stage.” - “Summarize submitted feedback for this candidate and identify missing scorecards.” ## Disconnect Ashby Open **Connectors** from the Ask page, find Ashby, and select **Disconnect**. You can also disconnect it from **Settings → Connected accounts**. # Ask Circleback about Attio (/docs/support/assistant/connectors/ask-circleback-about-attio) Connect Attio to Circleback Assistant to research relationships and keep your CRM up to date without leaving Circleback. Assistant can only access information available to the Attio account you connect. ## Connect Attio 1. Go to the **Ask** page in Circleback. 2. Select the plug icon next to the message box to open **Connectors**. 3. Find **Attio** and select **Connect**. 4. Sign in to Attio and approve the requested access. ## What Circleback can do - **Records**: Search, list, and read records; create, upsert, and update records. - **Attributes and lists**: Read object and list attribute definitions, list available lists and their entries, add records to lists, and update list entries by entry or record ID. - **Comments**: List comments and replies, and create comments. - **Notes**: Create notes; search notes by metadata or meaning; read note bodies; and update notes. - **Tasks**: List, create, and update tasks. - **Meetings and calls**: Search meetings and call recordings, including metadata and semantic search, and read call-recording details. - **Emails**: Search emails by metadata or meaning and read email content. - **Workspace information**: List workspace members and teams and read the connected user. - **Reporting**: Run basic reports and query Attio data with Particle SQL. ## Example requests - “Find everything we know about Acme and summarize the latest interactions.” - “Add this meeting’s next steps to the company record and create follow-up tasks.” - “Run a report of open opportunities in Attio by owner.” ## Disconnect Attio Open **Connectors** from the Ask page, find Attio, and select **Disconnect**. You can also disconnect it from **Settings → Connected accounts**. # Ask Circleback about HubSpot (/docs/support/assistant/connectors/ask-circleback-about-hubspot) Connect HubSpot to Circleback Assistant to research customers, update CRM data, and review campaign performance without leaving Circleback. Assistant can only access information available to the HubSpot account you connect. ## Connect HubSpot 1. Go to the **Ask** page in Circleback. 2. Select the plug icon next to the message box to open **Connectors**. 3. Find **HubSpot** and select **Connect**. 4. Sign in to HubSpot and approve the requested access. ## What Circleback can do - **CRM records**: Search and read HubSpot objects such as contacts, companies, deals, tickets, and other available CRM records. - **Create and update records**: Manage supported CRM objects and their properties. - **Properties**: Search and read CRM property definitions so Assistant can use the right fields. - **Owners and account**: Search record owners and read details about the connected HubSpot user. - **Campaign contacts**: Get campaign contacts by engagement type. - **Campaign reporting**: Read campaign analytics, available asset types, and asset performance metrics. ## Example requests - “Find the HubSpot company and open deals for Acme.” - “Update this deal with the next steps and follow-up date from our meeting.” - “Compare the performance of the assets in our latest campaign.” ## Disconnect HubSpot Open **Connectors** from the Ask page, find HubSpot, and select **Disconnect**. You can also disconnect it from **Settings → Connected accounts**. # Ask Circleback about Intercom (/docs/support/assistant/connectors/ask-circleback-about-intercom) Connect Intercom to Circleback Assistant to research customer history and maintain Help Center content without leaving Circleback. Assistant can only access information available to the Intercom account you connect. ## Connect Intercom 1. Go to the **Ask** page in Circleback. 2. Select the plug icon next to the message box to open **Connectors**. 3. Find **Intercom** and select **Connect**. 4. Sign in to Intercom and approve the requested access. ## What Circleback can do - **Unified search and retrieval**: Search Intercom contacts or conversations with structured filters and fetch full results. - **Conversations**: Search conversations by customer, state, channel, assignment, timing, ratings, or AI Agent fields and read complete conversations. - **Contacts**: Search contacts by identity, company domain, phone number, or custom attributes and read contact details. - **Companies**: List companies with filters and read company details. - **Help Center articles**: List or search articles, read complete article content, create articles, and update article titles, summaries, content, state, or location. ## Example requests - “Find the recent support history for alex@example.com.” - “Show open conversations about billing that have not received an admin reply.” - “Draft a Help Center article from these meeting notes and add it to the right section.” ## Disconnect Intercom Open **Connectors** from the Ask page, find Intercom, and select **Disconnect**. You can also disconnect it from **Settings → Connected accounts**. # Ask Circleback about Linear (/docs/support/assistant/connectors/ask-circleback-about-linear) Connect Linear to Circleback Assistant to find project information and keep work up to date without leaving Circleback. Assistant can only access information available to the Linear account you connect. ## Connect Linear 1. Go to the **Ask** page in Circleback. 2. Select the plug icon next to the message box to open **Connectors**. 3. Find **Linear** and select **Connect**. 4. Sign in to Linear and approve the requested access. If Linear is already connected to Circleback, Assistant uses that existing connection. ## What Circleback can do - **Issues**: Search, filter, and read issues; create or update issue titles, descriptions, teams, statuses, cycles, labels, assignees, projects, milestones, priorities, parent and duplicate relationships, due dates, estimates, links, and blocking or related issue relationships. - **Comments**: List comments and create or update comments on issues, documents, projects, initiatives, and milestones, including replies. - **Projects and initiatives**: Search and read projects, then create or update projects and initiatives, including summaries, leads or owners, teams, labels, dates, priorities, and initiative relationships. - **Milestones and cycles**: List project milestones, read milestone details, create or update milestones, and list current, previous, or upcoming cycles. - **Documents**: Search and read documents, then create or update their title, content, appearance, and relationships to projects, issues, initiatives, cycles, or teams. - **Teams and people**: List and look up Linear teams and users. - **Statuses and labels**: List issue statuses and labels, and create issue labels. - **Linear help**: Search Linear product documentation. ## Example requests - “Find open Linear issues about onboarding assigned to me” - “Create a high-priority issue for the follow-up we discussed and add it to the current cycle” - “Summarize the latest comments on the mobile project and post an update” ## Disconnect Linear Open **Connectors** from the Ask page, find Linear, and select **Disconnect**. You can also disconnect it from **Settings → Connected accounts**. # Ask Circleback about Notion (/docs/support/assistant/connectors/ask-circleback-about-notion) Connect Notion to Circleback Assistant to find workspace knowledge and update Notion without leaving Circleback. Assistant can only access information available to the Notion account you connect. ## Connect Notion 1. Go to the **Ask** page in Circleback. 2. Select the plug icon next to the message box to open **Connectors**. 3. Find **Notion** and select **Connect**. 4. Sign in to Notion and approve the requested access. ## What Circleback can do - **Search and read**: Search your Notion workspace and fetch pages, databases, and other results. - **Databases and data sources**: Query data sources, database views, and meeting-notes data. - **Pages**: Create one or more pages and update existing pages. - **Comments**: Read comments and add new comments. - **Workspace information**: List teams and users, and check the status of longer-running Notion operations. ## Example requests - “Find the launch plan in Notion and summarize the open decisions.” - “Create a page with the action items from this meeting.” - “Add a comment to the roadmap page with today’s customer feedback.” ## Disconnect Notion Open **Connectors** from the Ask page, find Notion, and select **Disconnect**. You can also disconnect it from **Settings → Connected accounts**. # Ask Circleback about PostHog (/docs/support/assistant/connectors/ask-circleback-about-posthog) Connect PostHog to Circleback Assistant to investigate product behavior and maintain analytics or feature flags without leaving Circleback. Assistant can only access information available to the PostHog account you connect. ## Connect PostHog 1. Go to the **Ask** page in Circleback. 2. Select the plug icon next to the message box to open **Connectors**. 3. Find **PostHog** and select **Connect**. 4. Sign in to PostHog and approve the requested access. ## What Circleback can do - **Projects, users, and schemas**: Read project and user details, event and property schemas, and data-warehouse schemas. - **Actions**: Create actions and list, read, or update existing actions. - **Dashboards**: Create, read, and update dashboards; create or update text tiles; add, update, reorder, copy, or move dashboard tiles and widgets; and run dashboard insights. - **Insights and product analytics**: List and read insights, run arbitrary insight queries, and query trends, funnels, retention, paths, lifecycle, stickiness, web overview, and web statistics. - **Activity**: Read insight activity and broader project activity. - **Feature flags**: Create, list, read, and update feature flags; inspect dependencies, status, activity, evaluation reasons, current flags, and bulk keys; test evaluations; and estimate user blast radius. - **Scheduled changes**: Create, list, read, and update scheduled feature-flag changes. - **PostHog help**: Search PostHog documentation. ## Example requests - “Did this customer end up signing up for a free trial?” - “Add the Initech team to the new onboarding feature flag” - “How many people from Initech visited the pricing page after our demo?” ## Disconnect PostHog Open **Connectors** from the Ask page, find PostHog, and select **Disconnect**. You can also disconnect it from **Settings → Connected accounts**. # Connectors (/docs/support/assistant/connectors) - [Ask Circleback about Linear](/docs/support/assistant/connectors/ask-circleback-about-linear): Search Linear and create or update issues, projects, comments, documents, and more - [Ask Circleback about Notion](/docs/support/assistant/connectors/ask-circleback-about-notion): Search Notion and create or update pages, databases, and comments - [Ask Circleback about Asana](/docs/support/assistant/connectors/ask-circleback-about-asana): Search Asana and create or update tasks, projects, comments, and status updates - [Ask Circleback about HubSpot](/docs/support/assistant/connectors/ask-circleback-about-hubspot): Search HubSpot and create or update contacts, companies, deals, tickets, and more - [Ask Circleback about PostHog](/docs/support/assistant/connectors/ask-circleback-about-posthog): Search product events, dashboards, feature flags, and more - [Ask Circleback about Attio](/docs/support/assistant/connectors/ask-circleback-about-attio): Search Attio and create or update CRM records, notes, tasks, comments, and more - [Ask Circleback about Ashby](/docs/support/assistant/connectors/ask-circleback-about-ashby): Search Ashby and create candidates, add notes, and update applications - [Ask Circleback about Intercom](/docs/support/assistant/connectors/ask-circleback-about-intercom): Search Intercom contacts, companies, and conversations, and create or update Help Center articles # Import meetings from other apps (/docs/support/account-and-setup/switch-to-circleback/import-meetings-from-other-apps) You can import meetings from another app into Circleback. Circleback brings over notes, transcripts, attendees, and recordings (if available). Imported meetings work like any other meeting: you can search them, share them, and ask questions about them. Circleback currently imports from [Fathom](/docs/support/account-and-setup/switch-to-circleback/switch-to-circleback-from-fathom), [Fireflies](/docs/support/account-and-setup/switch-to-circleback/switch-to-circleback-from-fireflies), [Granola](/docs/support/account-and-setup/switch-to-circleback/switch-to-circleback-from-granola), and [Read AI](/docs/support/account-and-setup/switch-to-circleback/switch-to-circleback-from-read-ai). Each person imports the meetings on their own account. If your team is moving together, everyone should import their own meetings. To upload an audio or video file instead, see [Import a meeting](/docs/support/meetings/import-a-meeting). ### Import a meeting with the API Use the Circleback API when you’re importing from an app that isn’t listed above, or when you want to create meetings from your own data. See [Import meeting](/docs/api/meetings/import-meeting) in the API docs. # Switch to Circleback (/docs/support/account-and-setup/switch-to-circleback) - [Switch to Circleback from Fathom](/docs/support/account-and-setup/switch-to-circleback/switch-to-circleback-from-fathom): Import your Fathom meeting history into Circleback. - [Switch to Circleback from Fireflies](/docs/support/account-and-setup/switch-to-circleback/switch-to-circleback-from-fireflies): Import your Fireflies meeting history into Circleback. - [Switch to Circleback from Granola](/docs/support/account-and-setup/switch-to-circleback/switch-to-circleback-from-granola): Import your Granola meeting history into Circleback. - [Switch to Circleback from Read AI](/docs/support/account-and-setup/switch-to-circleback/switch-to-circleback-from-read-ai): Import your Read AI meeting history into Circleback. - [Import meetings from other apps](/docs/support/account-and-setup/switch-to-circleback/import-meetings-from-other-apps): Bring your meeting history from Fathom, Fireflies, Granola, Read AI, or other apps # Switch to Circleback from Fathom (/docs/support/account-and-setup/switch-to-circleback/switch-to-circleback-from-fathom) Bring your notes, transcripts, attendees, action items, and available recordings from Fathom into Circleback. Once imported, you can search your meetings, share them, and ask questions about them. Each person imports meetings from their **own** account. If your team is switching together, each team member should complete these steps. ### Import your meetings 1. In Circleback, go to **Settings → Import**. 2. Select **Fathom**. 3. Select **Connect** and follow the prompts to authorize Circleback. Use the same Fathom account for both authorization steps. 4. Review the number of meetings that will be imported, then select **Import**. You can close the page while Circleback imports your meetings in the background. We’ll email you when the import is complete. # Switch to Circleback from Fireflies (/docs/support/account-and-setup/switch-to-circleback/switch-to-circleback-from-fireflies) Bring your notes, transcripts, attendees, and available recordings from Fireflies into Circleback. Once imported, you can search your meetings, share them, and ask questions about them. Each person imports meetings from their **own** account. If your team is switching together, each team member should complete these steps. ### Import your meetings 1. In Circleback, go to **Settings → Import**. 2. Select **Fireflies**. 3. Open your [Fireflies API settings](https://app.fireflies.ai/settings/developer-settings) and copy your API key. 4. Paste the key into Circleback and select **Connect**. 5. Review the number of meetings that will be imported, then select **Import**. If your API key isn’t accepted, copy a new key from Fireflies and try again. You can close the page while Circleback imports your meetings in the background. We’ll email you when the import is complete. # Switch to Circleback from Granola (/docs/support/account-and-setup/switch-to-circleback/switch-to-circleback-from-granola) Bring your meeting history from Granola into Circleback. Once imported, you can search your meetings, share them, and ask questions about them. Each person imports meetings from their **own** account. If your team is switching together, each team member should complete these steps. ### Import your meetings 1. In Circleback, go to **Settings → Import**. 2. Select **Granola**. 3. Select **Connect** and authorize Circleback in the Granola window that opens. 4. Review the number of meetings that will be imported, then select **Import**. You can close the page while Circleback imports your meetings in the background. We’ll email you when the import is complete. # Switch to Circleback from Read AI (/docs/support/account-and-setup/switch-to-circleback/switch-to-circleback-from-read-ai) Bring your notes, transcripts, attendees, and available recordings from Read AI into Circleback. Once imported, you can search your meetings, share them, and ask questions about them. Circleback imports meetings you **own** in Read AI. If your team is switching together, each team member should import meetings from their own account. To include recordings, enable **Downloads** in Read AI under **Manage Workspace → Settings → Reporting**. ### Import your meetings 1. In Circleback, go to **Settings → Import**. 2. Select **Read AI**. 3. Select **Connect** and authorize Circleback in the Read AI window that opens. 4. Review the number of meetings that will be imported, then select **Import**. You can close the page while Circleback imports your meetings in the background. We’ll email you when the import is complete. # Integrations (/docs/support/automations/integrations) - [Integrate with Slack](/docs/support/automations/integrations/integrate-with-slack): Create an automation to send meeting outcomes to a Slack channel - [Integrate with Notion](/docs/support/automations/integrations/integrate-with-notion): Create an automation to send meeting outcomes to a Notion page or database - [Integrate with Linear](/docs/support/automations/integrations/integrate-with-linear): Use automations to create issues in Linear - [Integrate with HubSpot](/docs/support/automations/integrations/integrate-with-hubspot): Create an automation to update contacts and deals on HubSpot with meeting outcomes - [Integrate with Salesforce](/docs/support/automations/integrations/integrate-with-salesforce): Create an automation to update contacts and opportunities on Salesforce with meeting outcomes - [Integrate with Attio](/docs/support/automations/integrations/integrate-with-attio): Create an automation to update people, companies, and deals on Attio with meeting outcomes - [Integrate with Zoho](/docs/support/automations/integrations/integrate-with-zoho): Create an automation to update contacts in Zoho with meeting outcomes - [Integrate with monday.com](/docs/support/automations/integrations/integrate-with-monday-com): Create an automation that writes action items to a monday.com board - [Integrate with apps using Make](/docs/support/automations/integrations/integrate-with-apps-using-make): Use automations to send data to Make and integrate with thousands of apps, including Asana, Google Drive, Affinity, Jira, and more - [Integrate with apps using Zapier](/docs/support/automations/integrations/integrate-with-apps-using-zapier): Use automations to send data to Zapier and integrate with thousands of apps, including Asana, Google Drive, Affinity, Jira, and more # Integrate with apps using Make (/docs/support/automations/integrations/integrate-with-apps-using-make) You can set up an automation to send data to Make in order to integrate with [thousands of apps](https://www.make.com/en/integrations/circleback?utm_source=circleback-app&utm_medium=partner&utm_campaign=circleback-app-partner-program), including: - Affinity - Airtable - Asana - ClickUp - Google Drive - Jira - Pipedrive CRM - Todoist The webhook integration in automations can be used to send data to Make and integrate with other apps. 1. Log in to [Make](https://www.make.com/en/register?utm_source=circleback-app&utm_medium=partner&utm_campaign=circleback-app-partner-program). 2. Go to scenarios and create a new scenario. 3. Search for and select **Circleback** from the list of apps. 4. Select **Watch Webhook Request**. 5. Create a webhook and a new connection and save both. 6. Copy the webhook address created (e.g. `https://hook.us1.make.com/nctzx…`). 7. Open Circleback and add a webhook step to a new or existing automation. 1. Learn more about creating automations [here](/docs/support/automations/getting-started-with-automations). 8. Enter the webhook address from step 6 and toggle on meeting outcomes you'd like sent to Make, then select **Done** and save or create the automation on Circleback. 9. Go back to Make and add another module, selecting an app of your choice. 10. Once you've configured the new module, select **Run once** on Make, then go back to the automation webhook step on Circleback and send a request. Once the request is sent, you'll see confirmation on Make that data was received and the scenario ran. 11. Save the scenario. # Integrate with apps using Zapier (/docs/support/automations/integrations/integrate-with-apps-using-zapier) You can set up an automation to send data to Zapier in order to integrate with [thousands of apps](https://zapier.com/apps), including: - Affinity - Airtable - Asana - ClickUp - Google Drive - Jira - Pipedrive CRM - Todoist - Trello The Zapier integration in automations can be used to send data to Zapier and integrate with other apps. 1. Go to the [Automations](https://circleback.ai/automations) page. 2. Select **New automation**. 3. Set some conditions for when you'd like this automation to run, or click **Next** if you'd like it to run after every meeting. 4. Choose Zapier from the menu. 5. Click **Connect** if you haven't already connected your Zapier account. 6. Select the meeting outcomes you'd like included. 7. Select **Done** on the step and **Create** in the top-right to save the automation. 8. Open Zapier and create a new Zap. 9. Select **Trigger**, search for Circleback in the modal, and select **Circleback** from the results. 10. Select **Automations** as the trigger event and continue. 11. Choose the automation step created in step 7. **Note:** An automation step can be connected to only one Zap. If you select an automation step that was already connected to a Zap, the previous Zap will stop receiving data. 12. Select **Continue** on the Zap creation screen to proceed to the test step, then select **Test** to fetch sample data. 13. Select **Continue with selected record**, the fields can then be used in subsequent steps. 14. Select the app you'd like to integrate with and configure it according to how you'd like it to work. 15. Once done, select **Publish** to activate your Zap. When the automation runs, the selected meeting outcomes will be sent to the selected app via the Zapier integration. # Integrate with Attio (/docs/support/automations/integrations/integrate-with-attio) 1. Go to the Automations page. 2. Select **New automation.** 3. Set some conditions for when you'd like this automation to run, or click **Run after every meeting**. 4. Choose Attio from the menu. 5. Click **Connect** if you haven't already connected your Attio account. 6. Choose whether to update people, companies, or deals. Updates are made by matching meeting invitees' emails with people on Attio. 7. Choose what meeting outcomes to include. 8. Click **Done**, then **Create.** Your automation will run on meetings that match the trigger conditions you set up in step 3 moving forward. # Integrate with HubSpot (/docs/support/automations/integrations/integrate-with-hubspot) 1. Go to the Automations page. 2. Select **New automation.** 3. Set some conditions for when you'd like this automation to run, or click **Run after every meeting**. 4. Choose HubSpot from the menu. 5. Click **Connect** if you haven't already connected your HubSpot account. 6. Choose whether to update contacts or deals. Updates are made by matching meeting invitees' emails with contacts on HubSpot. 7. Choose what meeting outcomes to include. 8. Click **Done**, then **Create.** Your automation will run on meetings that match the trigger conditions you set up in step 3 moving forward. # Integrate with Linear (/docs/support/automations/integrations/integrate-with-linear) 1. Go to the Automations page. 2. Select **New automation.** 3. Set some conditions for when you'd like this automation to run, or click **Run after every meeting**. 4. Choose Linear from the menu. 5. Click **Connect** if you haven't already connected your Linear account. 6. Select the Linear team to associate issues with. 7. Choose which action items become Linear issues: - **Issues assigned to a Linear team member**: Creates issues when the action item assignee's email matches someone in the selected Linear team. - **Issues not assigned to a Linear team member**: Creates issues for action items where the assignee isn't in the Linear team, or has no assignee. Both are enabled by default. 8. Click **Done**, then **Create.** Your automation will run on meetings that match the trigger conditions you set up in step 3 moving forward. # Integrate with monday.com (/docs/support/automations/integrations/integrate-with-monday-com) 1. Go to the Automations page. 2. Select **New automation.** 3. Set some conditions for when you'd like this automation to run, or click **Run after every meeting**. 4. Choose monday.com from the menu. 5. Click **Connect** if you haven't already connected your monday.com account. 6. Choose the monday.com board you'd like your action items to go to. 7. Select the group the action items should end up in. 8. Click **Done**, then **Create.** Your automation will run on meetings that match the trigger conditions you set up in step 3 moving forward. # Integrate with Notion (/docs/support/automations/integrations/integrate-with-notion) 1. Go to the Automations page. 2. Select **New automation.** 3. Set some conditions for when you'd like this automation to run, or click **Run after every meeting**. 4. Choose Notion from the menu. 5. Click **Connect** if you haven't already connected your Notion account. 6. Choose the Notion page or database you'd like to send meeting outcomes to. 1. If the page or database you're looking for is not showing up, you may need to go to it on Notion, select ⋯ → Connections, and add Circleback. 7. For pages, choose what meeting outcomes to include in the created page. For database, choose the mapping of meeting outcomes to database properties. 8. Select **Done**, then **Create.** # Integrate with Salesforce (/docs/support/automations/integrations/integrate-with-salesforce) 1. Go to the Automations page. 2. Select **New automation.** 3. Set some conditions for when you'd like this automation to run, or click **Run after every meeting**. 4. Choose Salesforce from the menu. 5. Click **Connect** if you haven't already connected your Salesforce account. 6. Choose whether to update contacts or opportunities. Updates are made by matching meeting invitees' emails with contacts on Salesforce. 7. Choose what meeting outcomes to include. 8. Click **Done**, then **Create.** Your automation will run on meetings that match the trigger conditions you set up in step 3 moving forward. # Integrate with Slack (/docs/support/automations/integrations/integrate-with-slack) 1. Go to the Automations page. 2. Select **New automation.** 3. Set some conditions for when you'd like this automation to run, or click **Run after every meeting**. 4. Choose Slack from the menu. 5. Click **Connect** if you haven't already connected your Slack account. 6. Choose the Slack channel you'd like to send meeting outcomes to. 1. To select a private channel, you'll need to add the Circleback app to the channel. You can check Circleback is added by opening the channel details and confirming that Circleback shows up under Integrations → Apps. 7. Choose what meeting outcomes to include. 8. Click **Done**, then **Create.** # Integrate with Zoho (/docs/support/automations/integrations/integrate-with-zoho) 1. Go to the Automations page. 2. Select **New automation.** 3. Set some conditions for when you'd like this automation to run, or click **Run after every meeting**. 4. Choose Zoho from the menu. 5. Click **Connect** if you haven't already connected your Zoho account. 6. Choose what meeting outcomes to include. 7. Click **Done**, then **Create.** Your automation will run on meetings that match the trigger conditions you set up in step 3 moving forward. # How to get Circleback to join a meeting (/docs/support/recording/bot/how-to-get-circleback-to-join-a-meeting) There are two ways to have the Circleback bot join and capture your online meetings. If you'd prefer to record without a bot joining, you can also use the [desktop app](https://circleback.ai/desktop) or [mobile app](https://circleback.ai/mobile). ## Calendar Once you've [connected your calendar](/docs/support/account-and-setup/connect-your-calendar), Circleback will automatically detect events with an online meeting link. You can choose which types of meetings Circleback joins from your [meeting joining preferences](/docs/support/account-and-setup/meeting-joining-preferences), and toggle individual meetings on or off from Home. ## Meeting link You can add Circleback to a meeting manually by entering the link of a live meeting. 1. Open the dropdown next to **New meeting** from the left sidebar, then select **Invite Circleback**. 2. Paste the link to the meeting you'd like Circleback to join. 3. Select **Add Circleback**. Circleback will join within a few seconds. Depending on the meeting platform's settings, the host may need to admit Circleback into the call. If Circleback isn't joining, see [Troubleshoot Circleback not joining a meeting](/docs/support/recording/bot/troubleshoot-circleback-not-joining-a-meeting). # Bot (/docs/support/recording/bot) - [How to get Circleback to join a meeting](/docs/support/recording/bot/how-to-get-circleback-to-join-a-meeting): Have Circleback join your meetings automatically from your calendar or manually with a meeting link - [Troubleshoot Circleback not joining a meeting](/docs/support/recording/bot/troubleshoot-circleback-not-joining-a-meeting): Common reasons Circleback can't join a meeting and how to fix them - [Use Circleback in Slack huddles](/docs/support/recording/bot/use-circleback-in-slack-huddles): Connect Circleback to Slack and have it automatically record huddles # Troubleshoot Circleback not joining a meeting (/docs/support/recording/bot/troubleshoot-circleback-not-joining-a-meeting) If Circleback isn't joining your meeting, here are the most common reasons and how to fix them. If Circleback can't join, you can always capture the meeting with the [desktop app](/docs/support/recording/desktop-app/record-meetings-with-the-desktop-app) instead, or try again by [adding Circleback manually with the meeting link](/docs/support/recording/bot/how-to-get-circleback-to-join-a-meeting). ## The host hasn't admitted Circleback On some platforms, Circleback needs to be admitted from the waiting room like any other participant. If the waiting room timeout is exceeded before the host admits Circleback, it won't be able to join. ## The meeting requires authentication or registration Some meeting settings prevent guests like Circleback from joining. ### Zoom - Disable **Only authenticated users can join meetings** ([instructions](https://support.zoom.com/hc/en/article?id=zm_kb&sysparm_article=KB0063018)) - Disable **Registration Required** for webinars ([instructions](https://support.zoom.com/hc/en/article?id=zm_kb&sysparm_article=KB0058655)) ### Google Meet - Enable **Anyone with the meeting link can ask to join** in the host controls ([instructions](https://support.google.com/meet/answer/9302870?control-meeting-access-with-host-controls#zippy=%2Ccontrol-meeting-access-with-host-controls)) - If you're a Google Workspace admin, select **All users (including users not signed in with a Google account)** from Apps → Google Workspace → Google Meet → Meet safety settings ([instructions](https://support.google.com/a/answer/7304109?hl=en&sjid=6146244984963139741-NC#:~:text=Manage%20Meet%20safety%20settings)) ## The meeting doesn't allow external participants Some organizations restrict meetings to internal participants only. ### Google Meet The organizer can enable **Anyone with the meeting link can ask to join** on the Google Calendar invite, or a Workspace admin can change this globally from Meet safety settings. ## The meeting password is incorrect If the meeting link in your calendar event includes a password, make sure it's up to date. If the host changed the password after sending the invite, Circleback won't be able to join with the old one. # Use Circleback in Slack huddles (/docs/support/recording/bot/use-circleback-in-slack-huddles) Circleback can automatically join and record Slack huddles, giving you the same notes, action items, and transcript you get from any other meeting. For this to work, participants in the huddle need to be in your Circleback workspace and use the same email address for both Slack and Circleback. ## Connect Slack 1. Go to Settings → General (under Workspace). 2. Scroll down to the Slack section and select **Connect**. 3. Enter your Slack workspace URL (e.g., yourcompany.slack.com). 4. Continue and copy the provided email address. 5. Invite this email as a regular member to your Slack workspace. If your workspace uses SSO, invite it as a multi-channel guest instead. 6. Add Circleback to any private channels where you want to use huddles. Circleback will automatically join huddles in any channel it's a member of, both public and private. ## Huddles in direct messages For huddles in direct messages, Circleback won't join automatically. Once the huddle has started, select **Invite people** from the huddle menu and invite Circleback. # Choose audio and video recording preferences (/docs/support/recording/desktop-app/choose-audio-and-video-recording-preferences) When you start a recording, you can choose your microphone and other capture settings. The options available depend on whether you're recording from the [desktop app](/docs/support/recording/desktop-app/record-meetings-with-the-desktop-app). ## Choosing your settings Select **New meeting** from the left sidebar. You'll see the recording screen with a **Record** button at the bottom. Circleback automatically associates the recording with the calendar event closest to the current time, select the chevron next to **New meeting** at the top to switch to a different event. You can adjust your settings anytime before or while recording on desktop: - **Microphone**: select the microphone icon to choose which microphone to use. - **Screen or window**: choose a screen or window to record. Select **None** for audio only. - **Computer audio**: toggle this on to capture audio from your computer. Recommended for online meetings like Zoom or Google Meet. # Desktop recording requirements (/docs/support/recording/desktop-app/desktop-recording-requirements) ### macOS - **OS:** macOS Sonoma (14.2) or later - **RAM:** 8 GB of RAM - **Processor:** Apple Silicon (M1 or later) or Intel Core i5 (8th generation or later) - **Storage:** We recommend having at least 50 GB of free disk space - **Internet:** Stable internet connection recommended ### Windows - **OS:** Windows 11 or later - **RAM:** 8 GB - **Processor:** Intel Core i5 (8th generation or later), or AMD Ryzen 5 (3000 series or later) - **GPU:** DirectX 11 compatible GPU - **Storage:** We recommend having at least 50 GB of free disk space - **Internet:** Stable internet connection recommended If you encounter other issues with the desktop app, check out our [Troubleshooting guide](/docs/support/recording/desktop-app/troubleshoot-recording-on-desktop). # Desktop app (/docs/support/recording/desktop-app) - [Record meetings with the desktop app](/docs/support/recording/desktop-app/record-meetings-with-the-desktop-app): Record meetings on any platform without a bot joining - [Use Circleback from the menu bar](/docs/support/recording/desktop-app/use-circleback-from-the-menu-bar): Use the Circleback menu bar app to see upcoming meetings, record a new meeting, and more - [Choose audio and video recording preferences](/docs/support/recording/desktop-app/choose-audio-and-video-recording-preferences): Choose your microphone, system audio, and screen capture settings for a recording - [Troubleshoot recording on desktop](/docs/support/recording/desktop-app/troubleshoot-recording-on-desktop): Common reasons that prevent recording on the desktop app and web - [Desktop recording requirements](/docs/support/recording/desktop-app/desktop-recording-requirements): Requirements and recommendations for recording your screen and system audio with the desktop app # Record meetings with the desktop app (/docs/support/recording/desktop-app/record-meetings-with-the-desktop-app) The Circleback desktop app lets you record meetings on Zoom, Google Meet, Microsoft Teams, or any other platform without the Circleback bot joining as a participant. It captures your microphone and computer audio directly from your machine. ## Install the desktop app 1. Download the app from [circleback.ai/desktop](https://circleback.ai/desktop) (available for macOS and Windows). 2. Install and open the app. 3. Log in with your Circleback account. ## Automatic meeting detection Go to Settings → Notifications and enable **Detect meetings**. When you join a meeting on your computer, Circleback detects when an app (like Zoom or Google Meet) starts using your microphone and sends you a notification with the option to record. If you also have [joining preferences](/docs/support/account-and-setup/meeting-joining-preferences) enabled, Circleback will first try to join the meeting as a bot participant. If it's unable to join (for example, if the host doesn't admit it), Circleback will fall back to recording with the desktop app instead so you never miss a meeting. If you'd prefer to always record with the desktop app and never have the bot join, turn off your joining preferences from Settings → Calendar. ## Automatic start and end With **Automatically start recordings** enabled, recording will begin automatically after a short countdown when a meeting is detected. If you don't want to record a specific meeting, click **Don't Record** on the notification to cancel. With **Automatically end recordings** enabled, recording will stop when your microphone is no longer in use (e.g. you've left the meeting). If you want to continue the recording when the end of a meeting is detected, you can click **Keep Recording** to continue. ## Record meeting video By default, the notification for detected meetings will be set to record video from the meeting window along with audio. If you'd prefer to record audio only, disable **Record meeting video** from Settings → Notifications. You can still change this from the notification before a recording starts. ## Starting a recording manually You can also start a recording at any time from the app or the menu bar. ### From the app 1. Open the Circleback app. 2. Select **New meeting** in the left sidebar. ### From the menu bar (macOS) or system tray (Windows) 1. Click the Circleback icon. 2. Select **Open Record Panel**. When starting a recording, you can choose your microphone, screen, and system audio preferences. See [Set recording device preferences](/docs/support/recording/desktop-app/choose-audio-and-video-recording-preferences) for details. # Troubleshoot recording on desktop (/docs/support/recording/desktop-app/troubleshoot-recording-on-desktop) If you're not able to record with the desktop app, here are the most common reasons and how to fix them. ## Circleback doesn't have permissions The Circleback app requires system level permissions to record your microphone, screen, and system audio. You can give Circleback these permissions through your system or browser settings. ### macOS - Enable **Microphone** access for Circleback from System Settings - System Settings → Privacy & Security → Microphone → turn on access for Circleback ([Control access to the microphone on Mac](https://support.apple.com/guide/mac-help/control-access-to-the-microphone-on-mac-mchla1b1e1fe/mac)) - Enable **Screen & System Audio Recording** for Circleback from System Settings - System Settings → Privacy & Security → Screen & System Audio Recording → turn on access for Circleback ([Control access to screen and system audio recording on Mac](https://support.apple.com/guide/mac-help/control-access-screen-system-audio-recording-mchld6aa7d23/mac)) ### Windows - Enable **Microphone** permissions for Circleback from Settings ([Turn on app permissions for your microphone in Windows](https://support.microsoft.com/en-us/windows/turn-on-app-permissions-for-your-microphone-in-windows-94991183-f69d-b4cf-4679-c98ca45f577a)) - Enable **Screenshots and screen recording** permissions for Circleback from Settings → Privacy & Security → Screenshots and screen recording - Make sure that **Exclusive Mode** is turned off for your microphone by going to **Settings → System → Sound → More sound settings → Recording → select the microphone → Properties → Advanced → Exclusive Mode.** # Use Circleback from the menu bar (/docs/support/recording/desktop-app/use-circleback-from-the-menu-bar) The Circleback desktop app adds an icon to the menu bar on macOS (or the system tray on Windows). The menu bar gives you quick access to your meetings, recordings, and settings without opening the app. ## Your meetings at a glance Click the Circleback icon in the menu bar to see your meetings for the day. Click a meeting to: - Open the meeting in Circleback - Join the call directly (e.g. Open Google Meet) - View the event in your calendar - Email the invitees - Control whether Circleback joins the meeting ## Record a meeting Click **Open Record Panel** at the top of the menu to start a recording. You can record any meeting or conversation on your computer, whether or not it is on your calendar. See [Record meetings with the desktop app](/docs/support/recording/desktop-app/record-meetings-with-the-desktop-app) for details. To have Circleback automatically detect and prompt you to record when you join a call, enable Detect meetings from Settings → Notifications. ## Other options - **Open Circleback** opens the full app - **Settings** lets you adjust recording, notification, and other preferences - **Quit** closes the desktop app and removes the menu bar icon ## If you don't see Circleback in the menu bar macOS limits how many icons can fit in the menu bar, especially on MacBooks with a notch. When there isn't enough space, some icons are hidden. To free up space, go to System Settings → Menu Bar. Deselect items you don't need always visible (like Spotlight, Screen Mirroring, or Now Playing). For items like Focus or Sound, change the option from "Always Show" to "Show When Active" so they only appear when in use. You can also rearrange menu bar icons by pressing and holding the Command (⌘) key, then dragging them. Move less important icons to the left to make room for Circleback on the right. If the icon still doesn't appear, make sure the desktop app is running. Search for "Circleback" in Spotlight (Command + Space) and open it. The menu bar icon appears when the app is running. If you haven't installed the desktop app yet, download it from [circleback.ai/desktop](https://circleback.ai/desktop). # Mobile app (/docs/support/recording/mobile-app) - [Record meetings with the mobile app](/docs/support/recording/mobile-app/record-meetings-with-the-mobile-app): Capture in-person meetings and conversations with your phone - [Record a phone call](/docs/support/recording/mobile-app/record-a-phone-call): Record phone calls with your phone's built-in call recording and import them into Circleback - [Start recording with the Circleback widget on iOS](/docs/support/recording/mobile-app/start-recording-with-the-circleback-widget-on-ios): Quickly start a recording from your Lock Screen or Home Screen on iOS - [Start recording with the Action button on iPhone](/docs/support/recording/mobile-app/start-recording-with-the-action-button-on-iphone): Quickly start a recording in Circleback using the Action button on iPhone # Record a phone call (/docs/support/recording/mobile-app/record-a-phone-call) You can record a phone call using your phone's built-in call recording and import it into Circleback. Circleback will transcribe and process the call just like a live meeting, generating notes, action items, and insights. ## Record a call on iPhone iPhone can record phone calls on iOS 18.1 or later. Call recording is available in select regions and languages. 1. During a call, tap **More**. 2. Tap **Call Recording**. Everyone on the call will hear an announcement that the call is being recorded. 3. To finish, tap the stop button or simply end the call. The recording is saved to the **Call Recordings** folder in the Notes app. 4. Open the recording in the Notes app and tap the share button. 5. Select **Circleback** in the share sheet. Circleback will open and import the recording automatically. ## Record a call on Android The Google Phone app can record phone calls on supported devices. Availability depends on your device, country, and carrier. On other Android phones, the option may be named differently — like **Record call** on Samsung phones. 1. During a call, tap **Record**. Everyone on the call will hear an announcement that the call is being recorded. 2. To finish, tap **Stop recording** or simply end the call. 3. In the Phone app, tap the call in your call history to find the recording. 4. Tap **Share** and select **Circleback**. Circleback will open and import the recording automatically. # Record meetings with the mobile app (/docs/support/recording/mobile-app/record-meetings-with-the-mobile-app) The Circleback mobile app lets you capture in-person meetings and conversations using your phone's microphone. It records audio only. ## Getting started 1. Download the app from [circleback.ai/mobile](https://circleback.ai/mobile) (available for iOS and Android). 2. Open the app and log in to your account. 3. Select **Record** from the bottom navigation. 4. If the meeting is on your calendar, select the associated calendar event. This links the recording to the event so you get the right meeting title and participant names. 5. Start recording. The app will continue recording in the background if you lock your phone or switch to another app. You'll see a Live Activity (iOS) or live notification (Android) that you can use to pause, resume, or finish the recording. If you receive a phone call during recording, the recording may be paused. On iOS, if Background App Refresh is off, your meeting might take longer to upload. ## Quick start on iOS You can also start recording without opening the app: - [Set up the Action button on iPhone](/docs/support/recording/mobile-app/start-recording-with-the-action-button-on-iphone) to start recording with a long press. - [Add the Circleback widget](/docs/support/recording/mobile-app/start-recording-with-the-circleback-widget-on-ios) to your Lock Screen or Home Screen for one-tap recording. # Start recording with the Action button on iPhone (/docs/support/recording/mobile-app/start-recording-with-the-action-button-on-iphone) You can use the Action button on your iPhone to quickly start recording a meeting in the Circleback mobile app. 1. Go to the Settings app on your iPhone. 2. Tap Action Button. 3. Swipe left to Controls. 4. Search for Circleback and select Record. Now, when you press and hold the Action button on iPhone, Circleback will open and start a recording for the current meeting on your calendar. # Start recording with the Circleback widget on iOS (/docs/support/recording/mobile-app/start-recording-with-the-circleback-widget-on-ios) You can use the widget on your iOS Lock Screen or Home Screen to quickly start recording a meeting in the Circleback mobile app. ## How to add the widget to your Lock Screen 1. Touch and hold the Lock Screen until the Customize button appears, then tap Customize. 2. Tap Add Widgets. 3. Select Circleback to add the widget to the Lock Screen. 4. When you're finished, tap the close button, then tap Done. ## How to add the widget to your Home Screen 1. From the Home Screen, touch and hold a widget or an empty area until the apps jiggle. 2. Tap Edit in the upper-left corner. 3. Tap Add Widget. 4. Search for and select Circleback, then tap Add Widget. 5. Tap Done. # Single sign-on (/docs/support/security/single-sign-on) - [SSO](/docs/support/security/single-sign-on/sso): Connect your identity provider so workspace members can log in to Circleback with SSO - [Set up SSO with Google Workspace](/docs/support/security/single-sign-on/set-up-sso-with-google-workspace): Use Google Workspace as an identity provider for Circleback - [Set up SSO with Microsoft Entra ID](/docs/support/security/single-sign-on/set-up-sso-with-microsoft-entra-id): Let your team sign in to Circleback with Microsoft Entra ID - [Set up SSO with SAML](/docs/support/security/single-sign-on/set-up-sso-with-saml): Connect any identity provider that supports SAML 2.0 to Circleback - [Set up SSO with OpenID Connect](/docs/support/security/single-sign-on/set-up-sso-with-openid-connect): Connect any identity provider that supports OpenID Connect to Circleback - [Set up SSO with Okta](/docs/support/security/single-sign-on/set-up-sso-with-okta): Let your team log in to Circleback with Okta # Set up SSO with Google Workspace (/docs/support/security/single-sign-on/set-up-sso-with-google-workspace) You can connect Google Workspace to Circleback by creating a custom SAML app in the Google Workspace Admin Console. You need access to manage apps in Google Admin and to be an admin of your Circleback workspace. 1\. In Circleback, go to Settings → General (under Workspace). 2\. Under **Single sign-on**, select **Connect**. Choose **SAML**, then select **Continue**. Keep this form open. 3\. In another tab, open the Google Admin console and go to **[Apps](https://admin.google.com/ac/apps/unified)**[ → **Web and mobile apps**](https://admin.google.com/ac/apps/unified). 4\. Select **Add app** → **Add custom SAML app**. Google Admin: Add custom SAML app 5\. Enter _Circleback_ as the app name, then select **Continue**. Google Admin: enter an app name 6\. On the Google identity provider details page, select **Download Metadata**. 7\. In Circleback, under **Metadata source**, choose **Upload XML file** and upload the file you downloaded. 8\. Return to Google Admin and select **Continue**. Google Admin: download identity provider metadata 9\. Copy the **ACS URL** and **Entity ID** from the open Circleback form into Google's **Service provider details** page, and set the Name ID fields as shown below: | Field | Value | | -------------- | ------------------------------------------ | | ACS URL | `https://circleback.ai/api/sso/oauth/saml` | | Entity ID | `https://circleback.ai/api/sso/metadata` | | Name ID format | EMAIL | | Name ID | Basic Information → Primary email | 10\. Select **Continue**, then add these attribute mappings: | Google Directory attribute | App attribute | | -------------------------- | ------------- | | Primary email | `email` | | First name | `firstName` | | Last name | `lastName` | Google Admin: email and name attribute mappings 11\. Select **Finish**. 12\. Open the Circleback app in Google Admin and select **User access**. Google Admin: open User access 13\. Turn the service on for everyone or for the organizational units that should use Circleback. 14\. Select **Save**. Google Admin: turn the service on for your team 15\. Return to the open Circleback form and select **Continue**. Leave **No directory sync** selected, then select **Connect**. To require everyone in your workspace to log in with SSO, follow [Enforce SSO for your workspace](/docs/support/security/single-sign-on/sso). This setup connects sign-in, not SCIM provisioning. To revoke someone's workspace access, [deactivate the member in Circleback](/docs/support/workspace-and-teams/deactivate-a-workspace-member). # Set up SSO with Microsoft Entra ID (/docs/support/security/single-sign-on/set-up-sso-with-microsoft-entra-id) You can connect Microsoft Entra ID to Circleback by creating a custom SAML application in the Entra admin center. You need access to manage enterprise applications in Entra and to be an admin of your Circleback workspace. Before you start, check the requirements in [Set up single sign-on](/docs/support/security/single-sign-on/sso). 1\. In Circleback, go to Settings → General (under Workspace). 2\. Under **Single sign-on**, select **Connect**. Choose **SAML**, then select **Continue**. Keep this form open. 3\. In another tab, open the Entra admin center and go to **Enterprise applications**. Microsoft Entra ID: Enterprise applications 4\. Select **New application** → **Create your own application**. Microsoft Entra ID: New application 5\. Enter **Circleback** as the name and choose to integrate an application you don't find in the gallery. 6\. Select **Create**. Microsoft Entra ID: Create your own application 7\. Open the application, select **Single sign-on** under **Manage**, then choose **SAML**. Microsoft Entra ID: choose SAML single sign-on 8\. In Entra, under **Basic SAML Configuration**, select **Edit**. Copy the **Entity ID** and **ACS URL** from the open Circleback form into the fields below: Microsoft Entra ID: edit Basic SAML Configuration | Field | Value | | ------------------------------------------ | ------------------------------------------ | | Identifier (Entity ID) | `https://circleback.ai/api/sso/metadata` | | Reply URL (Assertion Consumer Service URL) | `https://circleback.ai/api/sso/oauth/saml` | 9\. Select **Save**. Microsoft Entra ID: Identifier and Reply URL fields; use the Circleback URLs above 10\. Under **Attributes & Claims**, select **Edit**. Microsoft Entra ID: edit Attributes and Claims 11\. Set **Unique User Identifier (Name ID)** to the email your team member uses in Circleback, with the **Email address** format. Use `user.mail` if it contains that email for each assigned user. Only use `user.userprincipalname` if it matches their Circleback email. 12\. Check these claims and add any that are missing: | Claim | Source attribute | | -------------------------------------------------------------------- | ---------------- | | `http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress` | `user.mail` | | `http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname` | `user.givenname` | | `http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname` | `user.surname` | The email claim must also match the member's Circleback email. If you use a different source attribute for their email, use it for both the email claim and Name ID. 13\. Save your changes. Microsoft Entra ID: example attribute claims; follow the email mapping instructions above 14\. Return to **Single sign-on** in Entra. Under **SAML Signing Certificate**, download **Federation Metadata XML**. Microsoft Entra ID: download Federation Metadata XML 15\. In the open Circleback form, under **Metadata source**, choose **Upload XML file** and upload the file you downloaded. 16\. In Entra, open **Users and groups** in the application. 17\. Select **Add user/group** and choose the people or groups that should use Circleback. 18\. Select **Assign**. 19\. Return to Circleback and select **Continue**. Leave **No directory sync** selected for sign-in only, or select **Microsoft Entra ID** if you plan to set up SCIM provisioning. Select **Connect**. If you selected Microsoft Entra ID for directory sync, use the credentials shown in Circleback to [set up directory sync](/docs/support/security/single-sign-on/sso). To require everyone in your workspace to log in with SSO, follow [Enforce SSO for your workspace](/docs/support/security/single-sign-on/sso). # Set up SSO with Okta (/docs/support/security/single-sign-on/set-up-sso-with-okta) You can connect Okta to Circleback by creating a custom SAML application in the Okta Admin Console. You need access to manage applications in Okta and to be an admin of your Circleback workspace. Before you start, check the requirements in [Set up single sign-on](/docs/support/security/single-sign-on/sso). 1\. In Circleback, go to Settings → General (under Workspace). 2\. Under **Single sign-on**, select **Connect**. Choose **SAML**, then select **Continue**. Keep this form open. 3\. In another tab, open the Okta Admin Console and go to **Applications** → **Applications**. 4\. Select **Create App Integration**. Okta: Create App Integration 5\. Choose **SAML 2.0**, then select **Next**. Okta: choose SAML 2.0 6\. Enter **Circleback** as the app name, then select **Next**. Okta: enter an app name 7\. On Okta's **Configure SAML** page, copy the **ACS URL** and **Entity ID** from the open Circleback form into the fields below. Set the Name ID format and application username as shown: | Field | Value | | --------------------------- | ------------------------------------------ | | Single sign-on URL | `https://circleback.ai/api/sso/oauth/saml` | | Audience URI (SP Entity ID) | `https://circleback.ai/api/sso/metadata` | | Name ID format | EmailAddress | | Application username | Email | The application username must match the email your team member uses in Circleback. Okta: Configure SAML; use the Circleback values above 8\. Select **Next**, complete the feedback form for an internal application, then select **Finish**. Okta: feedback form for an internal application 9\. Open the application's **Sign On** tab and find **Attribute statements**. Okta: Attribute statements on the Sign On tab 10\. Expand **Show legacy configuration**, then select **Edit** next to **Profile attribute statements**. Okta: expand legacy configuration and edit profile attribute statements 11\. Add these attributes, leaving **Name format** as **Unspecified**: | Name | Value | | ----------- | ---------------- | | `email` | `user.email` | | `firstName` | `user.firstName` | | `lastName` | `user.lastName` | Okta: edit profile attribute statements 12\. Select **Save**. Okta: saved profile attribute statements 13\. On the **Sign On** tab, under **SAML Signing Certificates**, open **Actions** for the active certificate and select **View IdP metadata**. Copy the XML. Okta: View IdP metadata 14\. In the open Circleback form, under **Metadata source**, choose **Paste XML manually** and paste the XML into **Metadata XML**. 15\. In Okta, open the application's **Assignments** tab and assign the people or groups that should use Circleback. 16\. Return to Circleback and select **Continue**. Leave **No directory sync** selected for sign-in only, or select **Okta** if you plan to set up SCIM provisioning. Select **Connect**. If you selected Okta for directory sync, use the credentials shown in Circleback to [set up directory sync](/docs/support/security/single-sign-on/sso). To require everyone in your workspace to log in with SSO, follow [Enforce SSO for your workspace](/docs/support/security/single-sign-on/sso). # Set up SSO with OpenID Connect (/docs/support/security/single-sign-on/set-up-sso-with-openid-connect) Circleback works with any identity provider that supports OpenID Connect (OIDC), so your team can sign in with the provider your company already uses. You need to be a Circleback workspace admin and have access to manage applications in your identity provider. See [Set up single sign-on](/docs/support/security/single-sign-on/sso) for workspace requirements. If you're connecting with SAML instead, follow the [SAML guide](/docs/support/security/single-sign-on/set-up-sso-with-saml). ## Create an OIDC application Keep Circleback and your provider's admin console open in separate tabs as you set up the connection. Field names may vary by provider. 1. In Circleback, go to Settings → General (under Workspace). 2. Under **Single sign-on**, select **Connect**. Choose **OIDC**, then select **Continue**. 3. In your provider's admin console, create an OpenID Connect application named **Circleback**. 4. Copy the **Callback URL** from Circleback into your provider's callback or redirect URL field: `https://circleback.ai/api/sso/oauth/oidc`. 5. Copy the application's **Client ID** and **Client secret** into the matching fields in Circleback. Keep the client secret private. 6. Copy your provider's **Discovery URL** into Circleback. This must use HTTPS and usually ends in `/.well-known/openid-configuration`. Use the URL for the tenant or authorization server where you created the application; you can find it in your provider's documentation. 7. In your provider, give the people or groups who should use Circleback access to the application. 8. Return to Circleback and select **Continue**. 9. Leave **No directory sync** selected if you only need SSO, or choose a directory provider to set up SCIM provisioning. Select **Connect**. If you chose a directory provider, use the credentials shown in Circleback to [set up directory sync](/docs/support/security/single-sign-on/sso). To require everyone in your workspace to log in with SSO, follow [Enforce SSO for your workspace](/docs/support/security/single-sign-on/sso). # Set up SSO with SAML (/docs/support/security/single-sign-on/set-up-sso-with-saml) Circleback works with any identity provider that supports SAML 2.0, so your team can sign in with the provider your company already uses. If you use [Google Workspace](/docs/support/security/single-sign-on/set-up-sso-with-google-workspace), [Microsoft Entra ID](/docs/support/security/single-sign-on/set-up-sso-with-microsoft-entra-id), or [Okta](/docs/support/security/single-sign-on/set-up-sso-with-okta), follow the guide for that provider. For any other SAML provider, use the steps below. You need to be a Circleback workspace admin and have access to manage applications in your identity provider. See [Set up single sign-on](/docs/support/security/single-sign-on/sso) for workspace requirements. ## Create a SAML application 1. In Circleback, go to Settings → General (under Workspace). 2. Under **Single sign-on**, select **Connect**. Choose **SAML**, then select **Continue**. Keep this form open. 3. In another tab, open your provider's admin console and create a SAML 2.0 application named **Circleback**. 4. Copy the **ACS URL** and **Entity ID** from Circleback into your provider's application settings, and set the Name ID to the member's Circleback email address. Field names may vary by provider: | Field | Value | | ---------------------------------------------------------- | ------------------------------------------ | | ACS URL, Single sign-on URL, Reply URL, or Destination URL | `https://circleback.ai/api/sso/oauth/saml` | | Entity ID, Identifier, or Audience URI | `https://circleback.ai/api/sso/metadata` | | Name ID | The member's Circleback email address | | Name ID format | Email address | Configure the application to sign SAML responses and assertions using RSA-SHA256, and leave assertion encryption off. ## Map user attributes Add these attributes so Circleback receives each person's email and name: | SAML attribute | Value from your directory | | -------------- | ------------------------------------- | | `email` | The member's Circleback email address | | `firstName` | First name | | `lastName` | Last name | Circleback also accepts the standard claim names ending in `emailaddress`, `givenname`, and `surname` under `http://schemas.xmlsoap.org/ws/2005/05/identity/claims/`. Save your changes and give the people or groups who should use Circleback access to the application. Copy your provider's SAML metadata URL or download its metadata XML file. In the open Circleback form, under **Metadata source**, choose **Metadata URL**, **Upload XML file**, or **Paste XML manually**, then add your metadata. A metadata URL must use HTTPS. Select **Continue**. Leave **No directory sync** selected if you only need SSO, or choose a directory provider to set up SCIM provisioning. Select **Connect**. If you chose a directory provider, use the credentials shown in Circleback to [set up directory sync](/docs/support/security/single-sign-on/sso). To require everyone in your workspace to log in with SSO, follow [Enforce SSO for your workspace](/docs/support/security/single-sign-on/sso). # SSO (/docs/support/security/single-sign-on/sso) You can connect your identity provider to Circleback so workspace members can log in with SSO. Circleback supports SAML and OIDC, so it works with Okta, Google Workspace, Microsoft Entra ID, and any other provider that supports either standard. Once connected, workspace admins can enforce SSO, which disables every other way of logging in. Your identity provider decides who can access Circleback. Circleback also works with SCIM, so your identity provider can manage accounts for you. When someone joins your company, they get access to Circleback automatically. When they leave, they're deactivated in your workspace. ## Connect your identity provider 1. Go to Settings → General (under Workspace). 2. Under **Single sign-on**, select **Connect**. 3. Choose **SAML** or **OIDC**, then select **Continue**. 4. Create an application in your identity provider using the values shown in Circleback, then enter your provider's details in Circleback. Follow the guide for your provider below. 5. Select **Continue**. 6. Leave **No directory sync** selected if you only need SSO, or choose a directory provider to set up SCIM. Select **Connect**. Use one of these guides to configure your identity provider: - [Google Workspace](/docs/support/security/single-sign-on/set-up-sso-with-google-workspace) - [Microsoft Entra ID](/docs/support/security/single-sign-on/set-up-sso-with-microsoft-entra-id) - [Okta](/docs/support/security/single-sign-on/set-up-sso-with-okta) For other providers, follow the [SAML](/docs/support/security/single-sign-on/set-up-sso-with-saml) or [OpenID Connect](/docs/support/security/single-sign-on/set-up-sso-with-openid-connect) guide. You can connect one identity provider per workspace. To switch providers, disconnect the existing connection first. ## Set up directory sync Directory sync uses SCIM to add or deactivate workspace members through your identity provider. It is optional and separate from SSO. On the **Directory sync** step, select **Microsoft Entra ID**, **Okta**, or **Generic SCIM 2.0** if you plan to set up provisioning with that provider. After you select **Connect**, Circleback shows a **Directory endpoint** and **Directory token**. Copy these into your provider's SCIM provisioning settings, then select **Done** in Circleback. Keep the directory token private. For Google Workspace SAML setup, leave **No directory sync** selected. Directory sync only manages members whose email domain matches a verified workspace domain. It cannot deactivate the billing owner or the only remaining workspace admin. ## Enforce SSO for your workspace Connecting an identity provider does not require members to use it. To require SSO, go to Settings → General (under Workspace) and turn on **Enforce SSO** under **Single sign-on**. When you turn it on, other workspace members not logged in with SSO are signed out. They must log back in through your identity provider. Keep your current Circleback window open. In a private browser, go to the Circleback login page and enter your work email to check that you can log in through your identity provider. If you cannot log in, use your open admin session to turn off **Enforce SSO** while you check the setup. ## How Circleback access works without SSO Each time you log in to Circleback, we send a unique login code directly to your work email. If access to your work email is protected via your organization’s single sign-on (SSO) or multi-factor authentication (MFA), then Circleback inherits these protections as well. This ensures your access to Circleback remains just as secure as your company email. Additionally, when a member is deactivated on your team, they are signed out of Circleback on all devices. # Delete action item (/docs/api/action-items/delete-action-item) ## OpenAPI ```json { "info": { "description": "The Circleback public REST API provides programmatic access to your meetings, notes, action items, transcripts, and more. Authenticate every request by sending your API key as a bearer token.", "title": "Circleback Public API", "version": "1.0.0" }, "openapi": "3.2.0", "servers": [ { "url": "https://circleback.ai/api" } ], "components": { "securitySchemes": { "ApiKeyAuth": { "bearerFormat": "cb_", "scheme": "bearer", "type": "http" } } }, "tags": [ { "description": "Read and update action items captured from meetings.", "name": "Action items" } ], "paths": { "/action-item/{actionItemId}": { "delete": { "description": "Deletes an action item. Returns the deleted action item.", "parameters": [ { "description": "The unique identifier of the action item.", "in": "path", "name": "actionItemId", "required": true, "schema": { "exclusiveMinimum": 0, "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "additionalProperties": false, "example": { "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.", "status": "PENDING", "meetingIds": [ "WRweb12iCBimU6Vo8cD7z" ] }, "properties": { "id": { "description": "The unique identifier of the action item.", "exclusiveMinimum": 0, "type": "number" }, "title": { "description": "The title of the action item.", "type": "string" }, "description": { "description": "The detailed description of the action item.", "type": "string" }, "completedAt": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "The time the action item was marked as done, or null if it is not completed." }, "status": { "description": "The completion status of the action item.", "enum": [ "PENDING", "DONE" ], "type": "string" }, "meetingIds": { "description": "The IDs of the associated meetings you can access. Empty if the action item has no accessible meetings.", "items": { "type": "string" }, "type": "array" } }, "required": [ "id", "completedAt", "title", "description", "status", "meetingIds" ], "type": "object" } } }, "description": "Successful response." }, "400": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "code": { "description": "A machine-readable code identifying the type of failure.", "type": "string" }, "error": { "description": "A human-readable message explaining why the request failed.", "type": "string" }, "seatsToAdd": { "description": "The authoritative number of workspace seats required.", "exclusiveMinimum": 0, "type": "integer" }, "issues": { "description": "The field-level validation issues found in an invalid request.", "items": { "additionalProperties": false, "properties": { "message": { "description": "A human-readable explanation of the validation failure.", "type": "string" }, "path": { "description": "The location of the request field that failed validation.", "type": "string" } }, "required": [ "path", "message" ], "type": "object" }, "type": "array" } }, "required": [ "error" ], "type": "object" } } }, "description": "The request failed validation." }, "429": { "content": { "application/json": { "schema": { "$ref": "#/paths/~1action-item~1{actionItemId}/delete/responses/400/content/application~1json/schema" } } }, "description": "The request exceeded the rate limit for the account's plan, which the error message names: 3 requests per second and 20 per minute on Free, 20 per second and 300 per minute on Pro, Business, and Enterprise. Retry after the number of seconds in the `Retry-After` header." } }, "security": [ { "ApiKeyAuth": [] } ], "summary": "Delete action item", "tags": [ "Action items" ] } } } } ``` # Update action item (/docs/api/action-items/update-action-item) ## OpenAPI ```json { "info": { "description": "The Circleback public REST API provides programmatic access to your meetings, notes, action items, transcripts, and more. Authenticate every request by sending your API key as a bearer token.", "title": "Circleback Public API", "version": "1.0.0" }, "openapi": "3.2.0", "servers": [ { "url": "https://circleback.ai/api" } ], "components": { "securitySchemes": { "ApiKeyAuth": { "bearerFormat": "cb_", "scheme": "bearer", "type": "http" } } }, "tags": [ { "description": "Read and update action items captured from meetings.", "name": "Action items" } ], "paths": { "/action-item/{actionItemId}": { "put": { "description": "Updates the title, description, status, or assignee of an action item. Returns the updated action item.", "parameters": [ { "description": "The unique identifier of the action item.", "in": "path", "name": "actionItemId", "required": true, "schema": { "exclusiveMinimum": 0, "type": "integer" } } ], "requestBody": { "content": { "application/json": { "schema": { "properties": { "title": { "description": "The title of the action item.", "type": "string" }, "description": { "description": "The detailed description of the action item.", "type": "string" }, "assigneeProfileId": { "anyOf": [ { "exclusiveMinimum": 0, "type": "number" }, { "type": "null" } ], "description": "The ID of the profile to assign the action item to, or null to remove the assignee." }, "status": { "description": "The completion status of the action item.", "enum": [ "PENDING", "DONE" ], "type": "string" } }, "type": "object" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "additionalProperties": false, "example": { "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.", "status": "PENDING", "meetingIds": [ "WRweb12iCBimU6Vo8cD7z" ] }, "properties": { "id": { "description": "The unique identifier of the action item.", "exclusiveMinimum": 0, "type": "number" }, "title": { "description": "The title of the action item.", "type": "string" }, "description": { "description": "The detailed description of the action item.", "type": "string" }, "completedAt": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "The time the action item was marked as done, or null if it is not completed." }, "status": { "description": "The completion status of the action item.", "enum": [ "PENDING", "DONE" ], "type": "string" }, "meetingIds": { "description": "The IDs of the associated meetings you can access. Empty if the action item has no accessible meetings.", "items": { "type": "string" }, "type": "array" } }, "required": [ "id", "completedAt", "title", "description", "status", "meetingIds" ], "type": "object" } } }, "description": "Successful response." }, "400": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "code": { "description": "A machine-readable code identifying the type of failure.", "type": "string" }, "error": { "description": "A human-readable message explaining why the request failed.", "type": "string" }, "seatsToAdd": { "description": "The authoritative number of workspace seats required.", "exclusiveMinimum": 0, "type": "integer" }, "issues": { "description": "The field-level validation issues found in an invalid request.", "items": { "additionalProperties": false, "properties": { "message": { "description": "A human-readable explanation of the validation failure.", "type": "string" }, "path": { "description": "The location of the request field that failed validation.", "type": "string" } }, "required": [ "path", "message" ], "type": "object" }, "type": "array" } }, "required": [ "error" ], "type": "object" } } }, "description": "The request failed validation." }, "429": { "content": { "application/json": { "schema": { "$ref": "#/paths/~1action-item~1{actionItemId}/put/responses/400/content/application~1json/schema" } } }, "description": "The request exceeded the rate limit for the account's plan, which the error message names: 3 requests per second and 20 per minute on Free, 20 per second and 300 per minute on Pro, Business, and Enterprise. Retry after the number of seconds in the `Retry-After` header." } }, "security": [ { "ApiKeyAuth": [] } ], "summary": "Update action item", "tags": [ "Action items" ] } } } } ``` # List action items (/docs/api/action-items/list-action-items) ## OpenAPI ```json { "info": { "description": "The Circleback public REST API provides programmatic access to your meetings, notes, action items, transcripts, and more. Authenticate every request by sending your API key as a bearer token.", "title": "Circleback Public API", "version": "1.0.0" }, "openapi": "3.2.0", "servers": [ { "url": "https://circleback.ai/api" } ], "components": { "securitySchemes": { "ApiKeyAuth": { "bearerFormat": "cb_", "scheme": "bearer", "type": "http" } } }, "tags": [ { "description": "Read and update action items captured from meetings.", "name": "Action items" } ], "paths": { "/action-items": { "get": { "description": "Returns a page of action items across the authenticated user's meetings, filtered by assignee, status, tags, and attendees.", "parameters": [ { "description": "Cursor for the next page. Omit for the first page (RFC 8288).", "in": "query", "name": "cursor", "required": false, "schema": { "type": "string" } }, { "description": "The assignee scope to filter by. Defaults to Me.", "in": "query", "name": "assigneeType", "required": false, "schema": { "default": "Me", "enum": [ "Me", "NotMe", "Profile", "MyWorkspace", "OutsideMyWorkspace", "Unassigned", "Anyone" ], "type": "string" } }, { "description": "Profile ID of the assignee to filter by.", "in": "query", "name": "assigneeProfileId", "required": false, "schema": { "exclusiveMinimum": 0, "type": "integer" } }, { "description": "Team ID of the assignee to filter by.", "in": "query", "name": "assigneeTeamId", "required": false, "schema": { "exclusiveMinimum": 0, "type": "integer" } }, { "description": "Completion status to filter by. Defaults to incomplete action items.", "in": "query", "name": "status", "required": false, "schema": { "type": "string" } }, { "description": "Profile IDs of meeting attendees to filter by.", "in": "query", "name": "attendeeProfileIds", "required": false, "schema": { "items": { "type": "string" }, "type": "array" } }, { "description": "Tag IDs to filter by.", "in": "query", "name": "tagIds", "required": false, "schema": { "items": { "type": "string" }, "type": "array" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "description": "The action items that match the query.", "example": [ { "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": { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com" }, "status": "PENDING", "meetingIds": [ "WRweb12iCBimU6Vo8cD7z" ] }, { "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", "meetingIds": [ "WRweb12iCBimU6Vo8cD7z" ] } ], "items": { "additionalProperties": false, "properties": { "id": { "description": "The unique identifier of the action item.", "exclusiveMinimum": 0, "type": "number" }, "title": { "description": "The title of the action item.", "type": "string" }, "description": { "description": "The detailed description of the action item.", "type": "string" }, "assignee": { "description": "Action item assignee, or null if unassigned.", "anyOf": [ { "additionalProperties": false, "properties": { "profileId": { "description": "The unique identifier of the person's profile.", "exclusiveMinimum": 0, "type": "number" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's full name." }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's job title." }, "companyName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The name of the company the person belongs to." }, "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's email address." } }, "required": [ "profileId", "name", "email", "title", "companyName" ], "type": "object" }, { "type": "null" } ], "example": { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com" } }, "canEditActionItem": { "type": "boolean" }, "completedAt": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "The time the action item was marked as done, or null if it is not completed." }, "status": { "description": "The completion status of the action item.", "enum": [ "PENDING", "DONE" ], "type": "string" }, "meetingIds": { "description": "The IDs of the associated meetings you can access. Empty if the action item has no accessible meetings.", "items": { "type": "string" }, "type": "array" }, "meetings": { "items": { "additionalProperties": false, "properties": { "id": { "description": "Circleback meeting ID. Can be used to generate a link to the meeting (`https://circleback.ai/meetings/${id}`).", "type": "string" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Meeting name." }, "createdAt": { "description": "Meeting creation date, formatted as an ISO 8601 timestamp.", "format": "date-time", "type": "string" } }, "required": [ "createdAt", "id", "name" ], "type": "object" }, "type": "array" } }, "required": [ "id", "completedAt", "title", "description", "status", "meetingIds", "assignee" ], "type": "object" }, "type": "array" } } }, "description": "Successful response." }, "400": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "code": { "description": "A machine-readable code identifying the type of failure.", "type": "string" }, "error": { "description": "A human-readable message explaining why the request failed.", "type": "string" }, "seatsToAdd": { "description": "The authoritative number of workspace seats required.", "exclusiveMinimum": 0, "type": "integer" }, "issues": { "description": "The field-level validation issues found in an invalid request.", "items": { "additionalProperties": false, "properties": { "message": { "description": "A human-readable explanation of the validation failure.", "type": "string" }, "path": { "description": "The location of the request field that failed validation.", "type": "string" } }, "required": [ "path", "message" ], "type": "object" }, "type": "array" } }, "required": [ "error" ], "type": "object" } } }, "description": "The request failed validation." }, "429": { "content": { "application/json": { "schema": { "$ref": "#/paths/~1action-items/get/responses/400/content/application~1json/schema" } } }, "description": "The request exceeded the rate limit for the account's plan, which the error message names: 3 requests per second and 20 per minute on Free, 20 per second and 300 per minute on Pro, Business, and Enterprise. Retry after the number of seconds in the `Retry-After` header." } }, "security": [ { "ApiKeyAuth": [] } ], "summary": "List action items", "tags": [ "Action items" ] } } } } ``` # Create action item (/docs/api/action-items/create-action-item) ## OpenAPI ```json { "info": { "description": "The Circleback public REST API provides programmatic access to your meetings, notes, action items, transcripts, and more. Authenticate every request by sending your API key as a bearer token.", "title": "Circleback Public API", "version": "1.0.0" }, "openapi": "3.2.0", "servers": [ { "url": "https://circleback.ai/api" } ], "components": { "securitySchemes": { "ApiKeyAuth": { "bearerFormat": "cb_", "scheme": "bearer", "type": "http" } } }, "tags": [ { "description": "Read and update action items captured from meetings.", "name": "Action items" } ], "paths": { "/action-items": { "post": { "description": "Creates an unassigned action item owned by the authenticated user without linking it to a meeting.", "requestBody": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "title": { "description": "The title of the action item.", "minLength": 1, "type": "string" }, "description": { "default": "", "description": "The detailed description of the action item.", "type": "string" } }, "required": [ "title" ], "type": "object" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "id": { "description": "The unique identifier of the action item.", "exclusiveMinimum": 0, "type": "number" }, "title": { "description": "The title of the action item.", "type": "string" }, "description": { "description": "The detailed description of the action item.", "type": "string" }, "assignee": { "description": "Action item assignee, or null if unassigned.", "anyOf": [ { "additionalProperties": false, "properties": { "profileId": { "description": "The unique identifier of the person's profile.", "exclusiveMinimum": 0, "type": "number" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's full name." }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's job title." }, "companyName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The name of the company the person belongs to." }, "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's email address." } }, "required": [ "profileId", "name", "email", "title", "companyName" ], "type": "object" }, { "type": "null" } ], "example": { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com" } }, "canEditActionItem": { "type": "boolean" }, "completedAt": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "The time the action item was marked as done, or null if it is not completed." }, "status": { "description": "The completion status of the action item.", "enum": [ "PENDING", "DONE" ], "type": "string" }, "meetingIds": { "description": "The IDs of the associated meetings you can access. Empty if the action item has no accessible meetings.", "items": { "type": "string" }, "type": "array" }, "meetings": { "items": { "additionalProperties": false, "properties": { "id": { "description": "Circleback meeting ID. Can be used to generate a link to the meeting (`https://circleback.ai/meetings/${id}`).", "type": "string" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Meeting name." }, "createdAt": { "description": "Meeting creation date, formatted as an ISO 8601 timestamp.", "format": "date-time", "type": "string" } }, "required": [ "createdAt", "id", "name" ], "type": "object" }, "type": "array" } }, "required": [ "id", "completedAt", "title", "description", "status", "meetingIds", "assignee" ], "type": "object" } } }, "description": "Successful response." }, "400": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "code": { "description": "A machine-readable code identifying the type of failure.", "type": "string" }, "error": { "description": "A human-readable message explaining why the request failed.", "type": "string" }, "seatsToAdd": { "description": "The authoritative number of workspace seats required.", "exclusiveMinimum": 0, "type": "integer" }, "issues": { "description": "The field-level validation issues found in an invalid request.", "items": { "additionalProperties": false, "properties": { "message": { "description": "A human-readable explanation of the validation failure.", "type": "string" }, "path": { "description": "The location of the request field that failed validation.", "type": "string" } }, "required": [ "path", "message" ], "type": "object" }, "type": "array" } }, "required": [ "error" ], "type": "object" } } }, "description": "The request failed validation." }, "429": { "content": { "application/json": { "schema": { "$ref": "#/paths/~1action-items/post/responses/400/content/application~1json/schema" } } }, "description": "The request exceeded the rate limit for the account's plan, which the error message names: 3 requests per second and 20 per minute on Free, 20 per second and 300 per minute on Pro, Business, and Enterprise. Retry after the number of seconds in the `Retry-After` header." } }, "security": [ { "ApiKeyAuth": [] } ], "summary": "Create action item", "tags": [ "Action items" ] } } } } ``` # List calendar events (/docs/api/calendar/list-calendar-events) ## OpenAPI ```json { "info": { "description": "The Circleback public REST API provides programmatic access to your meetings, notes, action items, transcripts, and more. Authenticate every request by sending your API key as a bearer token.", "title": "Circleback Public API", "version": "1.0.0" }, "openapi": "3.2.0", "servers": [ { "url": "https://circleback.ai/api" } ], "components": { "securitySchemes": { "ApiKeyAuth": { "bearerFormat": "cb_", "scheme": "bearer", "type": "http" } } }, "tags": [ { "description": "View upcoming calendar events and control whether Circleback joins them.", "name": "Calendar" } ], "paths": { "/calendar/events": { "get": { "description": "Returns upcoming calendar events from the authenticated user's connected calendars, with pagination and a configurable time window.", "parameters": [ { "description": "Cursor for the next page. Omit for the first page (RFC 8288).", "in": "query", "name": "cursor", "required": false, "schema": { "type": "string" } }, { "description": "Set to true to include calendar meetings that have no meeting link and only one attendee.", "in": "query", "name": "includeOfflineSingleAttendee", "required": false, "schema": { "type": "boolean" } }, { "description": "How many hours in the past to include calendar meetings from, based on their start time.", "in": "query", "name": "startTimeLookbackHours", "required": false, "schema": { "type": "number" } }, { "description": "How many hours in the future to include calendar meetings from, based on their start time.", "in": "query", "name": "startTimeLookaheadHours", "required": false, "schema": { "type": "number" } }, { "description": "The direction calendar meetings are sorted in by start time. Defaults to ascending.", "in": "query", "name": "sortDirection", "required": false, "schema": { "enum": [ "ascending", "descending" ], "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "items": { "additionalProperties": false, "example": { "id": "google-calendar-event-id", "title": "Event Venue Review", "icalUid": "event-venue-review@google.com", "attendees": [ { "name": "John Appleseed", "email": "john@initech.com", "isOrganizer": true, "status": "accepted" }, { "name": "Samantha Grey", "email": "samantha@initech.com", "isOrganizer": false, "status": "accepted" } ], "calendarDescription": "Quarterly venue review", "calendarPlatform": "google_calendar", "endTime": "2023-07-25T20:30:00.000Z", "isExternal": false, "isHostedByMe": true, "location": "Google Meet", "meetingId": "WRweb12iCBimU6Vo8cD7z", "meetingPlatform": "google_meet", "organizerEmail": "john@initech.com", "overrideShouldRecord": false, "platform": "google_meet", "startTime": "2023-07-25T20:00:00.000Z", "willRecord": true, "willRecordReason": "External attendees" }, "properties": { "id": { "description": "The unique identifier of the calendar meeting.", "type": "string" }, "title": { "description": "The title of the calendar meeting.", "type": "string" }, "icalUid": { "description": "The iCalendar UID of the calendar event.", "type": "string" }, "attendees": { "description": "The attendees invited to the calendar meeting.", "items": { "additionalProperties": false, "properties": { "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The name of the attendee." }, "email": { "description": "The email address of the attendee.", "type": "string" }, "isOrganizer": { "description": "Whether the attendee organized the calendar meeting.", "type": "boolean" }, "status": { "description": "The attendee's response to the calendar meeting invitation.", "enum": [ "accepted", "declined", "tentative", "not_available" ], "type": "string" } }, "type": "object" }, "type": "array" }, "calendarDescription": { "description": "The description of the calendar event.", "type": "string" }, "calendarPlatform": { "description": "The calendar platform the meeting was synced from.", "type": "string" }, "endTime": { "description": "When the calendar meeting ends, as an ISO 8601 timestamp.", "type": "string" }, "isExternal": { "description": "Whether the meeting includes attendees from more than one email domain.", "type": "boolean" }, "isHostedByMe": { "description": "Whether the current user organized the calendar meeting.", "type": "boolean" }, "location": { "description": "The location of the calendar meeting.", "type": "string" }, "meetingId": { "description": "The Circleback meeting associated with the calendar meeting, when one exists.", "type": "string" }, "meetingPlatform": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The conferencing platform hosting the meeting, when detected." }, "organizerEmail": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The email address of the meeting organizer." }, "overrideShouldRecord": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "description": "Whether the user manually overrode the automatic recording decision, or null when no override is set." }, "platform": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The conferencing platform hosting the meeting, when detected. Alias of meetingPlatform." }, "recurringEventId": { "description": "The identifier of the recurring event series the meeting belongs to.", "type": "string" }, "startTime": { "description": "When the calendar meeting starts, as an ISO 8601 timestamp.", "type": "string" }, "willRecord": { "description": "Whether the notetaker will join and record the meeting.", "type": "boolean" }, "willRecordReason": { "description": "A human-readable explanation of why the meeting will or will not be recorded.", "type": "string" } }, "required": [ "id", "overrideShouldRecord", "title", "willRecord", "willRecordReason", "startTime", "endTime", "platform", "meetingPlatform", "calendarPlatform", "isExternal", "isHostedByMe", "organizerEmail", "attendees", "icalUid" ], "type": "object" }, "type": "array" } } }, "description": "Successful response." }, "400": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "code": { "description": "A machine-readable code identifying the type of failure.", "type": "string" }, "error": { "description": "A human-readable message explaining why the request failed.", "type": "string" }, "seatsToAdd": { "description": "The authoritative number of workspace seats required.", "exclusiveMinimum": 0, "type": "integer" }, "issues": { "description": "The field-level validation issues found in an invalid request.", "items": { "additionalProperties": false, "properties": { "message": { "description": "A human-readable explanation of the validation failure.", "type": "string" }, "path": { "description": "The location of the request field that failed validation.", "type": "string" } }, "required": [ "path", "message" ], "type": "object" }, "type": "array" } }, "required": [ "error" ], "type": "object" } } }, "description": "The request failed validation." }, "429": { "content": { "application/json": { "schema": { "$ref": "#/paths/~1calendar~1events/get/responses/400/content/application~1json/schema" } } }, "description": "The request exceeded the rate limit for the account's plan, which the error message names: 3 requests per second and 20 per minute on Free, 20 per second and 300 per minute on Pro, Business, and Enterprise. Retry after the number of seconds in the `Retry-After` header." } }, "security": [ { "ApiKeyAuth": [] } ], "summary": "List calendar events", "tags": [ "Calendar" ] } } } } ``` # List companies (/docs/api/companies/list-companies) ## OpenAPI ```json { "info": { "description": "The Circleback public REST API provides programmatic access to your meetings, notes, action items, transcripts, and more. Authenticate every request by sending your API key as a bearer token.", "title": "Circleback Public API", "version": "1.0.0" }, "openapi": "3.2.0", "servers": [ { "url": "https://circleback.ai/api" } ], "components": { "securitySchemes": { "ApiKeyAuth": { "bearerFormat": "cb_", "scheme": "bearer", "type": "http" } } }, "tags": [ { "description": "Look up the companies associated with your meetings.", "name": "Companies" } ], "paths": { "/companies": { "get": { "description": "Returns the companies whose people attend the authenticated user's meetings, with optional tag filters.", "parameters": [ { "description": "Cursor for the next page. Omit for the first page (RFC 8288).", "in": "query", "name": "cursor", "required": false, "schema": { "type": "string" } }, { "description": "Filter companies to those with meetings that have these tag IDs.", "in": "query", "name": "tagIds", "required": false, "schema": { "items": { "exclusiveMinimum": 0, "type": "integer" }, "type": "array" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "items": { "additionalProperties": false, "example": { "name": "Initech", "avatarUrl": "https://logo.clearbit.com/initech.com", "domain": "initech.com" }, "properties": { "id": { "description": "The unique identifier of the company.", "exclusiveMinimum": 0, "type": "number" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The company's name." }, "avatarUrl": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The URL of the company's logo image." }, "domain": { "description": "The company's website domain.", "type": "string" } }, "required": [ "domain" ], "type": "object" }, "type": "array" } } }, "description": "Successful response." }, "400": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "code": { "description": "A machine-readable code identifying the type of failure.", "type": "string" }, "error": { "description": "A human-readable message explaining why the request failed.", "type": "string" }, "seatsToAdd": { "description": "The authoritative number of workspace seats required.", "exclusiveMinimum": 0, "type": "integer" }, "issues": { "description": "The field-level validation issues found in an invalid request.", "items": { "additionalProperties": false, "properties": { "message": { "description": "A human-readable explanation of the validation failure.", "type": "string" }, "path": { "description": "The location of the request field that failed validation.", "type": "string" } }, "required": [ "path", "message" ], "type": "object" }, "type": "array" } }, "required": [ "error" ], "type": "object" } } }, "description": "The request failed validation." }, "429": { "content": { "application/json": { "schema": { "$ref": "#/paths/~1companies/get/responses/400/content/application~1json/schema" } } }, "description": "The request exceeded the rate limit for the account's plan, which the error message names: 3 requests per second and 20 per minute on Free, 20 per second and 300 per minute on Pro, Business, and Enterprise. Retry after the number of seconds in the `Retry-After` header." } }, "security": [ { "ApiKeyAuth": [] } ], "summary": "List companies", "tags": [ "Companies" ] } } } } ``` # Get company (/docs/api/companies/get-company) ## OpenAPI ```json { "info": { "description": "The Circleback public REST API provides programmatic access to your meetings, notes, action items, transcripts, and more. Authenticate every request by sending your API key as a bearer token.", "title": "Circleback Public API", "version": "1.0.0" }, "openapi": "3.2.0", "servers": [ { "url": "https://circleback.ai/api" } ], "components": { "securitySchemes": { "ApiKeyAuth": { "bearerFormat": "cb_", "scheme": "bearer", "type": "http" } } }, "tags": [ { "description": "Look up the companies associated with your meetings.", "name": "Companies" } ], "paths": { "/company/{domain}": { "get": { "description": "Returns a company by its domain, including its people and external links.", "parameters": [ { "description": "The domain of the company to fetch.", "in": "path", "name": "domain", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "additionalProperties": false, "example": { "name": "Initech", "avatarUrl": "https://logo.clearbit.com/initech.com", "domain": "initech.com", "externalLinks": [ { "url": "https://initech.com", "objectType": "company", "type": "website" } ], "people": [ { "id": 1, "title": "Head of Operations", "companyId": 3, "companyName": "Initech", "email": "john@initech.com", "firstName": "John", "lastName": "Appleseed" }, { "id": 2, "title": "Office Manager", "companyId": 3, "companyName": "Initech", "email": "samantha@initech.com", "firstName": "Samantha", "lastName": "Grey" } ] }, "properties": { "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The company's name." }, "avatarUrl": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The URL of the company's logo image." }, "domain": { "description": "The company's website domain.", "type": "string" }, "externalLinks": { "description": "Links to the company on external platforms and connected integrations.", "items": { "additionalProperties": false, "properties": { "url": { "description": "The URL of the external resource.", "type": "string" }, "objectType": { "description": "Whether the link refers to a person or a company.", "enum": [ "person", "company" ], "type": "string" }, "type": { "description": "The platform or integration the link points to.", "enum": [ "Attio", "HubSpot", "Linear", "Salesforce", "Zoho", "linkedin", "facebook", "instagram", "twitter", "website" ], "type": "string" } }, "required": [ "type", "objectType", "url" ], "type": "object" }, "type": "array" }, "people": { "description": "People at the company you have met with.", "items": { "additionalProperties": false, "example": { "id": 1, "title": "Head of Operations", "companyId": 3, "companyName": "Initech", "email": "john@initech.com", "firstName": "John", "lastName": "Appleseed" }, "properties": { "id": { "description": "The unique identifier of the person.", "exclusiveMinimum": 0, "type": "number" }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's job title." }, "companyId": { "anyOf": [ { "exclusiveMinimum": 0, "type": "number" }, { "type": "null" } ], "description": "The unique identifier of the company the person belongs to." }, "companyName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The name of the company the person belongs to." }, "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's email address." }, "firstName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's first name." }, "lastName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's last name." } }, "required": [ "id", "email", "firstName", "lastName", "title", "companyName", "companyId" ], "type": "object" }, "type": "array" } }, "required": [ "domain", "people", "externalLinks" ], "type": "object" } } }, "description": "Successful response." }, "400": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "code": { "description": "A machine-readable code identifying the type of failure.", "type": "string" }, "error": { "description": "A human-readable message explaining why the request failed.", "type": "string" }, "seatsToAdd": { "description": "The authoritative number of workspace seats required.", "exclusiveMinimum": 0, "type": "integer" }, "issues": { "description": "The field-level validation issues found in an invalid request.", "items": { "additionalProperties": false, "properties": { "message": { "description": "A human-readable explanation of the validation failure.", "type": "string" }, "path": { "description": "The location of the request field that failed validation.", "type": "string" } }, "required": [ "path", "message" ], "type": "object" }, "type": "array" } }, "required": [ "error" ], "type": "object" } } }, "description": "The request failed validation." }, "429": { "content": { "application/json": { "schema": { "$ref": "#/paths/~1company~1{domain}/get/responses/400/content/application~1json/schema" } } }, "description": "The request exceeded the rate limit for the account's plan, which the error message names: 3 requests per second and 20 per minute on Free, 20 per second and 300 per minute on Pro, Business, and Enterprise. Retry after the number of seconds in the `Retry-After` header." } }, "security": [ { "ApiKeyAuth": [] } ], "summary": "Get company", "tags": [ "Companies" ] } } } } ``` # Get meeting (/docs/api/meetings/get-meeting) ## OpenAPI ```json { "info": { "description": "The Circleback public REST API provides programmatic access to your meetings, notes, action items, transcripts, and more. Authenticate every request by sending your API key as a bearer token.", "title": "Circleback Public API", "version": "1.0.0" }, "openapi": "3.2.0", "servers": [ { "url": "https://circleback.ai/api" } ], "components": { "securitySchemes": { "ApiKeyAuth": { "bearerFormat": "cb_", "scheme": "bearer", "type": "http" } } }, "tags": [ { "description": "Access meetings along with their notes, transcripts, attendees, recordings, and search.", "name": "Meetings" } ], "paths": { "/meeting/{meetingId}": { "get": { "description": "Returns a meeting by its ID, including the notes, attendees, and recording details the caller has permission to view.", "parameters": [ { "description": "The unique identifier of the meeting.", "in": "path", "name": "meetingId", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "additionalProperties": false, "example": { "id": "WRweb12iCBimU6Vo8cD7z", "name": "Event Venue Review", "createdAt": "2023-07-25T20:30:57.926Z", "updatedAt": "2023-07-25T20:30:57.926Z", "duration": 1306.09, "url": "https://meet.google.com/abc-defgh-xyz", "recordingUrl": "https://storage.googleapis.com/circleback-recordings/WRweb12iCBimU6Vo8cD7z.mp4", "tags": [ { "id": 1, "name": "Events", "description": "Company events and offsites." } ], "icalUid": "event-venue-review@google.com", "attendees": [ { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com", "isCalendarEventOrganizer": true, "isCalendarInvitee": true }, { "profileId": 2, "name": "Samantha Grey", "title": "Office Manager", "companyName": "Initech", "email": "samantha@initech.com", "isCalendarEventOrganizer": false, "isCalendarInvitee": true } ], "notes": "#### Overview\n* Several options for event venues were reviewed…", "privateNotes": "Ask Samantha about the Sunriver deposit before Friday.", "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": { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com" }, "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" } ], "insights": { "Customer details": [ { "speaker": "John Appleseed", "timestamp": 800, "insight": { "Company name": "Initech", "Number of employees": 120 } } ], "Questions": [ { "insight": "Is this thing on?", "speaker": "Samantha Grey", "timestamp": 49.15 }, { "insight": "When will the webhook integration be ready?", "speaker": "John Appleseed", "timestamp": 120.12 } ] }, "linkAccess": "Viewer", "calendarEvent": { "id": 91, "icalUid": "event-venue-review@google.com", "description": "Quarterly venue review", "platform": "GoogleCalendar", "platformId": "provider-event-id" } }, "properties": { "id": { "description": "Circleback meeting ID. Can be used to generate a link to the meeting (`https://circleback.ai/meetings/${id}`).", "type": "string" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Meeting name." }, "createdAt": { "description": "Meeting creation date, formatted as an ISO 8601 timestamp.", "format": "date-time", "type": "string" }, "updatedAt": { "description": "When the meeting was last updated.", "format": "date-time", "type": "string" }, "duration": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Meeting duration in seconds." }, "url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "URL of the virtual meeting (Zoom, Google Meet, or Microsoft Teams)." }, "recordingUrl": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "URL of the meeting recording file. Only valid for 24 hours, and only available if saving meeting recordings is enabled in settings." }, "tags": { "description": "Tags added to the meeting.", "items": { "additionalProperties": false, "properties": { "id": { "description": "The unique identifier of the tag.", "exclusiveMinimum": 0, "type": "number" }, "name": { "description": "The display name of the tag.", "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "A description of the tag." } }, "required": [ "id", "name", "description" ], "type": "object" }, "type": "array" }, "icalUid": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Unique identifier of the calendar event associated with the meeting." }, "attendees": { "description": "Meeting attendees.", "items": { "additionalProperties": false, "properties": { "profileId": { "description": "The unique identifier of the person's profile.", "exclusiveMinimum": 0, "type": "number" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Calendar event invitee name if associated with a calendar event, or the name of the meeting participant." }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's job title." }, "companyName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The name of the company the person belongs to." }, "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Calendar event invitee email if associated with a calendar event." }, "isCalendarEventOrganizer": { "description": "Whether the attendee organized the calendar event.", "type": "boolean" }, "isCalendarInvitee": { "description": "Whether the attendee was invited on the calendar event.", "type": "boolean" } }, "required": [ "profileId", "name", "email", "title", "companyName", "isCalendarInvitee", "isCalendarEventOrganizer" ], "type": "object" }, "type": "array" }, "notes": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Circleback meeting notes with Markdown formatting." }, "privateNotes": { "description": "The authenticated user's private notes for the meeting.", "type": "string" }, "actionItems": { "description": "Action items created for the meeting.", "items": { "additionalProperties": false, "properties": { "id": { "description": "Circleback action item ID.", "exclusiveMinimum": 0, "type": "number" }, "title": { "description": "Action item title.", "type": "string" }, "description": { "description": "Action item description.", "type": "string" }, "assignee": { "description": "Action item assignee, or null if unassigned.", "anyOf": [ { "additionalProperties": false, "properties": { "profileId": { "description": "The unique identifier of the person's profile.", "exclusiveMinimum": 0, "type": "number" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's full name." }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's job title." }, "companyName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The name of the company the person belongs to." }, "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's email address." } }, "required": [ "profileId", "name", "email", "title", "companyName" ], "type": "object" }, { "type": "null" } ], "example": { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com" } }, "status": { "description": "Action item status, one of 'PENDING' or 'DONE'.", "enum": [ "PENDING", "DONE" ], "type": "string" } }, "required": [ "id", "title", "description", "status", "assignee" ], "type": "object" }, "type": "array" }, "insights": { "additionalProperties": { "items": { "additionalProperties": false, "properties": { "speaker": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Speaker the insight is associated with, if any." }, "timestamp": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Timestamp in seconds the insight is associated with, if any." }, "insight": { "anyOf": [ { "type": "string" }, { "additionalProperties": { "anyOf": [ { "type": "string" }, { "type": "number" }, { "type": "boolean" }, { "type": "null" } ] }, "propertyNames": { "type": "string" }, "type": "object" } ], "description": "The insight result. A string, or an object when the insight has custom fields." } }, "required": [ "speaker", "timestamp", "insight" ], "type": "object" }, "type": "array" }, "description": "Insight results for the meeting, keyed by the name of the user-created insight.", "propertyNames": { "type": "string" }, "type": "object" }, "linkAccess": { "anyOf": [ { "enum": [ "Editor", "Viewer", "LimitedViewer" ], "type": "string" }, { "type": "null" } ], "description": "Who can access the meeting through its shareable link." }, "calendarEvent": { "anyOf": [ { "additionalProperties": false, "properties": { "id": { "description": "The unique identifier of the calendar event.", "exclusiveMinimum": 0, "type": "number" }, "icalUid": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The iCalendar unique identifier of the event." }, "description": { "description": "The description of the calendar event.", "type": "string" }, "platform": { "anyOf": [ { "enum": [ "GoogleCalendar", "MicrosoftOutlook" ], "type": "string" }, { "type": "null" } ], "description": "The calendar platform the event comes from." }, "platformId": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The unique identifier of the event on the calendar platform." } }, "required": [ "id", "platform", "platformId", "description", "icalUid" ], "type": "object" }, { "type": "null" } ] } }, "required": [ "id", "linkAccess", "url", "createdAt", "updatedAt", "duration", "name", "notes", "icalUid", "recordingUrl", "tags", "attendees", "actionItems", "insights", "calendarEvent", "privateNotes" ], "type": "object" } } }, "description": "Successful response." }, "400": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "code": { "description": "A machine-readable code identifying the type of failure.", "type": "string" }, "error": { "description": "A human-readable message explaining why the request failed.", "type": "string" }, "seatsToAdd": { "description": "The authoritative number of workspace seats required.", "exclusiveMinimum": 0, "type": "integer" }, "issues": { "description": "The field-level validation issues found in an invalid request.", "items": { "additionalProperties": false, "properties": { "message": { "description": "A human-readable explanation of the validation failure.", "type": "string" }, "path": { "description": "The location of the request field that failed validation.", "type": "string" } }, "required": [ "path", "message" ], "type": "object" }, "type": "array" } }, "required": [ "error" ], "type": "object" } } }, "description": "The request failed validation." }, "429": { "content": { "application/json": { "schema": { "$ref": "#/paths/~1meeting~1{meetingId}/get/responses/400/content/application~1json/schema" } } }, "description": "The request exceeded the rate limit for the account's plan, which the error message names: 3 requests per second and 20 per minute on Free, 20 per second and 300 per minute on Pro, Business, and Enterprise. Retry after the number of seconds in the `Retry-After` header." } }, "security": [ { "ApiKeyAuth": [] }, {} ], "summary": "Get meeting", "tags": [ "Meetings" ] } } } } ``` # Delete meeting (/docs/api/meetings/delete-meeting) ## OpenAPI ```json { "info": { "description": "The Circleback public REST API provides programmatic access to your meetings, notes, action items, transcripts, and more. Authenticate every request by sending your API key as a bearer token.", "title": "Circleback Public API", "version": "1.0.0" }, "openapi": "3.2.0", "servers": [ { "url": "https://circleback.ai/api" } ], "components": { "securitySchemes": { "ApiKeyAuth": { "bearerFormat": "cb_", "scheme": "bearer", "type": "http" } } }, "tags": [ { "description": "Access meetings along with their notes, transcripts, attendees, recordings, and search.", "name": "Meetings" } ], "paths": { "/meeting/{meetingId}": { "delete": { "description": "Deletes a meeting. Only the owner of the meeting can delete it. Returns the deleted meeting.", "parameters": [ { "description": "The unique identifier of the meeting.", "in": "path", "name": "meetingId", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "additionalProperties": false, "example": { "id": "WRweb12iCBimU6Vo8cD7z", "name": "Event Venue Review", "createdAt": "2023-07-25T20:30:57.926Z", "updatedAt": "2023-07-25T20:30:57.926Z", "duration": 1306.09, "url": "https://meet.google.com/abc-defgh-xyz", "recordingUrl": "https://storage.googleapis.com/circleback-recordings/WRweb12iCBimU6Vo8cD7z.mp4", "tags": [ { "id": 1, "name": "Events", "description": "Company events and offsites." } ], "icalUid": "event-venue-review@google.com", "attendees": [ { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com", "isCalendarEventOrganizer": true, "isCalendarInvitee": true }, { "profileId": 2, "name": "Samantha Grey", "title": "Office Manager", "companyName": "Initech", "email": "samantha@initech.com", "isCalendarEventOrganizer": false, "isCalendarInvitee": true } ], "notes": "#### Overview\n* Several options for event venues were reviewed…", "privateNotes": "Ask Samantha about the Sunriver deposit before Friday.", "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": { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com" }, "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" } ], "insights": { "Customer details": [ { "speaker": "John Appleseed", "timestamp": 800, "insight": { "Company name": "Initech", "Number of employees": 120 } } ], "Questions": [ { "insight": "Is this thing on?", "speaker": "Samantha Grey", "timestamp": 49.15 }, { "insight": "When will the webhook integration be ready?", "speaker": "John Appleseed", "timestamp": 120.12 } ] }, "linkAccess": "Viewer", "calendarEvent": { "id": 91, "icalUid": "event-venue-review@google.com", "description": "Quarterly venue review", "platform": "GoogleCalendar", "platformId": "provider-event-id" } }, "properties": { "id": { "description": "Circleback meeting ID. Can be used to generate a link to the meeting (`https://circleback.ai/meetings/${id}`).", "type": "string" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Meeting name." }, "createdAt": { "description": "Meeting creation date, formatted as an ISO 8601 timestamp.", "format": "date-time", "type": "string" }, "updatedAt": { "description": "When the meeting was last updated.", "format": "date-time", "type": "string" }, "duration": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Meeting duration in seconds." }, "url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "URL of the virtual meeting (Zoom, Google Meet, or Microsoft Teams)." }, "recordingUrl": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "URL of the meeting recording file. Only valid for 24 hours, and only available if saving meeting recordings is enabled in settings." }, "tags": { "description": "Tags added to the meeting.", "items": { "additionalProperties": false, "properties": { "id": { "description": "The unique identifier of the tag.", "exclusiveMinimum": 0, "type": "number" }, "name": { "description": "The display name of the tag.", "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "A description of the tag." } }, "required": [ "id", "name", "description" ], "type": "object" }, "type": "array" }, "icalUid": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Unique identifier of the calendar event associated with the meeting." }, "attendees": { "description": "Meeting attendees.", "items": { "additionalProperties": false, "properties": { "profileId": { "description": "The unique identifier of the person's profile.", "exclusiveMinimum": 0, "type": "number" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Calendar event invitee name if associated with a calendar event, or the name of the meeting participant." }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's job title." }, "companyName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The name of the company the person belongs to." }, "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Calendar event invitee email if associated with a calendar event." }, "isCalendarEventOrganizer": { "description": "Whether the attendee organized the calendar event.", "type": "boolean" }, "isCalendarInvitee": { "description": "Whether the attendee was invited on the calendar event.", "type": "boolean" } }, "required": [ "profileId", "name", "email", "title", "companyName", "isCalendarInvitee", "isCalendarEventOrganizer" ], "type": "object" }, "type": "array" }, "notes": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Circleback meeting notes with Markdown formatting." }, "privateNotes": { "description": "The authenticated user's private notes for the meeting.", "type": "string" }, "actionItems": { "description": "Action items created for the meeting.", "items": { "additionalProperties": false, "properties": { "id": { "description": "Circleback action item ID.", "exclusiveMinimum": 0, "type": "number" }, "title": { "description": "Action item title.", "type": "string" }, "description": { "description": "Action item description.", "type": "string" }, "assignee": { "description": "Action item assignee, or null if unassigned.", "anyOf": [ { "additionalProperties": false, "properties": { "profileId": { "description": "The unique identifier of the person's profile.", "exclusiveMinimum": 0, "type": "number" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's full name." }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's job title." }, "companyName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The name of the company the person belongs to." }, "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's email address." } }, "required": [ "profileId", "name", "email", "title", "companyName" ], "type": "object" }, { "type": "null" } ], "example": { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com" } }, "status": { "description": "Action item status, one of 'PENDING' or 'DONE'.", "enum": [ "PENDING", "DONE" ], "type": "string" } }, "required": [ "id", "title", "description", "status", "assignee" ], "type": "object" }, "type": "array" }, "insights": { "additionalProperties": { "items": { "additionalProperties": false, "properties": { "speaker": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Speaker the insight is associated with, if any." }, "timestamp": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Timestamp in seconds the insight is associated with, if any." }, "insight": { "anyOf": [ { "type": "string" }, { "additionalProperties": { "anyOf": [ { "type": "string" }, { "type": "number" }, { "type": "boolean" }, { "type": "null" } ] }, "propertyNames": { "type": "string" }, "type": "object" } ], "description": "The insight result. A string, or an object when the insight has custom fields." } }, "required": [ "speaker", "timestamp", "insight" ], "type": "object" }, "type": "array" }, "description": "Insight results for the meeting, keyed by the name of the user-created insight.", "propertyNames": { "type": "string" }, "type": "object" }, "linkAccess": { "anyOf": [ { "enum": [ "Editor", "Viewer", "LimitedViewer" ], "type": "string" }, { "type": "null" } ], "description": "Who can access the meeting through its shareable link." }, "calendarEvent": { "anyOf": [ { "additionalProperties": false, "properties": { "id": { "description": "The unique identifier of the calendar event.", "exclusiveMinimum": 0, "type": "number" }, "icalUid": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The iCalendar unique identifier of the event." }, "description": { "description": "The description of the calendar event.", "type": "string" }, "platform": { "anyOf": [ { "enum": [ "GoogleCalendar", "MicrosoftOutlook" ], "type": "string" }, { "type": "null" } ], "description": "The calendar platform the event comes from." }, "platformId": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The unique identifier of the event on the calendar platform." } }, "required": [ "id", "platform", "platformId", "description", "icalUid" ], "type": "object" }, { "type": "null" } ] } }, "required": [ "id", "linkAccess", "url", "createdAt", "updatedAt", "duration", "name", "notes", "icalUid", "recordingUrl", "tags", "attendees", "actionItems", "insights", "calendarEvent", "privateNotes" ], "type": "object" } } }, "description": "Successful response." }, "400": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "code": { "description": "A machine-readable code identifying the type of failure.", "type": "string" }, "error": { "description": "A human-readable message explaining why the request failed.", "type": "string" }, "seatsToAdd": { "description": "The authoritative number of workspace seats required.", "exclusiveMinimum": 0, "type": "integer" }, "issues": { "description": "The field-level validation issues found in an invalid request.", "items": { "additionalProperties": false, "properties": { "message": { "description": "A human-readable explanation of the validation failure.", "type": "string" }, "path": { "description": "The location of the request field that failed validation.", "type": "string" } }, "required": [ "path", "message" ], "type": "object" }, "type": "array" } }, "required": [ "error" ], "type": "object" } } }, "description": "The request failed validation." }, "429": { "content": { "application/json": { "schema": { "$ref": "#/paths/~1meeting~1{meetingId}/delete/responses/400/content/application~1json/schema" } } }, "description": "The request exceeded the rate limit for the account's plan, which the error message names: 3 requests per second and 20 per minute on Free, 20 per second and 300 per minute on Pro, Business, and Enterprise. Retry after the number of seconds in the `Retry-After` header." } }, "security": [ { "ApiKeyAuth": [] } ], "summary": "Delete meeting", "tags": [ "Meetings" ] } } } } ``` # Update meeting (/docs/api/meetings/update-meeting) ## OpenAPI ```json { "info": { "description": "The Circleback public REST API provides programmatic access to your meetings, notes, action items, transcripts, and more. Authenticate every request by sending your API key as a bearer token.", "title": "Circleback Public API", "version": "1.0.0" }, "openapi": "3.2.0", "servers": [ { "url": "https://circleback.ai/api" } ], "components": { "securitySchemes": { "ApiKeyAuth": { "bearerFormat": "cb_", "scheme": "bearer", "type": "http" } } }, "tags": [ { "description": "Access meetings along with their notes, transcripts, attendees, recordings, and search.", "name": "Meetings" } ], "paths": { "/meeting/{meetingId}": { "put": { "description": "Updates a meeting's name, notes, or private notes. Returns only the fields that were updated.", "parameters": [ { "description": "The unique identifier of the meeting.", "in": "path", "name": "meetingId", "required": true, "schema": { "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "example": { "name": "Event Venue Review", "notes": "#### Overview\n* Several options for event venues were reviewed…", "privateNotes": "Ask Samantha about the Sunriver deposit before Friday." }, "properties": { "name": { "description": "The new name of the meeting.", "type": "string" }, "notes": { "description": "The new notes from the meeting.", "type": "string" }, "privateNotes": { "description": "The authenticated user's private notes for the meeting.", "type": "string" } }, "type": "object" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "id": { "description": "Circleback meeting ID. Can be used to generate a link to the meeting (`https://circleback.ai/meetings/${id}`).", "type": "string" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Meeting name." }, "createdAt": { "description": "Meeting creation date, formatted as an ISO 8601 timestamp.", "format": "date-time", "type": "string" }, "updatedAt": { "description": "When the meeting was last updated.", "format": "date-time", "type": "string" }, "duration": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Meeting duration in seconds." }, "url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "URL of the virtual meeting (Zoom, Google Meet, or Microsoft Teams)." }, "recordingUrl": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "URL of the meeting recording file. Only valid for 24 hours, and only available if saving meeting recordings is enabled in settings." }, "tags": { "description": "Tags added to the meeting.", "items": { "additionalProperties": false, "properties": { "id": { "description": "The unique identifier of the tag.", "exclusiveMinimum": 0, "type": "number" }, "name": { "description": "The display name of the tag.", "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "A description of the tag." } }, "required": [ "id", "name", "description" ], "type": "object" }, "type": "array" }, "icalUid": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Unique identifier of the calendar event associated with the meeting." }, "attendees": { "description": "Meeting attendees.", "items": { "additionalProperties": false, "properties": { "profileId": { "description": "The unique identifier of the person's profile.", "exclusiveMinimum": 0, "type": "number" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Calendar event invitee name if associated with a calendar event, or the name of the meeting participant." }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's job title." }, "companyName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The name of the company the person belongs to." }, "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Calendar event invitee email if associated with a calendar event." }, "isCalendarEventOrganizer": { "description": "Whether the attendee organized the calendar event.", "type": "boolean" }, "isCalendarInvitee": { "description": "Whether the attendee was invited on the calendar event.", "type": "boolean" } }, "required": [ "profileId", "name", "email", "title", "companyName", "isCalendarInvitee", "isCalendarEventOrganizer" ], "type": "object" }, "type": "array" }, "notes": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Circleback meeting notes with Markdown formatting." }, "privateNotes": { "description": "The authenticated user's private notes for the meeting.", "type": "string" }, "actionItems": { "description": "Action items created for the meeting.", "items": { "additionalProperties": false, "properties": { "id": { "description": "Circleback action item ID.", "exclusiveMinimum": 0, "type": "number" }, "title": { "description": "Action item title.", "type": "string" }, "description": { "description": "Action item description.", "type": "string" }, "assignee": { "description": "Action item assignee, or null if unassigned.", "anyOf": [ { "additionalProperties": false, "properties": { "profileId": { "description": "The unique identifier of the person's profile.", "exclusiveMinimum": 0, "type": "number" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's full name." }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's job title." }, "companyName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The name of the company the person belongs to." }, "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's email address." } }, "required": [ "profileId", "name", "email", "title", "companyName" ], "type": "object" }, { "type": "null" } ], "example": { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com" } }, "status": { "description": "Action item status, one of 'PENDING' or 'DONE'.", "enum": [ "PENDING", "DONE" ], "type": "string" } }, "required": [ "id", "title", "description", "status", "assignee" ], "type": "object" }, "type": "array" }, "insights": { "additionalProperties": { "items": { "additionalProperties": false, "properties": { "speaker": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Speaker the insight is associated with, if any." }, "timestamp": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Timestamp in seconds the insight is associated with, if any." }, "insight": { "anyOf": [ { "type": "string" }, { "additionalProperties": { "anyOf": [ { "type": "string" }, { "type": "number" }, { "type": "boolean" }, { "type": "null" } ] }, "propertyNames": { "type": "string" }, "type": "object" } ], "description": "The insight result. A string, or an object when the insight has custom fields." } }, "required": [ "speaker", "timestamp", "insight" ], "type": "object" }, "type": "array" }, "description": "Insight results for the meeting, keyed by the name of the user-created insight.", "propertyNames": { "type": "string" }, "type": "object" }, "linkAccess": { "anyOf": [ { "enum": [ "Editor", "Viewer", "LimitedViewer" ], "type": "string" }, { "type": "null" } ], "description": "Who can access the meeting through its shareable link." }, "calendarEvent": { "anyOf": [ { "additionalProperties": false, "properties": { "id": { "description": "The unique identifier of the calendar event.", "exclusiveMinimum": 0, "type": "number" }, "icalUid": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The iCalendar unique identifier of the event." }, "description": { "description": "The description of the calendar event.", "type": "string" }, "platform": { "anyOf": [ { "enum": [ "GoogleCalendar", "MicrosoftOutlook" ], "type": "string" }, { "type": "null" } ], "description": "The calendar platform the event comes from." }, "platformId": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The unique identifier of the event on the calendar platform." } }, "required": [ "id", "platform", "platformId", "description", "icalUid" ], "type": "object" }, { "type": "null" } ] } }, "type": "object" } } }, "description": "Successful response." }, "400": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "code": { "description": "A machine-readable code identifying the type of failure.", "type": "string" }, "error": { "description": "A human-readable message explaining why the request failed.", "type": "string" }, "seatsToAdd": { "description": "The authoritative number of workspace seats required.", "exclusiveMinimum": 0, "type": "integer" }, "issues": { "description": "The field-level validation issues found in an invalid request.", "items": { "additionalProperties": false, "properties": { "message": { "description": "A human-readable explanation of the validation failure.", "type": "string" }, "path": { "description": "The location of the request field that failed validation.", "type": "string" } }, "required": [ "path", "message" ], "type": "object" }, "type": "array" } }, "required": [ "error" ], "type": "object" } } }, "description": "The request failed validation." }, "429": { "content": { "application/json": { "schema": { "$ref": "#/paths/~1meeting~1{meetingId}/put/responses/400/content/application~1json/schema" } } }, "description": "The request exceeded the rate limit for the account's plan, which the error message names: 3 requests per second and 20 per minute on Free, 20 per second and 300 per minute on Pro, Business, and Enterprise. Retry after the number of seconds in the `Retry-After` header." } }, "security": [ { "ApiKeyAuth": [] } ], "summary": "Update meeting", "tags": [ "Meetings" ] } } } } ``` # Get meeting transcript (/docs/api/meetings/get-meeting-transcript) ## OpenAPI ```json { "info": { "description": "The Circleback public REST API provides programmatic access to your meetings, notes, action items, transcripts, and more. Authenticate every request by sending your API key as a bearer token.", "title": "Circleback Public API", "version": "1.0.0" }, "openapi": "3.2.0", "servers": [ { "url": "https://circleback.ai/api" } ], "components": { "securitySchemes": { "ApiKeyAuth": { "bearerFormat": "cb_", "scheme": "bearer", "type": "http" } } }, "tags": [ { "description": "Access meetings along with their notes, transcripts, attendees, recordings, and search.", "name": "Meetings" } ], "paths": { "/meeting/{meetingId}/transcript": { "get": { "description": "Returns the full transcript for a meeting.", "parameters": [ { "description": "The unique identifier of the meeting.", "in": "path", "name": "meetingId", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "description": "The segments of the transcript, in chronological order.", "example": [ { "speaker": "John Appleseed", "text": "Hey, how's it going?", "timestamp": 4.56 }, { "speaker": "Samantha Grey", "text": "Going well, just testing the Circleback API.", "timestamp": 18.32 } ], "items": { "additionalProperties": false, "properties": { "speaker": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Speaker name." }, "text": { "description": "Words spoken.", "type": "string" }, "timestamp": { "description": "Timestamp in seconds that marks the beginning of the segment.", "type": "number" } }, "required": [ "speaker", "text", "timestamp" ], "type": "object" }, "type": "array" } } }, "description": "Successful response." }, "400": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "code": { "description": "A machine-readable code identifying the type of failure.", "type": "string" }, "error": { "description": "A human-readable message explaining why the request failed.", "type": "string" }, "seatsToAdd": { "description": "The authoritative number of workspace seats required.", "exclusiveMinimum": 0, "type": "integer" }, "issues": { "description": "The field-level validation issues found in an invalid request.", "items": { "additionalProperties": false, "properties": { "message": { "description": "A human-readable explanation of the validation failure.", "type": "string" }, "path": { "description": "The location of the request field that failed validation.", "type": "string" } }, "required": [ "path", "message" ], "type": "object" }, "type": "array" } }, "required": [ "error" ], "type": "object" } } }, "description": "The request failed validation." }, "429": { "content": { "application/json": { "schema": { "$ref": "#/paths/~1meeting~1{meetingId}~1transcript/get/responses/400/content/application~1json/schema" } } }, "description": "The request exceeded the rate limit for the account's plan, which the error message names: 3 requests per second and 20 per minute on Free, 20 per second and 300 per minute on Pro, Business, and Enterprise. Retry after the number of seconds in the `Retry-After` header." } }, "security": [ { "ApiKeyAuth": [] }, {} ], "summary": "Get meeting transcript", "tags": [ "Meetings" ] } } } } ``` # List meetings (/docs/api/meetings/list-meetings) ## OpenAPI ```json { "info": { "description": "The Circleback public REST API provides programmatic access to your meetings, notes, action items, transcripts, and more. Authenticate every request by sending your API key as a bearer token.", "title": "Circleback Public API", "version": "1.0.0" }, "openapi": "3.2.0", "servers": [ { "url": "https://circleback.ai/api" } ], "components": { "securitySchemes": { "ApiKeyAuth": { "bearerFormat": "cb_", "scheme": "bearer", "type": "http" } } }, "tags": [ { "description": "Access meetings along with their notes, transcripts, attendees, recordings, and search.", "name": "Meetings" } ], "paths": { "/meetings": { "get": { "description": "Returns a page of meetings for the authenticated user, optionally filtered by attendees, tags, ownership, and status.", "parameters": [ { "description": "Whether to return only meetings the user owns or all meetings the user can access.", "in": "query", "name": "ownership", "required": false, "schema": { "default": "Mine", "enum": [ "All", "Mine", "Shared" ], "type": "string" } }, { "description": "Meeting statuses to filter by.", "in": "query", "name": "statuses", "required": false, "schema": { "items": { "type": "string" }, "type": "array" } }, { "description": "Cursor for the next page. Omit for the first page (RFC 8288).", "in": "query", "name": "cursor", "required": false, "schema": { "type": "string" } }, { "description": "Tag IDs to filter by.", "in": "query", "name": "tagIds", "required": false, "schema": { "items": { "exclusiveMinimum": 0, "type": "integer" }, "type": "array" } }, { "description": "Profile IDs of attendees to filter by.", "in": "query", "name": "attendeeProfileIds", "required": false, "schema": { "items": { "exclusiveMinimum": 0, "type": "integer" }, "type": "array" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "items": { "additionalProperties": false, "example": { "id": "WRweb12iCBimU6Vo8cD7z", "name": "Event Venue Review", "createdAt": "2023-07-25T20:30:57.926Z", "updatedAt": "2023-07-25T20:30:57.926Z", "duration": 1306.09, "url": "https://meet.google.com/abc-defgh-xyz", "recordingUrl": "https://storage.googleapis.com/circleback-recordings/WRweb12iCBimU6Vo8cD7z.mp4", "tags": [ { "id": 1, "name": "Events", "description": "Company events and offsites." } ], "icalUid": "event-venue-review@google.com", "attendees": [ { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com", "isCalendarEventOrganizer": true, "isCalendarInvitee": true }, { "profileId": 2, "name": "Samantha Grey", "title": "Office Manager", "companyName": "Initech", "email": "samantha@initech.com", "isCalendarEventOrganizer": false, "isCalendarInvitee": true } ], "notes": "#### Overview\n* Several options for event venues were reviewed…", "privateNotes": "Ask Samantha about the Sunriver deposit before Friday.", "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": { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com" }, "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" } ], "insights": { "Customer details": [ { "speaker": "John Appleseed", "timestamp": 800, "insight": { "Company name": "Initech", "Number of employees": 120 } } ], "Questions": [ { "insight": "Is this thing on?", "speaker": "Samantha Grey", "timestamp": 49.15 }, { "insight": "When will the webhook integration be ready?", "speaker": "John Appleseed", "timestamp": 120.12 } ] }, "linkAccess": "Viewer", "calendarEvent": { "id": 91, "icalUid": "event-venue-review@google.com", "description": "Quarterly venue review", "platform": "GoogleCalendar", "platformId": "provider-event-id" } }, "properties": { "id": { "description": "Circleback meeting ID. Can be used to generate a link to the meeting (`https://circleback.ai/meetings/${id}`).", "type": "string" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Meeting name." }, "createdAt": { "description": "Meeting creation date, formatted as an ISO 8601 timestamp.", "format": "date-time", "type": "string" }, "updatedAt": { "description": "When the meeting was last updated.", "format": "date-time", "type": "string" }, "duration": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Meeting duration in seconds." }, "url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "URL of the virtual meeting (Zoom, Google Meet, or Microsoft Teams)." }, "recordingUrl": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "URL of the meeting recording file. Only valid for 24 hours, and only available if saving meeting recordings is enabled in settings." }, "tags": { "description": "Tags added to the meeting.", "items": { "additionalProperties": false, "properties": { "id": { "description": "The unique identifier of the tag.", "exclusiveMinimum": 0, "type": "number" }, "name": { "description": "The display name of the tag.", "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "A description of the tag." } }, "required": [ "id", "name", "description" ], "type": "object" }, "type": "array" }, "icalUid": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Unique identifier of the calendar event associated with the meeting." }, "attendees": { "description": "Meeting attendees.", "items": { "additionalProperties": false, "properties": { "profileId": { "description": "The unique identifier of the person's profile.", "exclusiveMinimum": 0, "type": "number" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Calendar event invitee name if associated with a calendar event, or the name of the meeting participant." }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's job title." }, "companyName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The name of the company the person belongs to." }, "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Calendar event invitee email if associated with a calendar event." }, "isCalendarEventOrganizer": { "description": "Whether the attendee organized the calendar event.", "type": "boolean" }, "isCalendarInvitee": { "description": "Whether the attendee was invited on the calendar event.", "type": "boolean" } }, "required": [ "profileId", "name", "email", "title", "companyName", "isCalendarInvitee", "isCalendarEventOrganizer" ], "type": "object" }, "type": "array" }, "notes": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Circleback meeting notes with Markdown formatting." }, "privateNotes": { "description": "The authenticated user's private notes for the meeting.", "type": "string" }, "actionItems": { "description": "Action items created for the meeting.", "items": { "additionalProperties": false, "properties": { "id": { "description": "Circleback action item ID.", "exclusiveMinimum": 0, "type": "number" }, "title": { "description": "Action item title.", "type": "string" }, "description": { "description": "Action item description.", "type": "string" }, "assignee": { "description": "Action item assignee, or null if unassigned.", "anyOf": [ { "additionalProperties": false, "properties": { "profileId": { "description": "The unique identifier of the person's profile.", "exclusiveMinimum": 0, "type": "number" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's full name." }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's job title." }, "companyName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The name of the company the person belongs to." }, "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's email address." } }, "required": [ "profileId", "name", "email", "title", "companyName" ], "type": "object" }, { "type": "null" } ], "example": { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com" } }, "status": { "description": "Action item status, one of 'PENDING' or 'DONE'.", "enum": [ "PENDING", "DONE" ], "type": "string" } }, "required": [ "id", "title", "description", "status", "assignee" ], "type": "object" }, "type": "array" }, "insights": { "additionalProperties": { "items": { "additionalProperties": false, "properties": { "speaker": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Speaker the insight is associated with, if any." }, "timestamp": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Timestamp in seconds the insight is associated with, if any." }, "insight": { "anyOf": [ { "type": "string" }, { "additionalProperties": { "anyOf": [ { "type": "string" }, { "type": "number" }, { "type": "boolean" }, { "type": "null" } ] }, "propertyNames": { "type": "string" }, "type": "object" } ], "description": "The insight result. A string, or an object when the insight has custom fields." } }, "required": [ "speaker", "timestamp", "insight" ], "type": "object" }, "type": "array" }, "description": "Insight results for the meeting, keyed by the name of the user-created insight.", "propertyNames": { "type": "string" }, "type": "object" }, "linkAccess": { "anyOf": [ { "enum": [ "Editor", "Viewer", "LimitedViewer" ], "type": "string" }, { "type": "null" } ], "description": "Who can access the meeting through its shareable link." }, "calendarEvent": { "anyOf": [ { "additionalProperties": false, "properties": { "id": { "description": "The unique identifier of the calendar event.", "exclusiveMinimum": 0, "type": "number" }, "icalUid": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The iCalendar unique identifier of the event." }, "description": { "description": "The description of the calendar event.", "type": "string" }, "platform": { "anyOf": [ { "enum": [ "GoogleCalendar", "MicrosoftOutlook" ], "type": "string" }, { "type": "null" } ], "description": "The calendar platform the event comes from." }, "platformId": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The unique identifier of the event on the calendar platform." } }, "required": [ "id", "platform", "platformId", "description", "icalUid" ], "type": "object" }, { "type": "null" } ] } }, "required": [ "id", "linkAccess", "url", "createdAt", "updatedAt", "duration", "name", "notes", "icalUid", "recordingUrl", "tags", "attendees", "actionItems", "insights", "calendarEvent", "privateNotes" ], "type": "object" }, "type": "array" } } }, "description": "Successful response." }, "400": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "code": { "description": "A machine-readable code identifying the type of failure.", "type": "string" }, "error": { "description": "A human-readable message explaining why the request failed.", "type": "string" }, "seatsToAdd": { "description": "The authoritative number of workspace seats required.", "exclusiveMinimum": 0, "type": "integer" }, "issues": { "description": "The field-level validation issues found in an invalid request.", "items": { "additionalProperties": false, "properties": { "message": { "description": "A human-readable explanation of the validation failure.", "type": "string" }, "path": { "description": "The location of the request field that failed validation.", "type": "string" } }, "required": [ "path", "message" ], "type": "object" }, "type": "array" } }, "required": [ "error" ], "type": "object" } } }, "description": "The request failed validation." }, "429": { "content": { "application/json": { "schema": { "$ref": "#/paths/~1meetings/get/responses/400/content/application~1json/schema" } } }, "description": "The request exceeded the rate limit for the account's plan, which the error message names: 3 requests per second and 20 per minute on Free, 20 per second and 300 per minute on Pro, Business, and Enterprise. Retry after the number of seconds in the `Retry-After` header." } }, "security": [ { "ApiKeyAuth": [] } ], "summary": "List meetings", "tags": [ "Meetings" ] } } } } ``` # Import meeting (/docs/api/meetings/import-meeting) ## OpenAPI ```json { "info": { "description": "The Circleback public REST API provides programmatic access to your meetings, notes, action items, transcripts, and more. Authenticate every request by sending your API key as a bearer token.", "title": "Circleback Public API", "version": "1.0.0" }, "openapi": "3.2.0", "servers": [ { "url": "https://circleback.ai/api" } ], "components": { "securitySchemes": { "ApiKeyAuth": { "bearerFormat": "cb_", "scheme": "bearer", "type": "http" } } }, "tags": [ { "description": "Access meetings along with their notes, transcripts, attendees, recordings, and search.", "name": "Meetings" } ], "paths": { "/meetings": { "post": { "description": "Imports an existing meeting with notes, a transcript, and attendees. Imported meetings work like any other meeting in Circleback.", "requestBody": { "content": { "application/json": { "schema": { "description": "A meeting to import.", "properties": { "name": { "description": "Meeting name.", "minLength": 1, "type": "string" }, "createdAt": { "description": "Meeting creation date, formatted as an ISO 8601 timestamp. Defaults to now.", "format": "date-time", "type": "string" }, "tags": { "description": "Tags to add to the meeting.", "items": { "properties": { "name": { "description": "The display name of the tag.", "type": "string" }, "description": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "description": "A description of the tag." } }, "required": [ "name" ], "type": "object" }, "type": "array" }, "attendees": { "default": [], "description": "Meeting attendees.", "items": { "properties": { "name": { "description": "The person's full name.", "minLength": 1, "type": "string" }, "email": { "description": "The person's email address.", "format": "email", "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", "type": "string" }, "isCalendarEventOrganizer": { "default": false, "description": "Whether the attendee organized the calendar event.", "type": "boolean" }, "isCalendarInvitee": { "default": false, "description": "Whether the attendee was invited on the calendar event.", "type": "boolean" } }, "required": [ "email" ], "type": "object" }, "type": "array" }, "notes": { "description": "Meeting notes with Markdown formatting.", "minLength": 1, "type": "string" }, "transcript": { "default": [], "description": "The segments of the transcript. Provide text and timestamp, or a words array with optional word-level timestamps.", "example": [ { "speaker": "John Appleseed", "text": "Hey, how's it going?", "timestamp": 4.56 }, { "speaker": "Samantha Grey", "text": "Going well, just testing the Circleback API.", "timestamp": 18.32 } ], "examples": [ [ { "speaker": "John Appleseed", "text": "Hey, how's it going?", "timestamp": 4.56 }, { "speaker": "Samantha Grey", "text": "Going well, just testing the Circleback API.", "timestamp": 18.32 } ], [ { "speaker": "John Appleseed", "words": [ { "endTimestamp": 4.9, "startTimestamp": 4.56, "text": "Hello" }, { "endTimestamp": 5.3, "startTimestamp": 4.9, "text": "there." } ] } ] ], "items": { "properties": { "language": { "description": "The language code of the speech in the segment, if the language was detected.", "type": "string" }, "speaker": { "description": "The name of the speaker in the segment.", "minLength": 1, "type": "string" }, "text": { "description": "Words spoken.", "minLength": 1, "type": "string" }, "timestamp": { "description": "Timestamp in seconds that marks the beginning of the segment.", "minimum": 0, "type": "number" }, "words": { "description": "The words spoken in the segment. Use this instead of text when word-level timestamps are available.", "items": { "properties": { "endTimestamp": { "description": "The time the word ends at, in seconds from the beginning of the meeting.", "minimum": 0, "type": "number" }, "startTimestamp": { "description": "The time the word starts at, in seconds from the beginning of the meeting.", "minimum": 0, "type": "number" }, "text": { "description": "The text of the word.", "minLength": 1, "type": "string" } }, "required": [ "text" ], "type": "object" }, "minItems": 1, "type": "array" } }, "required": [ "speaker" ], "type": "object" }, "type": "array" }, "sharedWith": { "default": [], "description": "People to share the meeting with.", "items": { "properties": { "access": { "description": "The access level to grant.", "enum": [ "Editor", "Viewer", "LimitedViewer" ], "type": "string" }, "email": { "description": "The email address to share the meeting with.", "format": "email", "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", "type": "string" } }, "required": [ "email", "access" ], "type": "object" }, "type": "array" } }, "required": [ "name", "notes" ], "type": "object" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "additionalProperties": false, "example": { "id": "WRweb12iCBimU6Vo8cD7z", "name": "Event Venue Review", "createdAt": "2023-07-25T20:30:57.926Z", "updatedAt": "2023-07-25T20:30:57.926Z", "tags": [ { "id": 1, "name": "Events", "description": "Company events and offsites." } ], "attendees": [ { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com", "isCalendarEventOrganizer": true, "isCalendarInvitee": true }, { "profileId": 2, "name": "Samantha Grey", "title": "Office Manager", "companyName": "Initech", "email": "samantha@initech.com", "isCalendarEventOrganizer": false, "isCalendarInvitee": true } ], "notes": "#### Overview\n* Several options for event venues were reviewed…" }, "properties": { "id": { "description": "Circleback meeting ID. Can be used to generate a link to the meeting (`https://circleback.ai/meetings/${id}`).", "type": "string" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Meeting name." }, "createdAt": { "description": "Meeting creation date, formatted as an ISO 8601 timestamp.", "format": "date-time", "type": "string" }, "updatedAt": { "description": "When the meeting was last updated.", "format": "date-time", "type": "string" }, "tags": { "description": "Tags added to the meeting.", "items": { "additionalProperties": false, "properties": { "id": { "description": "The unique identifier of the tag.", "exclusiveMinimum": 0, "type": "number" }, "name": { "description": "The display name of the tag.", "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "A description of the tag." } }, "required": [ "id", "name", "description" ], "type": "object" }, "type": "array" }, "attendees": { "description": "Meeting attendees.", "items": { "additionalProperties": false, "properties": { "profileId": { "description": "The unique identifier of the person's profile.", "exclusiveMinimum": 0, "type": "number" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Calendar event invitee name if associated with a calendar event, or the name of the meeting participant." }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's job title." }, "companyName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The name of the company the person belongs to." }, "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Calendar event invitee email if associated with a calendar event." }, "isCalendarEventOrganizer": { "description": "Whether the attendee organized the calendar event.", "type": "boolean" }, "isCalendarInvitee": { "description": "Whether the attendee was invited on the calendar event.", "type": "boolean" } }, "required": [ "profileId", "name", "email", "title", "companyName", "isCalendarInvitee", "isCalendarEventOrganizer" ], "type": "object" }, "type": "array" }, "notes": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Circleback meeting notes with Markdown formatting." } }, "required": [ "id", "createdAt", "updatedAt", "name", "notes", "tags", "attendees" ], "type": "object" } } }, "description": "Successful response." }, "400": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "code": { "description": "A machine-readable code identifying the type of failure.", "type": "string" }, "error": { "description": "A human-readable message explaining why the request failed.", "type": "string" }, "seatsToAdd": { "description": "The authoritative number of workspace seats required.", "exclusiveMinimum": 0, "type": "integer" }, "issues": { "description": "The field-level validation issues found in an invalid request.", "items": { "additionalProperties": false, "properties": { "message": { "description": "A human-readable explanation of the validation failure.", "type": "string" }, "path": { "description": "The location of the request field that failed validation.", "type": "string" } }, "required": [ "path", "message" ], "type": "object" }, "type": "array" } }, "required": [ "error" ], "type": "object" } } }, "description": "The request failed validation." }, "429": { "content": { "application/json": { "schema": { "$ref": "#/paths/~1meetings/post/responses/400/content/application~1json/schema" } } }, "description": "The request exceeded the rate limit for the account's plan, which the error message names: 3 requests per second and 20 per minute on Free, 20 per second and 300 per minute on Pro, Business, and Enterprise. Retry after the number of seconds in the `Retry-After` header." } }, "security": [ { "ApiKeyAuth": [] } ], "summary": "Import meeting", "tags": [ "Meetings" ] } } } } ``` # Search meetings (/docs/api/meetings/search-meetings) ## OpenAPI ```json { "info": { "description": "The Circleback public REST API provides programmatic access to your meetings, notes, action items, transcripts, and more. Authenticate every request by sending your API key as a bearer token.", "title": "Circleback Public API", "version": "1.0.0" }, "openapi": "3.2.0", "servers": [ { "url": "https://circleback.ai/api" } ], "components": { "securitySchemes": { "ApiKeyAuth": { "bearerFormat": "cb_", "scheme": "bearer", "type": "http" } } }, "tags": [ { "description": "Access meetings along with their notes, transcripts, attendees, recordings, and search.", "name": "Meetings" } ], "paths": { "/search": { "get": { "description": "Searches the authenticated user's meetings by name and content, with optional filters for specific meetings, tags, and people.", "parameters": [ { "description": "The text to search for across meeting names and content.", "in": "query", "name": "searchTerm", "required": false, "schema": { "type": "string" } }, { "description": "Restrict the search to the meetings with these IDs.", "in": "query", "name": "meetingIds", "required": false, "schema": { "items": { "type": "string" }, "type": "array" } }, { "description": "Restrict the search to meetings with these tag IDs.", "in": "query", "name": "tagIds", "required": false, "schema": { "items": { "exclusiveMinimum": 0, "type": "integer" }, "type": "array" } }, { "description": "Cursor for the next page. Omit for the first page (RFC 8288).", "in": "query", "name": "cursor", "required": false, "schema": { "type": "string" } }, { "description": "Restrict the search to meetings attended by the people with these profile IDs.", "in": "query", "name": "attendeeProfileIds", "required": false, "schema": { "items": { "exclusiveMinimum": 0, "type": "integer" }, "type": "array" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "description": "The meetings that match the search query.", "example": [ { "id": "WRweb12iCBimU6Vo8cD7z", "name": "Event Venue Review", "createdAt": "2023-07-25T20:30:57.926Z", "updatedAt": "2023-07-25T20:30:57.926Z", "duration": 1306.09, "url": "https://meet.google.com/abc-defgh-xyz", "recordingUrl": "https://storage.googleapis.com/circleback-recordings/WRweb12iCBimU6Vo8cD7z.mp4", "tags": [ { "id": 1, "name": "Events", "description": "Company events and offsites." } ], "icalUid": "event-venue-review@google.com", "attendees": [ { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com", "isCalendarEventOrganizer": true, "isCalendarInvitee": true }, { "profileId": 2, "name": "Samantha Grey", "title": "Office Manager", "companyName": "Initech", "email": "samantha@initech.com", "isCalendarEventOrganizer": false, "isCalendarInvitee": true } ], "notes": "#### Overview\n* Several options for event venues were reviewed…", "privateNotes": "Ask Samantha about the Sunriver deposit before Friday.", "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": { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com" }, "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" } ], "insights": { "Customer details": [ { "speaker": "John Appleseed", "timestamp": 800, "insight": { "Company name": "Initech", "Number of employees": 120 } } ], "Questions": [ { "insight": "Is this thing on?", "speaker": "Samantha Grey", "timestamp": 49.15 }, { "insight": "When will the webhook integration be ready?", "speaker": "John Appleseed", "timestamp": 120.12 } ] }, "linkAccess": "Viewer", "calendarEvent": { "id": 91, "icalUid": "event-venue-review@google.com", "description": "Quarterly venue review", "platform": "GoogleCalendar", "platformId": "provider-event-id" } } ], "items": { "additionalProperties": false, "example": { "id": "WRweb12iCBimU6Vo8cD7z", "name": "Event Venue Review", "createdAt": "2023-07-25T20:30:57.926Z", "updatedAt": "2023-07-25T20:30:57.926Z", "duration": 1306.09, "url": "https://meet.google.com/abc-defgh-xyz", "recordingUrl": "https://storage.googleapis.com/circleback-recordings/WRweb12iCBimU6Vo8cD7z.mp4", "tags": [ { "id": 1, "name": "Events", "description": "Company events and offsites." } ], "icalUid": "event-venue-review@google.com", "attendees": [ { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com", "isCalendarEventOrganizer": true, "isCalendarInvitee": true }, { "profileId": 2, "name": "Samantha Grey", "title": "Office Manager", "companyName": "Initech", "email": "samantha@initech.com", "isCalendarEventOrganizer": false, "isCalendarInvitee": true } ], "notes": "#### Overview\n* Several options for event venues were reviewed…", "privateNotes": "Ask Samantha about the Sunriver deposit before Friday.", "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": { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com" }, "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" } ], "insights": { "Customer details": [ { "speaker": "John Appleseed", "timestamp": 800, "insight": { "Company name": "Initech", "Number of employees": 120 } } ], "Questions": [ { "insight": "Is this thing on?", "speaker": "Samantha Grey", "timestamp": 49.15 }, { "insight": "When will the webhook integration be ready?", "speaker": "John Appleseed", "timestamp": 120.12 } ] }, "linkAccess": "Viewer", "calendarEvent": { "id": 91, "icalUid": "event-venue-review@google.com", "description": "Quarterly venue review", "platform": "GoogleCalendar", "platformId": "provider-event-id" } }, "properties": { "id": { "description": "Circleback meeting ID. Can be used to generate a link to the meeting (`https://circleback.ai/meetings/${id}`).", "type": "string" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Meeting name." }, "createdAt": { "description": "Meeting creation date, formatted as an ISO 8601 timestamp.", "format": "date-time", "type": "string" }, "updatedAt": { "description": "When the meeting was last updated.", "format": "date-time", "type": "string" }, "duration": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Meeting duration in seconds." }, "url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "URL of the virtual meeting (Zoom, Google Meet, or Microsoft Teams)." }, "recordingUrl": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "URL of the meeting recording file. Only valid for 24 hours, and only available if saving meeting recordings is enabled in settings." }, "tags": { "description": "Tags added to the meeting.", "items": { "additionalProperties": false, "properties": { "id": { "description": "The unique identifier of the tag.", "exclusiveMinimum": 0, "type": "number" }, "name": { "description": "The display name of the tag.", "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "A description of the tag." } }, "required": [ "id", "name", "description" ], "type": "object" }, "type": "array" }, "icalUid": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Unique identifier of the calendar event associated with the meeting." }, "attendees": { "description": "Meeting attendees.", "items": { "additionalProperties": false, "properties": { "profileId": { "description": "The unique identifier of the person's profile.", "exclusiveMinimum": 0, "type": "number" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Calendar event invitee name if associated with a calendar event, or the name of the meeting participant." }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's job title." }, "companyName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The name of the company the person belongs to." }, "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Calendar event invitee email if associated with a calendar event." }, "isCalendarEventOrganizer": { "description": "Whether the attendee organized the calendar event.", "type": "boolean" }, "isCalendarInvitee": { "description": "Whether the attendee was invited on the calendar event.", "type": "boolean" } }, "required": [ "profileId", "name", "email", "title", "companyName", "isCalendarInvitee", "isCalendarEventOrganizer" ], "type": "object" }, "type": "array" }, "notes": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Circleback meeting notes with Markdown formatting." }, "privateNotes": { "description": "The authenticated user's private notes for the meeting.", "type": "string" }, "actionItems": { "description": "Action items created for the meeting.", "items": { "additionalProperties": false, "properties": { "id": { "description": "Circleback action item ID.", "exclusiveMinimum": 0, "type": "number" }, "title": { "description": "Action item title.", "type": "string" }, "description": { "description": "Action item description.", "type": "string" }, "assignee": { "description": "Action item assignee, or null if unassigned.", "anyOf": [ { "additionalProperties": false, "properties": { "profileId": { "description": "The unique identifier of the person's profile.", "exclusiveMinimum": 0, "type": "number" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's full name." }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's job title." }, "companyName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The name of the company the person belongs to." }, "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's email address." } }, "required": [ "profileId", "name", "email", "title", "companyName" ], "type": "object" }, { "type": "null" } ], "example": { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com" } }, "status": { "description": "Action item status, one of 'PENDING' or 'DONE'.", "enum": [ "PENDING", "DONE" ], "type": "string" } }, "required": [ "id", "title", "description", "status", "assignee" ], "type": "object" }, "type": "array" }, "insights": { "additionalProperties": { "items": { "additionalProperties": false, "properties": { "speaker": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Speaker the insight is associated with, if any." }, "timestamp": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Timestamp in seconds the insight is associated with, if any." }, "insight": { "anyOf": [ { "type": "string" }, { "additionalProperties": { "anyOf": [ { "type": "string" }, { "type": "number" }, { "type": "boolean" }, { "type": "null" } ] }, "propertyNames": { "type": "string" }, "type": "object" } ], "description": "The insight result. A string, or an object when the insight has custom fields." } }, "required": [ "speaker", "timestamp", "insight" ], "type": "object" }, "type": "array" }, "description": "Insight results for the meeting, keyed by the name of the user-created insight.", "propertyNames": { "type": "string" }, "type": "object" }, "linkAccess": { "anyOf": [ { "enum": [ "Editor", "Viewer", "LimitedViewer" ], "type": "string" }, { "type": "null" } ], "description": "Who can access the meeting through its shareable link." }, "calendarEvent": { "anyOf": [ { "additionalProperties": false, "properties": { "id": { "description": "The unique identifier of the calendar event.", "exclusiveMinimum": 0, "type": "number" }, "icalUid": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The iCalendar unique identifier of the event." }, "description": { "description": "The description of the calendar event.", "type": "string" }, "platform": { "anyOf": [ { "enum": [ "GoogleCalendar", "MicrosoftOutlook" ], "type": "string" }, { "type": "null" } ], "description": "The calendar platform the event comes from." }, "platformId": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The unique identifier of the event on the calendar platform." } }, "required": [ "id", "platform", "platformId", "description", "icalUid" ], "type": "object" }, { "type": "null" } ] } }, "required": [ "id", "linkAccess", "url", "createdAt", "updatedAt", "duration", "name", "notes", "icalUid", "recordingUrl", "tags", "attendees", "actionItems", "insights", "calendarEvent", "privateNotes" ], "type": "object" }, "type": "array" } } }, "description": "Successful response." }, "400": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "code": { "description": "A machine-readable code identifying the type of failure.", "type": "string" }, "error": { "description": "A human-readable message explaining why the request failed.", "type": "string" }, "seatsToAdd": { "description": "The authoritative number of workspace seats required.", "exclusiveMinimum": 0, "type": "integer" }, "issues": { "description": "The field-level validation issues found in an invalid request.", "items": { "additionalProperties": false, "properties": { "message": { "description": "A human-readable explanation of the validation failure.", "type": "string" }, "path": { "description": "The location of the request field that failed validation.", "type": "string" } }, "required": [ "path", "message" ], "type": "object" }, "type": "array" } }, "required": [ "error" ], "type": "object" } } }, "description": "The request failed validation." }, "429": { "content": { "application/json": { "schema": { "$ref": "#/paths/~1search/get/responses/400/content/application~1json/schema" } } }, "description": "The request exceeded the rate limit for the account's plan, which the error message names: 3 requests per second and 20 per minute on Free, 20 per second and 300 per minute on Pro, Business, and Enterprise. Retry after the number of seconds in the `Retry-After` header." } }, "security": [ { "ApiKeyAuth": [] } ], "summary": "Search meetings", "tags": [ "Meetings" ] } } } } ``` # List people (/docs/api/people/list-people) ## OpenAPI ```json { "info": { "description": "The Circleback public REST API provides programmatic access to your meetings, notes, action items, transcripts, and more. Authenticate every request by sending your API key as a bearer token.", "title": "Circleback Public API", "version": "1.0.0" }, "openapi": "3.2.0", "servers": [ { "url": "https://circleback.ai/api" } ], "components": { "securitySchemes": { "ApiKeyAuth": { "bearerFormat": "cb_", "scheme": "bearer", "type": "http" } } }, "tags": [ { "description": "Look up the people who attend your meetings.", "name": "People" } ], "paths": { "/people": { "get": { "description": "Returns the people who attend the authenticated user's meetings, ordered by most recent meeting, with optional company and tag filters.", "parameters": [ { "description": "Cursor for the next page. Omit for the first page (RFC 8288).", "in": "query", "name": "cursor", "required": false, "schema": { "type": "string" } }, { "description": "Filter people to those associated with any of these company domains.", "in": "query", "name": "domains", "required": false, "schema": { "items": { "type": "string" }, "type": "array" } }, { "description": "The maximum number of people to return.", "in": "query", "name": "limit", "required": false, "schema": { "exclusiveMinimum": 0, "type": "integer" } }, { "description": "Filter people to attendees of meetings with these tag IDs.", "in": "query", "name": "tagIds", "required": false, "schema": { "items": { "exclusiveMinimum": 0, "type": "integer" }, "type": "array" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "items": { "additionalProperties": false, "example": { "id": 1, "title": "Head of Operations", "companyId": 3, "companyName": "Initech", "email": "john@initech.com", "firstName": "John", "lastName": "Appleseed" }, "properties": { "id": { "description": "The unique identifier of the person.", "exclusiveMinimum": 0, "type": "number" }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's job title." }, "companyId": { "anyOf": [ { "exclusiveMinimum": 0, "type": "number" }, { "type": "null" } ], "description": "The unique identifier of the company the person belongs to." }, "companyName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The name of the company the person belongs to." }, "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's email address." }, "firstName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's first name." }, "lastName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's last name." } }, "required": [ "id", "email", "firstName", "lastName", "title", "companyName", "companyId" ], "type": "object" }, "type": "array" } } }, "description": "Successful response." }, "400": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "code": { "description": "A machine-readable code identifying the type of failure.", "type": "string" }, "error": { "description": "A human-readable message explaining why the request failed.", "type": "string" }, "seatsToAdd": { "description": "The authoritative number of workspace seats required.", "exclusiveMinimum": 0, "type": "integer" }, "issues": { "description": "The field-level validation issues found in an invalid request.", "items": { "additionalProperties": false, "properties": { "message": { "description": "A human-readable explanation of the validation failure.", "type": "string" }, "path": { "description": "The location of the request field that failed validation.", "type": "string" } }, "required": [ "path", "message" ], "type": "object" }, "type": "array" } }, "required": [ "error" ], "type": "object" } } }, "description": "The request failed validation." }, "429": { "content": { "application/json": { "schema": { "$ref": "#/paths/~1people/get/responses/400/content/application~1json/schema" } } }, "description": "The request exceeded the rate limit for the account's plan, which the error message names: 3 requests per second and 20 per minute on Free, 20 per second and 300 per minute on Pro, Business, and Enterprise. Retry after the number of seconds in the `Retry-After` header." } }, "security": [ { "ApiKeyAuth": [] } ], "summary": "List people", "tags": [ "People" ] } } } } ``` # Get person (/docs/api/people/get-person) ## OpenAPI ```json { "info": { "description": "The Circleback public REST API provides programmatic access to your meetings, notes, action items, transcripts, and more. Authenticate every request by sending your API key as a bearer token.", "title": "Circleback Public API", "version": "1.0.0" }, "openapi": "3.2.0", "servers": [ { "url": "https://circleback.ai/api" } ], "components": { "securitySchemes": { "ApiKeyAuth": { "bearerFormat": "cb_", "scheme": "bearer", "type": "http" } } }, "tags": [ { "description": "Look up the people who attend your meetings.", "name": "People" } ], "paths": { "/person/{profileId}": { "get": { "description": "Returns a person by their profile ID, including their profile details and external links.", "parameters": [ { "description": "The unique identifier of the person's profile.", "in": "path", "name": "profileId", "required": true, "schema": { "exclusiveMinimum": 0, "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "additionalProperties": false, "example": { "id": 1, "title": "Head of Operations", "companyId": 3, "companyName": "Initech", "email": "john@initech.com", "firstName": "John", "lastName": "Appleseed", "externalLinks": [ { "url": "https://www.linkedin.com/in/john-appleseed", "objectType": "person", "type": "linkedin" } ] }, "properties": { "id": { "description": "The unique identifier of the person.", "exclusiveMinimum": 0, "type": "number" }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's job title." }, "companyId": { "anyOf": [ { "exclusiveMinimum": 0, "type": "number" }, { "type": "null" } ], "description": "The unique identifier of the company the person belongs to." }, "companyName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The name of the company the person belongs to." }, "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's email address." }, "firstName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's first name." }, "lastName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's last name." }, "externalLinks": { "description": "Links to the person on external platforms and connected integrations.", "items": { "additionalProperties": false, "properties": { "url": { "description": "The URL of the external resource.", "type": "string" }, "objectType": { "description": "Whether the link refers to a person or a company.", "enum": [ "person", "company" ], "type": "string" }, "type": { "description": "The platform or integration the link points to.", "enum": [ "Attio", "HubSpot", "Linear", "Salesforce", "Zoho", "linkedin", "facebook", "instagram", "twitter", "website" ], "type": "string" } }, "required": [ "type", "objectType", "url" ], "type": "object" }, "type": "array" } }, "required": [ "id", "email", "firstName", "lastName", "title", "companyName", "companyId", "externalLinks" ], "type": "object" } } }, "description": "Successful response." }, "400": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "code": { "description": "A machine-readable code identifying the type of failure.", "type": "string" }, "error": { "description": "A human-readable message explaining why the request failed.", "type": "string" }, "seatsToAdd": { "description": "The authoritative number of workspace seats required.", "exclusiveMinimum": 0, "type": "integer" }, "issues": { "description": "The field-level validation issues found in an invalid request.", "items": { "additionalProperties": false, "properties": { "message": { "description": "A human-readable explanation of the validation failure.", "type": "string" }, "path": { "description": "The location of the request field that failed validation.", "type": "string" } }, "required": [ "path", "message" ], "type": "object" }, "type": "array" } }, "required": [ "error" ], "type": "object" } } }, "description": "The request failed validation." }, "429": { "content": { "application/json": { "schema": { "$ref": "#/paths/~1person~1{profileId}/get/responses/400/content/application~1json/schema" } } }, "description": "The request exceeded the rate limit for the account's plan, which the error message names: 3 requests per second and 20 per minute on Free, 20 per second and 300 per minute on Pro, Business, and Enterprise. Retry after the number of seconds in the `Retry-After` header." } }, "security": [ { "ApiKeyAuth": [] } ], "summary": "Get person", "tags": [ "People" ] } } } } ``` # List tags (/docs/api/tags/list-tags) ## OpenAPI ```json { "info": { "description": "The Circleback public REST API provides programmatic access to your meetings, notes, action items, transcripts, and more. Authenticate every request by sending your API key as a bearer token.", "title": "Circleback Public API", "version": "1.0.0" }, "openapi": "3.2.0", "servers": [ { "url": "https://circleback.ai/api" } ], "components": { "securitySchemes": { "ApiKeyAuth": { "bearerFormat": "cb_", "scheme": "bearer", "type": "http" } } }, "tags": [ { "description": "Organize meetings with tags and manage tag assignments.", "name": "Tags" } ], "paths": { "/tag": { "get": { "description": "Returns every tag available to the authenticated user.", "responses": { "200": { "content": { "application/json": { "schema": { "items": { "additionalProperties": false, "example": { "id": 1, "name": "Events", "description": "Company events and offsites." }, "properties": { "id": { "description": "The unique identifier of the tag.", "exclusiveMinimum": 0, "type": "number" }, "name": { "description": "The display name of the tag.", "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "A description of the tag." } }, "required": [ "id", "name", "description" ], "type": "object" }, "type": "array" } } }, "description": "Successful response." }, "400": { "content": { "application/json": { "schema": { "$ref": "#/paths/~1tag/get/responses/429/content/application~1json/schema" } } }, "description": "The request failed validation." }, "429": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "code": { "description": "A machine-readable code identifying the type of failure.", "type": "string" }, "error": { "description": "A human-readable message explaining why the request failed.", "type": "string" }, "seatsToAdd": { "description": "The authoritative number of workspace seats required.", "exclusiveMinimum": 0, "type": "integer" }, "issues": { "description": "The field-level validation issues found in an invalid request.", "items": { "additionalProperties": false, "properties": { "message": { "description": "A human-readable explanation of the validation failure.", "type": "string" }, "path": { "description": "The location of the request field that failed validation.", "type": "string" } }, "required": [ "path", "message" ], "type": "object" }, "type": "array" } }, "required": [ "error" ], "type": "object" } } }, "description": "The request exceeded the rate limit for the account's plan, which the error message names: 3 requests per second and 20 per minute on Free, 20 per second and 300 per minute on Pro, Business, and Enterprise. Retry after the number of seconds in the `Retry-After` header." } }, "security": [ { "ApiKeyAuth": [] } ], "summary": "List tags", "tags": [ "Tags" ] } } } } ``` # Create tag (/docs/api/tags/create-tag) ## OpenAPI ```json { "info": { "description": "The Circleback public REST API provides programmatic access to your meetings, notes, action items, transcripts, and more. Authenticate every request by sending your API key as a bearer token.", "title": "Circleback Public API", "version": "1.0.0" }, "openapi": "3.2.0", "servers": [ { "url": "https://circleback.ai/api" } ], "components": { "securitySchemes": { "ApiKeyAuth": { "bearerFormat": "cb_", "scheme": "bearer", "type": "http" } } }, "tags": [ { "description": "Organize meetings with tags and manage tag assignments.", "name": "Tags" } ], "paths": { "/tag": { "post": { "description": "Creates a new tag. If a tag with the same name already exists, a conflict error is returned.", "requestBody": { "content": { "application/json": { "schema": { "example": { "name": "Events", "description": "Company events and offsites." }, "properties": { "name": { "description": "The display name of the tag.", "type": "string" }, "description": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "description": "A description of the tag." } }, "required": [ "name" ], "type": "object" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "additionalProperties": false, "example": { "id": 1, "name": "Events", "description": "Company events and offsites." }, "properties": { "id": { "description": "The unique identifier of the tag.", "exclusiveMinimum": 0, "type": "number" }, "name": { "description": "The display name of the tag.", "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "A description of the tag." } }, "required": [ "id", "name", "description" ], "type": "object" } } }, "description": "Successful response." }, "400": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "code": { "description": "A machine-readable code identifying the type of failure.", "type": "string" }, "error": { "description": "A human-readable message explaining why the request failed.", "type": "string" }, "seatsToAdd": { "description": "The authoritative number of workspace seats required.", "exclusiveMinimum": 0, "type": "integer" }, "issues": { "description": "The field-level validation issues found in an invalid request.", "items": { "additionalProperties": false, "properties": { "message": { "description": "A human-readable explanation of the validation failure.", "type": "string" }, "path": { "description": "The location of the request field that failed validation.", "type": "string" } }, "required": [ "path", "message" ], "type": "object" }, "type": "array" } }, "required": [ "error" ], "type": "object" } } }, "description": "The request failed validation." }, "429": { "content": { "application/json": { "schema": { "$ref": "#/paths/~1tag/post/responses/400/content/application~1json/schema" } } }, "description": "The request exceeded the rate limit for the account's plan, which the error message names: 3 requests per second and 20 per minute on Free, 20 per second and 300 per minute on Pro, Business, and Enterprise. Retry after the number of seconds in the `Retry-After` header." } }, "security": [ { "ApiKeyAuth": [] } ], "summary": "Create tag", "tags": [ "Tags" ] } } } } ``` # Remove tag from meetings (/docs/api/tags/remove-tag-from-meetings) ## OpenAPI ```json { "info": { "description": "The Circleback public REST API provides programmatic access to your meetings, notes, action items, transcripts, and more. Authenticate every request by sending your API key as a bearer token.", "title": "Circleback Public API", "version": "1.0.0" }, "openapi": "3.2.0", "servers": [ { "url": "https://circleback.ai/api" } ], "components": { "securitySchemes": { "ApiKeyAuth": { "bearerFormat": "cb_", "scheme": "bearer", "type": "http" } } }, "tags": [ { "description": "Organize meetings with tags and manage tag assignments.", "name": "Tags" } ], "paths": { "/tag": { "delete": { "description": "Removes a tag from one or more meetings and returns the updated meetings.", "requestBody": { "content": { "application/json": { "schema": { "properties": { "tagId": { "description": "The ID of the tag.", "exclusiveMinimum": 0, "type": "integer" }, "meetingIds": { "description": "The IDs of the meetings to update.", "items": { "description": "The unique identifier of the meeting.", "type": "string" }, "type": "array" } }, "required": [ "tagId" ], "type": "object" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "items": { "additionalProperties": false, "example": { "id": "WRweb12iCBimU6Vo8cD7z", "name": "Event Venue Review", "createdAt": "2023-07-25T20:30:57.926Z", "updatedAt": "2023-07-25T20:30:57.926Z", "duration": 1306.09, "url": "https://meet.google.com/abc-defgh-xyz", "recordingUrl": "https://storage.googleapis.com/circleback-recordings/WRweb12iCBimU6Vo8cD7z.mp4", "tags": [ { "id": 1, "name": "Events", "description": "Company events and offsites." } ], "icalUid": "event-venue-review@google.com", "attendees": [ { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com", "isCalendarEventOrganizer": true, "isCalendarInvitee": true }, { "profileId": 2, "name": "Samantha Grey", "title": "Office Manager", "companyName": "Initech", "email": "samantha@initech.com", "isCalendarEventOrganizer": false, "isCalendarInvitee": true } ], "notes": "#### Overview\n* Several options for event venues were reviewed…", "privateNotes": "Ask Samantha about the Sunriver deposit before Friday.", "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": { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com" }, "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" } ], "insights": { "Customer details": [ { "speaker": "John Appleseed", "timestamp": 800, "insight": { "Company name": "Initech", "Number of employees": 120 } } ], "Questions": [ { "insight": "Is this thing on?", "speaker": "Samantha Grey", "timestamp": 49.15 }, { "insight": "When will the webhook integration be ready?", "speaker": "John Appleseed", "timestamp": 120.12 } ] }, "linkAccess": "Viewer", "calendarEvent": { "id": 91, "icalUid": "event-venue-review@google.com", "description": "Quarterly venue review", "platform": "GoogleCalendar", "platformId": "provider-event-id" } }, "properties": { "id": { "description": "Circleback meeting ID. Can be used to generate a link to the meeting (`https://circleback.ai/meetings/${id}`).", "type": "string" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Meeting name." }, "createdAt": { "description": "Meeting creation date, formatted as an ISO 8601 timestamp.", "format": "date-time", "type": "string" }, "updatedAt": { "description": "When the meeting was last updated.", "format": "date-time", "type": "string" }, "duration": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Meeting duration in seconds." }, "url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "URL of the virtual meeting (Zoom, Google Meet, or Microsoft Teams)." }, "recordingUrl": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "URL of the meeting recording file. Only valid for 24 hours, and only available if saving meeting recordings is enabled in settings." }, "tags": { "description": "Tags added to the meeting.", "items": { "additionalProperties": false, "properties": { "id": { "description": "The unique identifier of the tag.", "exclusiveMinimum": 0, "type": "number" }, "name": { "description": "The display name of the tag.", "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "A description of the tag." } }, "required": [ "id", "name", "description" ], "type": "object" }, "type": "array" }, "icalUid": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Unique identifier of the calendar event associated with the meeting." }, "attendees": { "description": "Meeting attendees.", "items": { "additionalProperties": false, "properties": { "profileId": { "description": "The unique identifier of the person's profile.", "exclusiveMinimum": 0, "type": "number" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Calendar event invitee name if associated with a calendar event, or the name of the meeting participant." }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's job title." }, "companyName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The name of the company the person belongs to." }, "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Calendar event invitee email if associated with a calendar event." }, "isCalendarEventOrganizer": { "description": "Whether the attendee organized the calendar event.", "type": "boolean" }, "isCalendarInvitee": { "description": "Whether the attendee was invited on the calendar event.", "type": "boolean" } }, "required": [ "profileId", "name", "email", "title", "companyName", "isCalendarInvitee", "isCalendarEventOrganizer" ], "type": "object" }, "type": "array" }, "notes": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Circleback meeting notes with Markdown formatting." }, "privateNotes": { "description": "The authenticated user's private notes for the meeting.", "type": "string" }, "actionItems": { "description": "Action items created for the meeting.", "items": { "additionalProperties": false, "properties": { "id": { "description": "Circleback action item ID.", "exclusiveMinimum": 0, "type": "number" }, "title": { "description": "Action item title.", "type": "string" }, "description": { "description": "Action item description.", "type": "string" }, "assignee": { "description": "Action item assignee, or null if unassigned.", "anyOf": [ { "additionalProperties": false, "properties": { "profileId": { "description": "The unique identifier of the person's profile.", "exclusiveMinimum": 0, "type": "number" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's full name." }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's job title." }, "companyName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The name of the company the person belongs to." }, "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's email address." } }, "required": [ "profileId", "name", "email", "title", "companyName" ], "type": "object" }, { "type": "null" } ], "example": { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com" } }, "status": { "description": "Action item status, one of 'PENDING' or 'DONE'.", "enum": [ "PENDING", "DONE" ], "type": "string" } }, "required": [ "id", "title", "description", "status", "assignee" ], "type": "object" }, "type": "array" }, "insights": { "additionalProperties": { "items": { "additionalProperties": false, "properties": { "speaker": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Speaker the insight is associated with, if any." }, "timestamp": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Timestamp in seconds the insight is associated with, if any." }, "insight": { "anyOf": [ { "type": "string" }, { "additionalProperties": { "anyOf": [ { "type": "string" }, { "type": "number" }, { "type": "boolean" }, { "type": "null" } ] }, "propertyNames": { "type": "string" }, "type": "object" } ], "description": "The insight result. A string, or an object when the insight has custom fields." } }, "required": [ "speaker", "timestamp", "insight" ], "type": "object" }, "type": "array" }, "description": "Insight results for the meeting, keyed by the name of the user-created insight.", "propertyNames": { "type": "string" }, "type": "object" }, "linkAccess": { "anyOf": [ { "enum": [ "Editor", "Viewer", "LimitedViewer" ], "type": "string" }, { "type": "null" } ], "description": "Who can access the meeting through its shareable link." }, "calendarEvent": { "anyOf": [ { "additionalProperties": false, "properties": { "id": { "description": "The unique identifier of the calendar event.", "exclusiveMinimum": 0, "type": "number" }, "icalUid": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The iCalendar unique identifier of the event." }, "description": { "description": "The description of the calendar event.", "type": "string" }, "platform": { "anyOf": [ { "enum": [ "GoogleCalendar", "MicrosoftOutlook" ], "type": "string" }, { "type": "null" } ], "description": "The calendar platform the event comes from." }, "platformId": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The unique identifier of the event on the calendar platform." } }, "required": [ "id", "platform", "platformId", "description", "icalUid" ], "type": "object" }, { "type": "null" } ] } }, "required": [ "id", "linkAccess", "url", "createdAt", "updatedAt", "duration", "name", "notes", "icalUid", "recordingUrl", "tags", "attendees", "actionItems", "insights", "calendarEvent", "privateNotes" ], "type": "object" }, "type": "array" } } }, "description": "Successful response." }, "400": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "code": { "description": "A machine-readable code identifying the type of failure.", "type": "string" }, "error": { "description": "A human-readable message explaining why the request failed.", "type": "string" }, "seatsToAdd": { "description": "The authoritative number of workspace seats required.", "exclusiveMinimum": 0, "type": "integer" }, "issues": { "description": "The field-level validation issues found in an invalid request.", "items": { "additionalProperties": false, "properties": { "message": { "description": "A human-readable explanation of the validation failure.", "type": "string" }, "path": { "description": "The location of the request field that failed validation.", "type": "string" } }, "required": [ "path", "message" ], "type": "object" }, "type": "array" } }, "required": [ "error" ], "type": "object" } } }, "description": "The request failed validation." }, "429": { "content": { "application/json": { "schema": { "$ref": "#/paths/~1tag/delete/responses/400/content/application~1json/schema" } } }, "description": "The request exceeded the rate limit for the account's plan, which the error message names: 3 requests per second and 20 per minute on Free, 20 per second and 300 per minute on Pro, Business, and Enterprise. Retry after the number of seconds in the `Retry-After` header." } }, "security": [ { "ApiKeyAuth": [] } ], "summary": "Remove tag from meetings", "tags": [ "Tags" ] } } } } ``` # Add tag to meetings (/docs/api/tags/add-tag-to-meetings) ## OpenAPI ```json { "info": { "description": "The Circleback public REST API provides programmatic access to your meetings, notes, action items, transcripts, and more. Authenticate every request by sending your API key as a bearer token.", "title": "Circleback Public API", "version": "1.0.0" }, "openapi": "3.2.0", "servers": [ { "url": "https://circleback.ai/api" } ], "components": { "securitySchemes": { "ApiKeyAuth": { "bearerFormat": "cb_", "scheme": "bearer", "type": "http" } } }, "tags": [ { "description": "Organize meetings with tags and manage tag assignments.", "name": "Tags" } ], "paths": { "/tag": { "put": { "description": "Applies an existing tag to one or more meetings and returns the updated meetings.", "requestBody": { "content": { "application/json": { "schema": { "properties": { "tagId": { "description": "The ID of the tag.", "exclusiveMinimum": 0, "type": "integer" }, "meetingIds": { "description": "The IDs of the meetings to update.", "items": { "description": "The unique identifier of the meeting.", "type": "string" }, "type": "array" } }, "required": [ "tagId" ], "type": "object" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "items": { "additionalProperties": false, "example": { "id": "WRweb12iCBimU6Vo8cD7z", "name": "Event Venue Review", "createdAt": "2023-07-25T20:30:57.926Z", "updatedAt": "2023-07-25T20:30:57.926Z", "duration": 1306.09, "url": "https://meet.google.com/abc-defgh-xyz", "recordingUrl": "https://storage.googleapis.com/circleback-recordings/WRweb12iCBimU6Vo8cD7z.mp4", "tags": [ { "id": 1, "name": "Events", "description": "Company events and offsites." } ], "icalUid": "event-venue-review@google.com", "attendees": [ { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com", "isCalendarEventOrganizer": true, "isCalendarInvitee": true }, { "profileId": 2, "name": "Samantha Grey", "title": "Office Manager", "companyName": "Initech", "email": "samantha@initech.com", "isCalendarEventOrganizer": false, "isCalendarInvitee": true } ], "notes": "#### Overview\n* Several options for event venues were reviewed…", "privateNotes": "Ask Samantha about the Sunriver deposit before Friday.", "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": { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com" }, "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" } ], "insights": { "Customer details": [ { "speaker": "John Appleseed", "timestamp": 800, "insight": { "Company name": "Initech", "Number of employees": 120 } } ], "Questions": [ { "insight": "Is this thing on?", "speaker": "Samantha Grey", "timestamp": 49.15 }, { "insight": "When will the webhook integration be ready?", "speaker": "John Appleseed", "timestamp": 120.12 } ] }, "linkAccess": "Viewer", "calendarEvent": { "id": 91, "icalUid": "event-venue-review@google.com", "description": "Quarterly venue review", "platform": "GoogleCalendar", "platformId": "provider-event-id" } }, "properties": { "id": { "description": "Circleback meeting ID. Can be used to generate a link to the meeting (`https://circleback.ai/meetings/${id}`).", "type": "string" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Meeting name." }, "createdAt": { "description": "Meeting creation date, formatted as an ISO 8601 timestamp.", "format": "date-time", "type": "string" }, "updatedAt": { "description": "When the meeting was last updated.", "format": "date-time", "type": "string" }, "duration": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Meeting duration in seconds." }, "url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "URL of the virtual meeting (Zoom, Google Meet, or Microsoft Teams)." }, "recordingUrl": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "URL of the meeting recording file. Only valid for 24 hours, and only available if saving meeting recordings is enabled in settings." }, "tags": { "description": "Tags added to the meeting.", "items": { "additionalProperties": false, "properties": { "id": { "description": "The unique identifier of the tag.", "exclusiveMinimum": 0, "type": "number" }, "name": { "description": "The display name of the tag.", "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "A description of the tag." } }, "required": [ "id", "name", "description" ], "type": "object" }, "type": "array" }, "icalUid": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Unique identifier of the calendar event associated with the meeting." }, "attendees": { "description": "Meeting attendees.", "items": { "additionalProperties": false, "properties": { "profileId": { "description": "The unique identifier of the person's profile.", "exclusiveMinimum": 0, "type": "number" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Calendar event invitee name if associated with a calendar event, or the name of the meeting participant." }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's job title." }, "companyName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The name of the company the person belongs to." }, "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Calendar event invitee email if associated with a calendar event." }, "isCalendarEventOrganizer": { "description": "Whether the attendee organized the calendar event.", "type": "boolean" }, "isCalendarInvitee": { "description": "Whether the attendee was invited on the calendar event.", "type": "boolean" } }, "required": [ "profileId", "name", "email", "title", "companyName", "isCalendarInvitee", "isCalendarEventOrganizer" ], "type": "object" }, "type": "array" }, "notes": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Circleback meeting notes with Markdown formatting." }, "privateNotes": { "description": "The authenticated user's private notes for the meeting.", "type": "string" }, "actionItems": { "description": "Action items created for the meeting.", "items": { "additionalProperties": false, "properties": { "id": { "description": "Circleback action item ID.", "exclusiveMinimum": 0, "type": "number" }, "title": { "description": "Action item title.", "type": "string" }, "description": { "description": "Action item description.", "type": "string" }, "assignee": { "description": "Action item assignee, or null if unassigned.", "anyOf": [ { "additionalProperties": false, "properties": { "profileId": { "description": "The unique identifier of the person's profile.", "exclusiveMinimum": 0, "type": "number" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's full name." }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's job title." }, "companyName": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The name of the company the person belongs to." }, "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The person's email address." } }, "required": [ "profileId", "name", "email", "title", "companyName" ], "type": "object" }, { "type": "null" } ], "example": { "profileId": 1, "name": "John Appleseed", "title": "Head of Operations", "companyName": "Initech", "email": "john@initech.com" } }, "status": { "description": "Action item status, one of 'PENDING' or 'DONE'.", "enum": [ "PENDING", "DONE" ], "type": "string" } }, "required": [ "id", "title", "description", "status", "assignee" ], "type": "object" }, "type": "array" }, "insights": { "additionalProperties": { "items": { "additionalProperties": false, "properties": { "speaker": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Speaker the insight is associated with, if any." }, "timestamp": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Timestamp in seconds the insight is associated with, if any." }, "insight": { "anyOf": [ { "type": "string" }, { "additionalProperties": { "anyOf": [ { "type": "string" }, { "type": "number" }, { "type": "boolean" }, { "type": "null" } ] }, "propertyNames": { "type": "string" }, "type": "object" } ], "description": "The insight result. A string, or an object when the insight has custom fields." } }, "required": [ "speaker", "timestamp", "insight" ], "type": "object" }, "type": "array" }, "description": "Insight results for the meeting, keyed by the name of the user-created insight.", "propertyNames": { "type": "string" }, "type": "object" }, "linkAccess": { "anyOf": [ { "enum": [ "Editor", "Viewer", "LimitedViewer" ], "type": "string" }, { "type": "null" } ], "description": "Who can access the meeting through its shareable link." }, "calendarEvent": { "anyOf": [ { "additionalProperties": false, "properties": { "id": { "description": "The unique identifier of the calendar event.", "exclusiveMinimum": 0, "type": "number" }, "icalUid": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The iCalendar unique identifier of the event." }, "description": { "description": "The description of the calendar event.", "type": "string" }, "platform": { "anyOf": [ { "enum": [ "GoogleCalendar", "MicrosoftOutlook" ], "type": "string" }, { "type": "null" } ], "description": "The calendar platform the event comes from." }, "platformId": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The unique identifier of the event on the calendar platform." } }, "required": [ "id", "platform", "platformId", "description", "icalUid" ], "type": "object" }, { "type": "null" } ] } }, "required": [ "id", "linkAccess", "url", "createdAt", "updatedAt", "duration", "name", "notes", "icalUid", "recordingUrl", "tags", "attendees", "actionItems", "insights", "calendarEvent", "privateNotes" ], "type": "object" }, "type": "array" } } }, "description": "Successful response." }, "400": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "code": { "description": "A machine-readable code identifying the type of failure.", "type": "string" }, "error": { "description": "A human-readable message explaining why the request failed.", "type": "string" }, "seatsToAdd": { "description": "The authoritative number of workspace seats required.", "exclusiveMinimum": 0, "type": "integer" }, "issues": { "description": "The field-level validation issues found in an invalid request.", "items": { "additionalProperties": false, "properties": { "message": { "description": "A human-readable explanation of the validation failure.", "type": "string" }, "path": { "description": "The location of the request field that failed validation.", "type": "string" } }, "required": [ "path", "message" ], "type": "object" }, "type": "array" } }, "required": [ "error" ], "type": "object" } } }, "description": "The request failed validation." }, "429": { "content": { "application/json": { "schema": { "$ref": "#/paths/~1tag/put/responses/400/content/application~1json/schema" } } }, "description": "The request exceeded the rate limit for the account's plan, which the error message names: 3 requests per second and 20 per minute on Free, 20 per second and 300 per minute on Pro, Business, and Enterprise. Retry after the number of seconds in the `Retry-After` header." } }, "security": [ { "ApiKeyAuth": [] } ], "summary": "Add tag to meetings", "tags": [ "Tags" ] } } } } ``` # Delete tag (/docs/api/tags/delete-tag-delete-tagtagid) ## OpenAPI ```json { "info": { "description": "The Circleback public REST API provides programmatic access to your meetings, notes, action items, transcripts, and more. Authenticate every request by sending your API key as a bearer token.", "title": "Circleback Public API", "version": "1.0.0" }, "openapi": "3.2.0", "servers": [ { "url": "https://circleback.ai/api" } ], "components": { "securitySchemes": { "ApiKeyAuth": { "bearerFormat": "cb_", "scheme": "bearer", "type": "http" } } }, "tags": [ { "description": "Organize meetings with tags and manage tag assignments.", "name": "Tags" } ], "paths": { "/tag/{tagId}": { "delete": { "description": "Permanently deletes a tag and removes it from every meeting it was applied to.", "parameters": [ { "description": "The ID of the tag.", "in": "path", "name": "tagId", "required": true, "schema": { "exclusiveMinimum": 0, "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "additionalProperties": false, "example": { "id": 1, "name": "Events", "description": "Company events and offsites." }, "properties": { "id": { "description": "The unique identifier of the tag.", "exclusiveMinimum": 0, "type": "number" }, "name": { "description": "The display name of the tag.", "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "A description of the tag." } }, "required": [ "id", "name", "description" ], "type": "object" } } }, "description": "Successful response." }, "400": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "code": { "description": "A machine-readable code identifying the type of failure.", "type": "string" }, "error": { "description": "A human-readable message explaining why the request failed.", "type": "string" }, "seatsToAdd": { "description": "The authoritative number of workspace seats required.", "exclusiveMinimum": 0, "type": "integer" }, "issues": { "description": "The field-level validation issues found in an invalid request.", "items": { "additionalProperties": false, "properties": { "message": { "description": "A human-readable explanation of the validation failure.", "type": "string" }, "path": { "description": "The location of the request field that failed validation.", "type": "string" } }, "required": [ "path", "message" ], "type": "object" }, "type": "array" } }, "required": [ "error" ], "type": "object" } } }, "description": "The request failed validation." }, "429": { "content": { "application/json": { "schema": { "$ref": "#/paths/~1tag~1{tagId}/delete/responses/400/content/application~1json/schema" } } }, "description": "The request exceeded the rate limit for the account's plan, which the error message names: 3 requests per second and 20 per minute on Free, 20 per second and 300 per minute on Pro, Business, and Enterprise. Retry after the number of seconds in the `Retry-After` header." } }, "security": [ { "ApiKeyAuth": [] } ], "summary": "Delete tag", "tags": [ "Tags" ] } } } } ``` # Update tag (/docs/api/tags/update-tag) ## OpenAPI ```json { "info": { "description": "The Circleback public REST API provides programmatic access to your meetings, notes, action items, transcripts, and more. Authenticate every request by sending your API key as a bearer token.", "title": "Circleback Public API", "version": "1.0.0" }, "openapi": "3.2.0", "servers": [ { "url": "https://circleback.ai/api" } ], "components": { "securitySchemes": { "ApiKeyAuth": { "bearerFormat": "cb_", "scheme": "bearer", "type": "http" } } }, "tags": [ { "description": "Organize meetings with tags and manage tag assignments.", "name": "Tags" } ], "paths": { "/tag/{tagId}": { "put": { "description": "Updates a tag's name or description.", "parameters": [ { "description": "The ID of the tag.", "in": "path", "name": "tagId", "required": true, "schema": { "exclusiveMinimum": 0, "type": "integer" } } ], "requestBody": { "content": { "application/json": { "schema": { "properties": { "name": { "description": "The display name of the tag.", "type": "string" }, "description": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "description": "A description of the tag." } }, "type": "object" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "additionalProperties": false, "example": { "id": 1, "name": "Events", "description": "Company events and offsites." }, "properties": { "id": { "description": "The unique identifier of the tag.", "exclusiveMinimum": 0, "type": "number" }, "name": { "description": "The display name of the tag.", "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "A description of the tag." } }, "required": [ "id", "name", "description" ], "type": "object" } } }, "description": "Successful response." }, "400": { "content": { "application/json": { "schema": { "additionalProperties": false, "properties": { "code": { "description": "A machine-readable code identifying the type of failure.", "type": "string" }, "error": { "description": "A human-readable message explaining why the request failed.", "type": "string" }, "seatsToAdd": { "description": "The authoritative number of workspace seats required.", "exclusiveMinimum": 0, "type": "integer" }, "issues": { "description": "The field-level validation issues found in an invalid request.", "items": { "additionalProperties": false, "properties": { "message": { "description": "A human-readable explanation of the validation failure.", "type": "string" }, "path": { "description": "The location of the request field that failed validation.", "type": "string" } }, "required": [ "path", "message" ], "type": "object" }, "type": "array" } }, "required": [ "error" ], "type": "object" } } }, "description": "The request failed validation." }, "429": { "content": { "application/json": { "schema": { "$ref": "#/paths/~1tag~1{tagId}/put/responses/400/content/application~1json/schema" } } }, "description": "The request exceeded the rate limit for the account's plan, which the error message names: 3 requests per second and 20 per minute on Free, 20 per second and 300 per minute on Pro, Business, and Enterprise. Retry after the number of seconds in the `Retry-After` header." } }, "security": [ { "ApiKeyAuth": [] } ], "summary": "Update tag", "tags": [ "Tags" ] } } } } ```