Voice messages
iMessage voice messages render as blue voice bubbles with a waveform, play button, and duration — visually distinct from a regular audio attachment. BlueSender preserves this distinction across the wire so your CRM can render voice messages with appropriate UI in both directions.
The bsvm1 identifier
BlueSender marks voice messages with the literal string bsvm1
(BlueSender Voice Message version 1). This is what distinguishes
voice messages from generic audio attachments, in both directions
and across both message bodies and attachment filenames.
| Surface | Where bsvm1 appears |
|---|---|
| Message body | A line containing bsvm1 somewhere in the body. |
| Attachment filename | Pattern: <guid>-bsvm1.wav. |
A CRM should treat the message as a voice message if either surface carries the identifier. Some intermediate file-storage layers strip filename suffixes, so the body identifier is the more reliable of the two.
Inbound: Mac → CRM
When the user records and sends a voice message on the Mac, BlueSender
forwards it via POST /conversations/messages/inbound with:
- The audio uploaded as a WAV attachment in
attachments[]. - The
messagebody containing the GUID, optional transcription, and thebsvm1marker.
Body format
With transcription:
<message-guid>
IMAudioTranscription
<transcription text, possibly multi-line>
bsvm1
Without transcription:
<message-guid>
bsvm1
The metadata footer (when applicable, e.g. for group voice messages)
is appended after bsvm1 separated by a blank line — see
bluesendr-metadata:v1 footer.
Inbound example (with transcription, group)
{
"type": "SMS",
"contactId": "<crm contact id>",
"locationId": "<crm location id>",
"message": "60B0114A-35A1-41B2-8135-A98B084B62BD\nIMAudioTranscription\nHello world\nbsvm1\n\n-- bluesendr-metadata:v1 --\n{\"chat_id\":646,\"is_group\":true,\"message_guid\":\"60B0114A-35A1-41B2-8135-A98B084B62BD\",\"recipients\":[\"+32456791066\",\"+32483119453\"],\"sender\":\"+32487444733\"}\n-- end bluesendr-metadata --",
"attachments": [
"https://.../60B0114A-35A1-41B2-8135-A98B084B62BD-bsvm1.wav"
]
}
Detecting voice messages
function isVoiceMessage(msg) {
// Body check (most reliable)
if (msg.text && msg.text.includes('bsvm1')) return true;
// Filename check (some storage layers strip the suffix)
return (msg.attachments || []).some(url => url.includes('-bsvm1.'));
}
Outbound: CRM → Mac
To send a voice message from your CRM through BlueSender, POST to
/crm/webhook with:
- A WAV attachment URL in the
attachmentsarray. - The string
bsvm1in themessagebody. - Optionally, the
<guid>-bsvm1.wavfilename pattern (preserved if your storage layer permits).
The Mac transcodes the WAV to the iMessage voice-bubble format internally and presents it as a proper voice message in the recipient's Messages app — not as a generic audio attachment.
Outbound examples
Voice message with transcription:
{
"locationId": "<crm location id>",
"contactId": "<crm contact id>",
"messageId": "<crm correlation id>",
"phone": "+15555550100",
"message": "Hello world\nbsvm1",
"attachments": ["https://.../voice-message-bsvm1.wav"]
}
Voice message without transcription:
{
"locationId": "<crm location id>",
"contactId": "<crm contact id>",
"messageId": "<crm correlation id>",
"phone": "+15555550100",
"message": "bsvm1",
"attachments": ["https://.../voice-message-bsvm1.wav"]
}
File format
| Direction | Format |
|---|---|
| Mac → CRM | WAV (PCM). |
| CRM → Mac | WAV. The Mac transcodes internally before delivery. |
CRM responsibilities checklist
- Detect inbound voice messages by checking for
bsvm1inmessage(or-bsvm1in attachment filenames). - Render voice messages with appropriate UI (waveform, duration, play button) — don't show them as generic audio attachments.
- Preserve transcription text (lines between
IMAudioTranscriptionand the trailingbsvm1) if present. - Tag outbound voice messages with
bsvm1in the body. Preserve-bsvm1in the filename if your storage layer allows. - Send WAV, not other audio formats — the Mac's transcoder expects WAV input.
Caveats
- Filename suffix stripping: some CRM media-storage layers rename
uploaded files server-side and remove the
-bsvm1suffix. The body identifier is unaffected; treat it as the primary signal.
Related
bluesendr-metadata:v1footer — carrieschat_idand group context when a voice message arrives in a group thread.- Group messages — voice messages delivered to group threads.
- HTTP Webhooks — both webhook directions.