Open Morse

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

GET/voice-notes

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

GET/voice-notes/events

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

GET/voice-notes/search

q 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"
200
{
  "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.

GET/voice-notes/speakers

GET/voice-notes/speakers

curl "$MORSE/voice-notes/speakers" \
  -H "Authorization: Bearer $MORSE_TOKEN"

Erase every voiceprint Morse keeps for you.

DELETE/voice-notes/speakers

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

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

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

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

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

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

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

GET/voice-notes/{note_id}/audio

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

POST/voice-notes/{note_id}/audio

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

POST/voice-notes/{note_id}/audio/abort

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

POST/voice-notes/{note_id}/audio/complete

POST/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).

GET/voice-notes/{note_id}/export

GET/voice-notes/{note_id}/export

curl "$MORSE/voice-notes/3f9c1a24-5e6f-4b31-9a77-1b2c3d4e5f60/export?format=markdown" \
  -H "Authorization: Bearer $MORSE_TOKEN"