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#
- Get a webhook URL from the service you want to use (see below).
- In Macrophone for Mac, open Profiles and add one, such as To-do.
- Paste the URL into Webhook. Leave the destination as Clipboard, or pick an app if you also want the text pasted.
- 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>:
{
"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#
| Service | Where to get the URL | Then |
|---|---|---|
| Zapier | Create 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. |
| n8n | Add a Webhook node, set the method to POST, and copy the production URL. | Read {{ $json.body.text }} in the following nodes. |
| Make | Add a Webhooks › Custom webhook module and copy the address. | Send one dictation so Make learns the structure, then map text. |
| Home Assistant | Create 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:
# 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:
// 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
idif 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.