RambleRamble
← Back to Ramble

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.

1

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.

Ramble Send via Webhook settings screen with an Add a destination button
2

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

json
{
  "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"
}
recording_idstring

UUID v4. Unique identifier for this recording.

created_atstring

ISO 8601 timestamp of when the recording was created.

durationnumber

Recording duration in seconds.

transcriptionstring

Full transcript text. Empty string if transcription produced no output.

device_idstring

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.

verify.js
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
server.js
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"));
3

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-.

json
{
  "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.