Receive your transcripts
Every time you finish a recording, Ramble POSTs the transcript to each destination you've added — an automation platform, an AI agent, your own backend, or all of them at once. Three steps to set it up.
Add a destination
In Ramble, go to Settings → Send via Webhook and tap Add a destination. Paste in any HTTPS URL — grab one from your automation platform (step 2) or use your own server. Add as many destinations as you want; every transcript fires to all of them.

Connect a destination
Use an automation platform
Create a webhook trigger, copy the URL, paste it into Ramble.
Notion and IFTTT don't accept incoming webhooks directly — use Zapier or Make as a bridge.
Or build your own endpoint
Point Ramble at any HTTPS URL you control. After transcription completes, Ramble sends a POST with Content-Type: application/json. Return any 2xx within 10 seconds to acknowledge receipt. If your endpoint is down or returns an error, Ramble retries up to 3 times with backoff (5s, 30s, 120s) and persists pending webhooks to disk so nothing is lost if the app is closed.
Payload
{
"recording_id": "550e8400-e29b-41d4-a716-446655440000",
"created_at": "2026-03-17T13:19:00Z",
"duration": 138.5,
"transcription": "Just had a great idea for the landing page...",
"device_id": "7a2b3c4d-5e6f-7890-abcd-ef1234567890"
}UUID v4. Unique identifier for this recording.
ISO 8601 timestamp of when the recording was created.
Recording duration in seconds.
Full transcript text. Empty string if transcription produced no output.
Stable per-device UUID. Not tied to any account — useful for distinguishing multiple devices.
Verify the signature
Every request includes an X-Webhook-Signature header — an HMAC-SHA256 digest of the raw request body, keyed with the destination's signing secret. Copy the secret from the destination's detail screen in Settings → Send via Webhook. Always verify before processing to confirm the request came from Ramble.
const crypto = require("crypto");
function verifySignature(rawBody, signatureHeader, secret) {
const hmac = crypto.createHmac("sha256", secret);
hmac.update(rawBody);
const expected = "sha256=" + hmac.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signatureHeader)
);
}If you regenerate the signing secret in Settings, update your server before the next transcription completes.
Full Express server example
const express = require("express");
const crypto = require("crypto");
const app = express();
const WEBHOOK_SECRET = process.env.RAMBLE_WEBHOOK_SECRET;
app.post(
"/webhook",
express.raw({ type: "application/json" }),
(req, res) => {
const signature = req.headers["x-webhook-signature"];
if (!signature) {
return res.status(401).json({ error: "Missing signature" });
}
const hmac = crypto.createHmac("sha256", WEBHOOK_SECRET);
hmac.update(req.body);
const expected = "sha256=" + hmac.digest("hex");
if (
!crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signature)
)
) {
return res.status(401).json({ error: "Invalid signature" });
}
const payload = JSON.parse(req.body);
console.log("Transcription:", payload.transcription);
res.status(200).json({ ok: true });
}
);
app.listen(3000, () => console.log("Listening on :3000"));Test it
Open the destination from Settings → Send via Webhook and tap Send Test Webhook to fire a test payload at that endpoint. The test payload is identical to a real one, with two differences: test is true, and recording_id is prefixed with test-.
{
"recording_id": "test-550e8400-...",
"created_at": "2026-04-09T12:00:00Z",
"duration": 0,
"transcription": "This is a test webhook from Ramble.",
"device_id": "7a2b3c4d-...",
"test": true
}If the test succeeds, you're all set — every future transcription will POST automatically. If it fails, check that your endpoint returns a 2xx and that the URL is correct.