Send email messages
Send email from a Heymarket inbox or reply in an existing email conversation.
curl --request POST \
--url https://api.heymarket.com/v1/email/send \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"creator_id": 123,
"inbox": 123,
"text": "<string>",
"raw_text": "<string>",
"local_id": "<string>",
"conv_title": "<string>",
"targets": [
"<string>"
],
"convo_id": 123,
"ai_team_agent_id": 123
}
'import requests
url = "https://api.heymarket.com/v1/email/send"
payload = {
"creator_id": 123,
"inbox": 123,
"text": "<string>",
"raw_text": "<string>",
"local_id": "<string>",
"conv_title": "<string>",
"targets": ["<string>"],
"convo_id": 123,
"ai_team_agent_id": 123
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
creator_id: 123,
inbox: 123,
text: '<string>',
raw_text: '<string>',
local_id: '<string>',
conv_title: '<string>',
targets: ['<string>'],
convo_id: 123,
ai_team_agent_id: 123
})
};
fetch('https://api.heymarket.com/v1/email/send', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.heymarket.com/v1/email/send",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'creator_id' => 123,
'inbox' => 123,
'text' => '<string>',
'raw_text' => '<string>',
'local_id' => '<string>',
'conv_title' => '<string>',
'targets' => [
'<string>'
],
'convo_id' => 123,
'ai_team_agent_id' => 123
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.heymarket.com/v1/email/send"
payload := strings.NewReader("{\n \"creator_id\": 123,\n \"inbox\": 123,\n \"text\": \"<string>\",\n \"raw_text\": \"<string>\",\n \"local_id\": \"<string>\",\n \"conv_title\": \"<string>\",\n \"targets\": [\n \"<string>\"\n ],\n \"convo_id\": 123,\n \"ai_team_agent_id\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.heymarket.com/v1/email/send")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"creator_id\": 123,\n \"inbox\": 123,\n \"text\": \"<string>\",\n \"raw_text\": \"<string>\",\n \"local_id\": \"<string>\",\n \"conv_title\": \"<string>\",\n \"targets\": [\n \"<string>\"\n ],\n \"convo_id\": 123,\n \"ai_team_agent_id\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.heymarket.com/v1/email/send")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"creator_id\": 123,\n \"inbox\": 123,\n \"text\": \"<string>\",\n \"raw_text\": \"<string>\",\n \"local_id\": \"<string>\",\n \"conv_title\": \"<string>\",\n \"targets\": [\n \"<string>\"\n ],\n \"convo_id\": 123,\n \"ai_team_agent_id\": 123\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"convo_id": 123,
"queued": true,
"date": "2023-11-07T05:31:56Z",
"compliance_results": {}
}"<string>"Unauthorized"<string>"too many requestserrortargets, or reply in an existing thread with convo_id.
text field supports HTML. Include raw_text when you want a plain-text fallback for email clients that do not render HTML.Authorizations
Recommended authentication for new integrations. Generate a short-lived JWT from your API Secret ID and API Secret Key, then pass the signed JWT as a bearer token in the Authorization header.
API Secret credentials are available in the Heymarket app under Settings > Integrations > API. The Secret Key is shown only when it is generated, so copy and store it securely before closing the dialog.
Use the following JWT values:
{
"alg": "HS256",
"typ": "JWT"
}
{
"iss": "YOUR_API_SECRET_ID",
"iat": CURRENT_UNIX_TIMESTAMP
}
Replace CURRENT_UNIX_TIMESTAMP with the current Unix timestamp in seconds when generating the token.
Sign the JWT with HMAC-SHA256 using this signing secret:
YOUR_API_SECRET_ID||YOUR_API_SECRET_KEY
Send the signed JWT as a bearer token:
Authorization: Bearer YOUR_SIGNED_JWT
Tokens expire 5 minutes after the iat timestamp. Generate a new JWT per request, or cache it briefly for less than 5 minutes. Generate JWTs only from trusted server-side code; do not expose the API Secret Key in browser, mobile, or other client-side code.
Body
Email message json
Unique identifier for the sender
Unique identifier for the inbox
Email message text (HTML supported)
Plain text version of the email message
Client unique identifier for the message
Title for new conversation if creating one
Array of email addresses with 'to:' or 'cc:' prefixes for new conversations. Each array element can contain multiple comma-separated emails
Unique identifier required for an existing conversation to send the email to the same thread
Signature to append. 'ai_agent' appends the AI agent's email signature; individual sends only
user, ai_agent The AI agent whose signature to append; required when signature_mode is 'ai_agent'
Was this page helpful?
curl --request POST \
--url https://api.heymarket.com/v1/email/send \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"creator_id": 123,
"inbox": 123,
"text": "<string>",
"raw_text": "<string>",
"local_id": "<string>",
"conv_title": "<string>",
"targets": [
"<string>"
],
"convo_id": 123,
"ai_team_agent_id": 123
}
'import requests
url = "https://api.heymarket.com/v1/email/send"
payload = {
"creator_id": 123,
"inbox": 123,
"text": "<string>",
"raw_text": "<string>",
"local_id": "<string>",
"conv_title": "<string>",
"targets": ["<string>"],
"convo_id": 123,
"ai_team_agent_id": 123
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
creator_id: 123,
inbox: 123,
text: '<string>',
raw_text: '<string>',
local_id: '<string>',
conv_title: '<string>',
targets: ['<string>'],
convo_id: 123,
ai_team_agent_id: 123
})
};
fetch('https://api.heymarket.com/v1/email/send', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.heymarket.com/v1/email/send",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'creator_id' => 123,
'inbox' => 123,
'text' => '<string>',
'raw_text' => '<string>',
'local_id' => '<string>',
'conv_title' => '<string>',
'targets' => [
'<string>'
],
'convo_id' => 123,
'ai_team_agent_id' => 123
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.heymarket.com/v1/email/send"
payload := strings.NewReader("{\n \"creator_id\": 123,\n \"inbox\": 123,\n \"text\": \"<string>\",\n \"raw_text\": \"<string>\",\n \"local_id\": \"<string>\",\n \"conv_title\": \"<string>\",\n \"targets\": [\n \"<string>\"\n ],\n \"convo_id\": 123,\n \"ai_team_agent_id\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.heymarket.com/v1/email/send")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"creator_id\": 123,\n \"inbox\": 123,\n \"text\": \"<string>\",\n \"raw_text\": \"<string>\",\n \"local_id\": \"<string>\",\n \"conv_title\": \"<string>\",\n \"targets\": [\n \"<string>\"\n ],\n \"convo_id\": 123,\n \"ai_team_agent_id\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.heymarket.com/v1/email/send")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"creator_id\": 123,\n \"inbox\": 123,\n \"text\": \"<string>\",\n \"raw_text\": \"<string>\",\n \"local_id\": \"<string>\",\n \"conv_title\": \"<string>\",\n \"targets\": [\n \"<string>\"\n ],\n \"convo_id\": 123,\n \"ai_team_agent_id\": 123\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"convo_id": 123,
"queued": true,
"date": "2023-11-07T05:31:56Z",
"compliance_results": {}
}"<string>"Unauthorized"<string>"too many requestserror