Weezly Outreach
|Developer Docs

Messaging API

Send LinkedIn messages through your connected accounts and manage reusable message templates. Sends count against the account's daily message limits, the same counters your campaigns use.

Sending Messages

Send Message

POST/api/messages/send

Send a text message from a connected LinkedIn account. Reply into an existing conversation with chatId, or start a new one with recipientProviderId. The send is rate-limit checked first; when the account's daily message limit is reached or the account is paused, the request is rejected with 429 and never sent.

Request Body

ParameterTypeDescription
accountIdrequiredstringLinkedIn account ID to send from
textrequiredstringMessage text
chatIdstringExisting conversation ID to reply into. Provide this or recipientProviderId.
recipientProviderIdstringRecipient's contact identifier (e.g. from the Pipeline CRM or conversation APIs) to start a new conversation
recipientNamestringRecipient display name, stored on the message log (only used with recipientProviderId)
Request — cURLcURL
curl --location --request POST 'https://outreach.weezly.com/api/messages/send' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "accountId": "cm3acc123mno",
  "recipientProviderId": "contact_abc123",
  "recipientName": "Sarah Chen",
  "text": "Hi Sarah, great connecting with you!"
}'
Response - 200 OKJSON
{
  "success": true,
  "chatId": "chat_xyz789",
  "messageId": "msg_def456"
}
Response - 429 Rate LimitedJSON
{
  "error": "daily_limit_reached",
  "retryAfter": "2026-08-20T00:00:00.000Z"
}

Response Codes

200Message sent
400Missing accountId or text, or neither chatId nor recipientProviderId provided
404Account not found
429Rate limited. error is daily_limit_reached, account_paused, or too_fast; retryAfter is when to retry

Voice note and video message sends (/api/messages/send-voice, /api/messages/send-video) exist for the in-app inbox and require media from your recording library; they are not designed for external integrations.

Message Templates

Reusable message bodies with variables like {{firstName}}, {{lastName}}, {{fullName}}, {{company}}, and {{jobTitle}}. Variables are resolved from the conversation's lead when a template is inserted in the inbox; the send endpoint sends text as-is. Up to 50 templates per user.

List Templates

GET/api/message-templates

List all message templates for the authenticated user, newest first.

Request — cURLcURL
curl --location --request GET 'https://outreach.weezly.com/api/message-templates' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY'
Response - 200 OKJSON
{
  "templates": [
    {
      "id": "mt_001",
      "name": "Thanks for connecting",
      "body": "Hi {{firstName}}, thanks for connecting! I saw you're at {{company}} and wanted to reach out.",
      "createdAt": "2026-08-10T09:00:00.000Z",
      "updatedAt": "2026-08-10T09:00:00.000Z"
    }
  ]
}

Create Template

POST/api/message-templates

Create a message template. Names are capped at 100 characters and bodies at 5,000.

Request Body

ParameterTypeDescription
namerequiredstringTemplate name (max 100 characters)
bodyrequiredstringMessage body, may contain {{variables}} (max 5,000 characters)
Request — cURLcURL
curl --location --request POST 'https://outreach.weezly.com/api/message-templates' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "Follow up",
  "body": "Hi {{firstName}}, just following up on my last message. Would love to hear your thoughts!"
}'
Response - 200 OKJSON
{
  "template": {
    "id": "mt_002",
    "name": "Follow up",
    "body": "Hi {{firstName}}, just following up on my last message. Would love to hear your thoughts!",
    "createdAt": "2026-08-19T10:00:00.000Z",
    "updatedAt": "2026-08-19T10:00:00.000Z"
  }
}

Response Codes

200Template created
400Name and message are required, or the 50-template limit is reached

Update Template

PATCH/api/message-templates/:id

Update a template. Both name and body must be provided (full replace, not a partial patch).

Request Body

ParameterTypeDescription
namerequiredstringTemplate name (max 100 characters)
bodyrequiredstringMessage body (max 5,000 characters)
Request — cURLcURL
curl --location --request PATCH 'https://outreach.weezly.com/api/message-templates/:id' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "Follow up",
  "body": "Hi {{firstName}}, circling back on this. Any thoughts?"
}'
Response - 200 OKJSON
{
  "template": {
    "id": "mt_002",
    "name": "Follow up",
    "body": "Hi {{firstName}}, circling back on this. Any thoughts?",
    "createdAt": "2026-08-19T10:00:00.000Z",
    "updatedAt": "2026-08-19T11:30:00.000Z"
  }
}

Response Codes

200Template updated
400Name and message are required
404Template not found

Delete Template

DELETE/api/message-templates/:id

Delete a message template.

Request — cURLcURL
curl --location --request DELETE 'https://outreach.weezly.com/api/message-templates/:id' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY'
Response - 200 OKJSON
{ "success": true }

Response Codes

200Template deleted
404Template not found