Reference
Voice-notes
16 routes, generated from Morse’s own OpenAPI document. Every path below hangs off the base URL, and every one needs the bearer header.
The examples are built from each route’s schema, so the shapes and types are exactly what the API declares. The values are illustrative, and no one has run them.
Your voice notes, newest first, a page at a time (limit, cursor).
/voice-notesNarrow by status,
search with q, or ask only for changes since a time.
GET/voice-notes
curl "$MORSE/voice-notes" \
-H "Authorization: Bearer $MORSE_TOKEN"No replay buffer in v1: every connection opens with resync, and the
client catches up with ?since= (§9.2).
/voice-notes/eventsNot only a connection that sends Last-Event-ID. A stream that was quiet
before it dropped reconnects without one, yet missed whatever changed in the
gap. A stream that falls behind is ended by events for the same reason,
and reconnects into the same resync. One list call per connection is the
whole cost, and a per-user log in memory would be emptied by every deploy
anyway. **Trigger to build replay:** those resyncs showing up as real load.
GET/voice-notes/events
curl "$MORSE/voice-notes/events" \
-H "Authorization: Bearer $MORSE_TOKEN" \
-H "last-event-id: …"Find one of your voice notes by its title, its notes or its transcript, newest first.
/voice-notes/searchq is matched as written, the way a search of meetings matches it, and says where it was
found. The listing's q ranks whole words instead.
GET/voice-notes/search
curl "$MORSE/voice-notes/search?q=pricing" \
-H "Authorization: Bearer $MORSE_TOKEN"{
"items": [
{
"created_at": "2026-10-02T10:30:00+05:30",
"duration_seconds": 30,
"id": "3f9c1a24-5e6f-4b31-9a77-1b2c3d4e5f60",
"match": "title",
"snippet": "…",
"speakers": 1,
"title": "Pricing review"
}
]
}The voices Morse knows from your notes, so it can name who is speaking.
/voice-notes/speakersGET/voice-notes/speakers
curl "$MORSE/voice-notes/speakers" \
-H "Authorization: Bearer $MORSE_TOKEN"Erase every voiceprint Morse keeps for you.
/voice-notes/speakersNeeds all=true.
DELETE/voice-notes/speakers
curl -X DELETE "$MORSE/voice-notes/speakers" \
-H "Authorization: Bearer $MORSE_TOKEN"Save a known speaker under this id: their name and voiceprint.
/voice-notes/speakers/{speaker_id}PUT/voice-notes/speakers/{speaker_id}
curl -X PUT "$MORSE/voice-notes/speakers/3f9c1a24-5e6f-4b31-9a77-1b2c3d4e5f60" \
-H "Authorization: Bearer $MORSE_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "embedding": [ 1 ], "name": "Priya Shah" }'Forget one known speaker and their voiceprint.
/voice-notes/speakers/{speaker_id}DELETE/voice-notes/speakers/{speaker_id}
curl -X DELETE "$MORSE/voice-notes/speakers/3f9c1a24-5e6f-4b31-9a77-1b2c3d4e5f60" \
-H "Authorization: Bearer $MORSE_TOKEN"One of your voice notes, in full. 410 once it has been deleted.
/voice-notes/{note_id}GET/voice-notes/{note_id}
curl "$MORSE/voice-notes/3f9c1a24-5e6f-4b31-9a77-1b2c3d4e5f60" \
-H "Authorization: Bearer $MORSE_TOKEN"Create or replace your voice note with this id; the client chooses the id.
/voice-notes/{note_id}If-Unmodified-
Since refuses to overwrite a newer edit.
PUT/voice-notes/{note_id}
curl -X PUT "$MORSE/voice-notes/3f9c1a24-5e6f-4b31-9a77-1b2c3d4e5f60" \
-H "Authorization: Bearer $MORSE_TOKEN" \
-H "if-unmodified-since: …" \
-H "Content-Type: application/json" \
-d '{ "created_at": "2026-10-02T10:30:00+05:30", "status": "recording" }'Change some fields of one of your voice notes and leave the rest.
/voice-notes/{note_id}If-Unmodified-Since
refuses to overwrite a newer edit.
PATCH/voice-notes/{note_id}
curl -X PATCH "$MORSE/voice-notes/3f9c1a24-5e6f-4b31-9a77-1b2c3d4e5f60" \
-H "Authorization: Bearer $MORSE_TOKEN" \
-H "if-unmodified-since: …" \
-H "Content-Type: application/json" \
-d '{ "deleted_at": "2026-10-02T10:30:00+05:30", "speakers": {}, "title": "Pricing review" }'Soft by default: restorable for 30 days, then erased by the sweep.
/voice-notes/{note_id}?hard=true erases now, and needs a token from /api/auth/reauth/* minted
for this same user in the last five minutes, sent as X-Morse-Recent-Auth
(§14.4). The spec first named it Sec-Fetch-Recent-Auth, which no web page
could ever send: browsers refuse to let scripts set Sec-* headers. Only
the new name is read. An API token counts as that proof (plan 018 D4):
making one was the deliberate act.
DELETE/voice-notes/{note_id}
curl -X DELETE "$MORSE/voice-notes/3f9c1a24-5e6f-4b31-9a77-1b2c3d4e5f60" \
-H "Authorization: Bearer $MORSE_TOKEN" \
-H "x-morse-recent-auth: …"Redirects to a short-lived link to the note's audio.
/voice-notes/{note_id}/audioGET/voice-notes/{note_id}/audio
curl "$MORSE/voice-notes/3f9c1a24-5e6f-4b31-9a77-1b2c3d4e5f60/audio" \
-H "Authorization: Bearer $MORSE_TOKEN"Step 1 of uploading a voice note's audio: where to send it.
/voice-notes/{note_id}/audioPOST/voice-notes/{note_id}/audio
curl -X POST "$MORSE/voice-notes/3f9c1a24-5e6f-4b31-9a77-1b2c3d4e5f60/audio" \
-H "Authorization: Bearer $MORSE_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "content_type": "audio/aac", "sha256": "…", "size_bytes": 3 }'Give up on an audio upload that was started, and discard what arrived.
/voice-notes/{note_id}/audio/abortPOST/voice-notes/{note_id}/audio/abort
curl -X POST "$MORSE/voice-notes/3f9c1a24-5e6f-4b31-9a77-1b2c3d4e5f60/audio/abort" \
-H "Authorization: Bearer $MORSE_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "upload_id": "3f9c1a24-5e6f-4b31-9a77-1b2c3d4e5f60" }'The last step of uploading a voice note's audio: say it has all arrived, and Morse takes it from there.
/voice-notes/{note_id}/audio/completePOST/voice-notes/{note_id}/audio/complete
curl -X POST "$MORSE/voice-notes/3f9c1a24-5e6f-4b31-9a77-1b2c3d4e5f60/audio/complete" \
-H "Authorization: Bearer $MORSE_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "upload_id": "3f9c1a24-5e6f-4b31-9a77-1b2c3d4e5f60" }'Download one of your voice notes as Markdown or plain text (format=markdown or txt).
/voice-notes/{note_id}/exportGET/voice-notes/{note_id}/export
curl "$MORSE/voice-notes/3f9c1a24-5e6f-4b31-9a77-1b2c3d4e5f60/export?format=markdown" \
-H "Authorization: Bearer $MORSE_TOKEN"