Macrophone

Recipes

Send every dictation to a webhook

Turn your voice into a trigger for any automation: a task in your to-do app, a row in a spreadsheet, a message to your team, or a light that turns on.

This sends text off your devices. By default, Macrophone keeps everything on your iPhone and Mac. A webhook sends each dictation’s text to the URL you choose, under that service’s privacy terms. Audio is never sent; Macrophone doesn’t keep any.

Set up the profile#

  1. Get a webhook URL from the service you want to use (see below).
  2. In Macrophone for Mac, open Profiles and add one, such as To-do.
  3. Paste the URL into Webhook. Leave the destination as Clipboard, or pick an app if you also want the text pasted.
  4. Dictate with that profile on your iPhone. Each dictation is posted once it reaches your Mac.

To send every dictation, add the webhook to your default profile.

What gets sent#

A POST with Content-Type: application/json and User-Agent: Macrophone/<version>:

POST body
{
  "id": "6F1C2A7E-3B4D-4C55-9A0E-2D8F1B7C9E10",
  "text": "Book the dentist for next week and move the car service to Friday.",
  "raw": "um book the dentist for next week and and move the car service to Friday",
  "cleaned": "Book the dentist for next week and move the car service to Friday.",
  "profile": "To-do",
  "created_at": "2026-10-12T20:41:03Z",
  "language": "en-US",
  "source_device": "Alex's iPhone",
  "delayed": false
}

text is the one to use: it's the cleaned text with the profile's snippets, format and template applied. Requests time out after 10 seconds and are retried once after 3 seconds, so your receiver may occasionally see the same id twice. Field details are in the profiles docs.

Zapier, n8n, Make, Home Assistant#

ServiceWhere to get the URLThen
ZapierCreate a Zap with Webhooks by Zapier › Catch Hook as the trigger and copy its URL.Map text into the next step, such as a Todoist task or a Slack message.
n8nAdd a Webhook node, set the method to POST, and copy the production URL.Read {{ $json.body.text }} in the following nodes.
MakeAdd a Webhooks › Custom webhook module and copy the address.Send one dictation so Make learns the structure, then map text.
Home AssistantCreate an automation with a Webhook trigger. The URL is https://<your-home-assistant>/api/webhook/<webhook_id>.Use {{ trigger.json.text }} in the actions.

Home Assistant on your home network can also be reached at its local address, in which case the text never leaves your network.

Test it locally#

Before pointing it at a service, check what arrives with a tiny receiver on your Mac. Run this, then set the profile's webhook to http://127.0.0.1:8787 and dictate something:

Python
# save as receive.py, run with: python3 receive.py
import json
from http.server import BaseHTTPRequestHandler, HTTPServer

class Hook(BaseHTTPRequestHandler):
    def do_POST(self):
        body = json.loads(self.rfile.read(int(self.headers["Content-Length"])))
        print(f"{body['created_at']}  [{body['profile']}]  {body['text']}", flush=True)
        self.send_response(204)
        self.end_headers()

HTTPServer(("127.0.0.1", 8787), Hook).serve_forever()

Or the same in Node:

Node.js
// save as receive.mjs, run with: node receive.mjs
import { createServer } from 'node:http';

createServer(async (req, res) => {
  let raw = '';
  for await (const chunk of req) raw += chunk;
  const body = JSON.parse(raw);
  console.log(body.created_at, `[${body.profile}]`, body.text);
  res.writeHead(204).end();
}).listen(8787, '127.0.0.1');

Keep it safe#

  • Use HTTPS for anything outside your own network.
  • Treat the URL as a secret. Webhook URLs from Zapier, n8n and Make are hard to guess; anyone who has one can post to it. Don't share them in screenshots.
  • Ignore duplicates by id if a repeat would do harm, such as creating the same task twice.
  • Check delayed. A dictation that waited in the phone's offline queue arrives with "delayed": true, possibly much later than it was spoken. You may not want to act on it automatically.