Send a message
Send a message on a thread. The channel (email, Slack, live chat, Microsoft Teams) is auto-detected from the thread's origin and the response includes the channel that was used. Returns 400 with code validation_failed when the matching integration is not configured for the workspace. Requires the messages:write scope; Slack replies need the Pro plan and Teams replies the Scale plan.
curl -X POST "https://productlane.com/api/v2/threads/{thread_id}/messages" \
-H "Authorization: Bearer $PRODUCTLANE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "string"
}'Authorization
AuthorizationstringheaderrequiredBearer authentication header of the form
Bearer <token>, where<token>is your auth token.
Parameters
thread_idstringpathrequired
Body
contentstringrequiredMessage body (HTML).
ccobject[]Applied only to email-channel threads.
bccobject[]Applied only to email-channel threads.
attachmentsobject[]Applied only to email-channel threads.
channel_idstringSlack channel id. Required for Slack threads unless one is stored on the thread.
authorenum<string>user(default) sends the message as your workspace user. On acustomthread nothing is delivered:message.sentcarries the reply to your integration.contactrecords the message as inbound from the thread's contact. On email and live chat threads that triggers nothing; on acustomthread it works like an inbound email: the thread reopens, notifications fire and the AI agent may answer. Not supported on Slack and Teams threads.One of:usercontactexternal_message_idstringCustom channel threads only: your id for an inbound message. A repeat with the same id returns the stored message and creates nothing.
Response
Successful response
idstringrequiredthread_idstringrequiredchannelenum<string>requiredOne of:emailslacklive_chatteamscustomcustom_channelstring | nullChannel name on a
customthread, such aswhatsapp.deduplicatedbooleanTrue when
external_message_idmatched a stored message and nothing new was created.
{
"id": "string",
"thread_id": "string",
"channel": "email",
"custom_channel": "string",
"deduplicated": true
}