How LinkedIn voice notes work
LinkedIn voice notes appear as native blue waveform messages in the recipient's inbox, indistinguishable from voice notes recorded directly in the LinkedIn app. Svara delivers them as native voice notes using your authenticated session.
The recipient sees the voice note as if you recorded and sent it from the LinkedIn mobile app. There is no bot indicator, no external link — just a native voice message.
Required session data
To send voice notes on LinkedIn, you need two credentials from an active browser session:
| Field | Description |
|---|---|
| li_at | LinkedIn authentication cookie. Starts with AQEDAQ... |
| csrf_token | CSRF token from the session. Starts with ajax: followed by digits |
How to extract session credentials
- Open LinkedIn in your browser and sign in.
- Open DevTools (F12 or Cmd+Shift+I).
- Go to the Application tab (Chrome) or Storage tab (Firefox).
- Under Cookies, find
linkedin.com. - Copy the value of the
li_atcookie. - Copy the value of the
JSESSIONIDcookie (this is yourcsrf_token). Remove the surrounding quotes if present.
# Example values (these are not real credentials)
li_at="AQEDAQe7xYkA1cXvBnUlP..."
csrf_token="ajax:1234567890123456789"
Store these values securely. Session cookies typically last 6-12 months but can expire if you log out or change your password.
Audio format
LinkedIn voice notes use M4A/AAC format internally. Svara handles format conversion automatically:
| Input format | Behavior | |---|---| | M4A / AAC | Sent directly, no conversion needed | | MP3 | Auto-converted to M4A | | WAV | Auto-converted to M4A | | OGG / OPUS | Auto-converted to M4A | | WebM | Auto-converted to M4A |
Audio files must be under 10 MB. Recommended duration is 15-60 seconds for outreach messages.
Example request
curl -X POST https://api.svarapi.io/v1/send \
-H "Authorization: Bearer $SVARA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"platform": "linkedin",
"recipient": "jane-smith-a1b2c3",
"audio_url": "https://cdn.example.com/notes/intro.m4a",
"session": {
"li_at": "AQEDAQe7xYkA1cXvBnUlP...",
"csrf_token": "ajax:1234567890123456789"
},
"duration": 22
}'
const response = await fetch("https://api.svarapi.io/v1/send", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.SVARA_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
platform: "linkedin",
recipient: "jane-smith-a1b2c3",
audio_url: "https://cdn.example.com/notes/intro.m4a",
session: {
li_at: process.env.LINKEDIN_LI_AT,
csrf_token: process.env.LINKEDIN_CSRF_TOKEN,
},
duration: 22,
}),
});
import requests
response = requests.post(
"https://api.svarapi.io/v1/send",
headers={"Authorization": f"Bearer {api_key}"},
json={
"platform": "linkedin",
"recipient": "jane-smith-a1b2c3",
"audio_url": "https://cdn.example.com/notes/intro.m4a",
"session": {
"li_at": li_at,
"csrf_token": csrf_token,
},
"duration": 22,
},
)
Recipient identifier
The recipient field is the LinkedIn profile slug — the part after linkedin.com/in/ in the profile URL. For example, if the profile URL is https://www.linkedin.com/in/jane-smith-a1b2c3, the recipient is jane-smith-a1b2c3.
Common errors
| Error | Cause | Solution |
|---|---|---|
| session_expired | The li_at cookie has expired | Re-extract the cookie from your browser |
| invalid_csrf | The CSRF token doesn't match the session | Make sure li_at and csrf_token are from the same session |
| recipient_not_found | The profile slug doesn't exist | Check the profile URL and slug format |
| not_connected | You're not connected with the recipient | You can only send voice notes to 1st-degree connections |
| audio_too_large | The audio file exceeds 10 MB | Compress or shorten your audio |
| audio_fetch_failed | Could not download the audio from the URL | Ensure the URL is publicly accessible and returns audio content |