MyBotBoxMyBotBox

Circleback

Receive meeting notes, action items, and transcripts from Circleback automations via webhook.

Circleback captures meetings and produces notes, action items, and transcripts. This trigger lets Circleback push each processed meeting into a MyBotBox workflow via webhook.

How it works

Circleback doesn't have named event types — instead you create an Automation in Circleback (Settings → Automations → New) with a trigger (e.g. "When meeting ends", "When tagged with X") and the action "Send webhook request". The Automation posts the meeting payload to whatever URL you provide. You supply the MyBotBox-hosted trigger URL from this block.

Setup wizard

  1. Drop the Circleback block onto your workflow canvas.
  2. Copy the generated webhook URL from the trigger configuration panel.
  3. In Circleback: Settings → Automations → New Automation.
    • Pick a trigger condition ("When meeting ends" is the most common).
    • Under Actions, choose Send webhook request.
    • Paste the URL from step 2 into the webhook URL field.
  4. Circleback displays a signing secret. Copy it.
  5. Back in MyBotBox, paste the secret into Signing secret on the trigger block.
  6. Save.

Once you save a non-empty signing secret, you cannot clear it — you can only replace it with a new value. This prevents accidentally reverting to an unauthenticated endpoint on a production trigger.

Request contract

Circleback posts a single JSON shape per meeting. All fields are optional depending on your Automation's "fields to send" toggles. The platform verifies the x-signature header as HMAC-SHA256 over the raw body when a signing secret is configured.

POST /api/webhooks/trigger/{path}
Content-Type: application/json
x-signature: <hex>

{
  "id": 12345,
  "name": "Weekly Team Sync",
  "url": "https://meet.google.com/abc-defg-hij",
  "createdAt": "2026-04-22T15:30:00Z",
  "duration": 1800,
  "recordingUrl": "https://app.circleback.ai/recordings/...",
  "tags": ["team", "weekly"],
  "icalUid": "...",
  "attendees": [{ "name": "Alex", "email": "alex@example.com" }],
  "notes": "## Key points\n- ...",
  "actionItems": [
    { "id": "...", "title": "Ship launch post", "description": "...", "assignee": "Alex", "status": "open" }
  ],
  "transcript": [{ "speaker": "Alex", "text": "...", "timestamp": "..." }],
  "insights": { "decisions": ["..."] }
}

Block outputs

Access via dot notation: <circleback1.actionItems>, <circleback1.transcript[0].text>, etc.

OutputTypeDescription
idnumberMeeting ID
namestringMeeting title
urlstringVirtual meeting URL
durationnumberDuration in seconds
createdAtstringMeeting creation timestamp
recordingUrlstring24-hour valid recording URL
tagsarrayCircleback tags
attendeesarray[{ name, email }]
notesstringMarkdown notes
actionItemsarrayEach has id, title, description, assignee, status
transcriptarrayEach has speaker, text, timestamp
insightsobjectCustom insights you configured
meetingobjectFull payload
hasActionItemsbooleanConvenience: actionItems.length > 0
hasTranscriptbooleanConvenience: transcript.length > 0
hasNotesbooleanConvenience: notes non-empty

Event filter

Circleback doesn't type events, so the trigger offers a payload-shape filter instead:

FilterFires when
any (default)Every Circleback payload
has_action_itemsactionItems array non-empty
has_transcripttranscript array non-empty
has_notesnotes string non-empty

Non-matching payloads return 200 { status: "filtered" } without running the workflow.

Signature verification

The platform uses HMAC-SHA256 over the raw request body. You can re-verify in your own systems using the same pattern:

import { createHmac, timingSafeEqual } from 'node:crypto'

function verify(rawBody, secret, providedSig) {
  const expected = createHmac('sha256', secret).update(rawBody).digest('hex')
  const a = Buffer.from(providedSig.replace(/^sha256=/i, ''), 'hex')
  const b = Buffer.from(expected, 'hex')
  return a.length === b.length && timingSafeEqual(a, b)
}
import hmac, hashlib

def verify(raw_body: bytes, secret: str, provided_sig: str) -> bool:
    expected = hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
    provided = provided_sig.removeprefix("sha256=")
    return hmac.compare_digest(expected, provided)

```text
</Tab>
</Tabs>

## Idempotency

Every Circleback payload carries an `id`. The platform dedupes on that key for 7 days — if Circleback retries the same meeting, the second call returns `200 { status: "duplicate" }` without running the workflow. Disable in the trigger's advanced panel if you need re-delivery.

## Verify with the bundled scripts

<Tabs items={['Bun', 'Python']}>
<Tab value="Bun">
```bash
bun apps/sat/tests/staging/triggers/circleback/verify.ts \
  https://mybotbox.com/api/webhooks/trigger/<path> \
  --secret=<circleback-signing-secret>
python3 apps/sat/tests/staging/triggers/circleback/verify.py \
  https://mybotbox.com/api/webhooks/trigger/<path> \
  --secret=<circleback-signing-secret>

The signature header is the lowercase x-signature carrying the hex HMAC-SHA256 digest. Source: apps/sat/tests/staging/triggers/circleback/.

Common patterns

  • Action items → tasks: route actionItems into a project-management block (Linear, Jira, Asana) when hasActionItems is true.
  • Transcript summarization: when hasTranscript is true, pass transcript to an LLM block for concise summary + email to attendees.
  • Daily digest: buffer meetings with a Schedule trigger that collects the day's Circleback webhooks and emails a wrap-up.

When Circleback isn't the right tool

  • Real-time transcription events — Circleback fires once per meeting, not during. Use the API Prompt trigger with a transcription service instead.
  • Calendar-driven flows (meeting about to start) — use Google Calendar / Outlook triggers; Circleback fires only after a meeting ends.