Integrating email sending into your app doesn’t have to be a pain in the butt. With Helo’s powerful REST API, you’ll be set up in minutes.
Get started
With our straightforward API and SDKs in your favorite languages, sending email is a breeze.
curl --location 'https://api.helohq.com/send/transactional' \
--header "X-Helo-Channel-Id: $HELO_CHANNEL_ID" \
--header "X-Helo-Idempotency-Key: example" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "Authorization: Bearer $HELO_API_KEY" \
--data @- <<EOF
{
"from": { "email": "from@yourdomain.com", "name": "From name" },
"to": [{ "email": "to@example.com", "name": "To name" }],
"subject": "Hello from Helo",
"html": "<html><body><h1>Hi there, new friend.</h1><p>This is a test message, delivered with <3 by Helo.</p></body></html>",
"text": "This is a test message, delivered with <3 by Helo.",
"tags": ["welcome"]
}
EOF
Helo.configure do |config|
config.api_key = ENV.fetch("HELO_API_KEY")
end
send_message_request = Helo::SendMessageRequest.new(
from: Helo::MailAddress.new(email: "from@yourdomain.com", name: "From name"),
to: [Helo::MailAddress.new(email: "to@example.com", name: "To name")],
subject: "Hello from Helo",
html: "<html><body><h1>Hi there, new friend.</h1><p>This is a test message, delivered with <3 by Helo.</p></body></html>",
text: "This is a test message, delivered with <3 by Helo.",
tags: ["welcome"]
)
Helo::Sending.transactional(send_message_request, channel_id: "your-channel-id", idempotency_key: "example")
import Helo from "@helo-email/sdk";
const apiKey = process.env.HELO_API_KEY;
const helo = new Helo(apiKey);
const result = await helo.sending.transactional(
{
from: { email: "from@yourdomain.com", name: "From name" },
to: [{ email: "to@example.com", name: "To name" }],
subject: "Hello from Helo",
html: "<html><body><h1>Hi there, new friend.</h1><p>This is a test message, delivered with <3 by Helo.</p></body></html>",
text: "This is a test message, delivered with <3 by Helo.",
tags: ["welcome"],
},
{
channelId: "your-channel-id",
idempotencyKey: "example",
},
);
using HeloEmail.Sdk;
using HeloEmail.Sdk.Sending;
var response = await helo.Sending.Transactional(new SendMessageRequest
{
From = new MailAddress { Email = "from@yourdomain.com", Name = "From name" },
To = [new MailAddress { Email = "to@example.com", Name = "To name" }],
Subject = "Hello from Helo",
Html = "<html><body><h1>Hi there, new friend.</h1><p>This is a test message, delivered with <3 by Helo.</p></body></html>",
Text = "This is a test message, delivered with <3 by Helo.",
Tags = ["welcome"],
}, channelId: "your-channel-id", idempotencyKey: "example");
package main
import (
"context"
"log"
"os"
"github.com/helo-email/helo-sdk-go"
)
func main() {
client := helo.NewHelo(os.Getenv("HELO_API_KEY"))
ctx := context.Background()
params := &helo.SendMessageRequest{
From: helo.MailAddress{Email: "from@yourdomain.com", Name: "From name"},
To: []helo.MailAddress{{Email: "to@example.com", Name: "To name"}},
Subject: "Hello from Helo",
Html: "<html><body><h1>Hi there, new friend.</h1><p>This is a test message, delivered with <3 by Helo.</p></body></html>",
Text: "This is a test message, delivered with <3 by Helo.",
Tags: []string{"welcome"},
}
opts := &helo.SendingTransactionalOptions{
ChannelID: "your-channel-id",
IdempotencyKey: "example",
}
result, err := client.Sending.Transactional(ctx, params, opts)
if err != nil {
log.Fatal(err)
}
_ = result
}
import sdk_helo_email as helo
client = helo.Helo()
response = client.sending.transactional(
from_={"email": "from@yourdomain.com", "name": "From name"},
to=[{"email": "to@example.com", "name": "To name"}],
subject="Hello from Helo",
html="<html><body><h1>Hi there, new friend.</h1><p>This is a test message, delivered with <3 by Helo.</p></body></html>",
text="This is a test message, delivered with <3 by Helo.",
tags=["welcome"],
channel_id="your-channel-id",
idempotency_key="example",
)
curl --location 'https://api.helohq.com/send/broadcast' \
--header "X-Helo-Channel-Id: $HELO_CHANNEL_ID" \
--header "X-Helo-Idempotency-Key: example" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "Authorization: Bearer $HELO_API_KEY" \
--data @- <<EOF
{
"from": { "email": "from@yourdomain.com", "name": "From name" },
"template": {
"subject": "A test message from {{companyName}}",
"html": "<html><body><h1>Hi {{firstName | default: \"new friend\"}}.</h1><p>This is a test message, delivered with <3 by Helo.</p></body></html>",
"text": "Hi {{firstName | default: \"new friend\"}}, this is a test message, delivered with <3 by Helo.",
"data": { "companyName": "Helo" }
},
"messages": [
{
"to": [{ "email": "recipient@example.com" }],
"data": { "firstName": "Jane" }
}
],
"tags": ["newsletter"],
"tracking": { "opens": true, "links": true }
}
EOF
Helo.configure do |config|
config.api_key = ENV.fetch("HELO_API_KEY")
end
send_broadcast_request = Helo::SendBroadcastRequest.new(
from: Helo::MailAddress.new(email: "from@yourdomain.com", name: "From name"),
template: {
subject: "A test message from {{companyName}}",
html: "<html><body><h1>Hi {{firstName | default: \"new friend\"}}.</h1><p>This is a test message, delivered with <3 by Helo.</p></body></html>",
text: "Hi {{firstName | default: \"new friend\"}}, this is a test message, delivered with <3 by Helo.",
data: {
companyName: "Helo"
}
},
messages: [{
to: [{ email: "recipient@example.com" }],
data: { firstName: "Jane" }
}],
tags: ["newsletter"],
tracking: {
opens: true,
links: true
}
)
Helo::Sending.broadcast(send_broadcast_request, channel_id: "your-channel-id", idempotency_key: "example")
import Helo from "@helo-email/sdk";
const apiKey = process.env.HELO_API_KEY;
const helo = new Helo(apiKey);
const result = await helo.sending.broadcast(
{
from: { email: "from@yourdomain.com", name: "From name" },
template: {
subject: "A test message from {{companyName}}",
html: "<html><body><h1>Hi {{firstName | default: \"new friend\"}}.</h1><p>This is a test message, delivered with <3 by Helo.</p></body></html>",
text: "Hi {{firstName | default: \"new friend\"}}, this is a test message, delivered with <3 by Helo.",
data: {
companyName: "Helo",
},
},
messages: [
{
to: [{ email: "recipient@example.com" }],
data: {
firstName: "Jane",
},
},
],
tags: ["newsletter"],
tracking: { opens: true, links: true },
},
{
channelId: "your-channel-id",
idempotencyKey: "example",
},
);using HeloEmail.Sdk;
using HeloEmail.Sdk.Sending;
var response = await helo.Sending.Broadcast(new SendBroadcastRequest
{
From = new MailAddress { Email = "from@yourdomain.com", Name = "From name" },
Template = new MessageTemplate
{
Subject = "A test message from {{companyName}}",
Html = """<html><body><h1>Hi {{firstName | default: "new friend"}}.</h1><p>This is a test message, delivered with <3 by Helo.</p></body></html>>"",
Text = """Hi {{firstName | default: "new friend"}}, this is a test message, delivered with <3 by Helo.""",
Data = new
{
companyName = "Helo",
},
},
Messages =
[
new BroadcastMessage
{
To = [new MailAddress { Email = "recipient@example.com" }],
Data = new
{
firstName = "Jane",
},
},
],
Tags = ["newsletter"],
Tracking = new SendTracking
{
Opens = true,
Links = true,
},
}, channelId: "your-channel-id", idempotencyKey: "example");
package main
import (
"context"
"log"
"os"
"github.com/helo-email/helo-sdk-go"
)
func main() {
client := helo.NewHelo(os.Getenv("HELO_API_KEY"))
ctx := context.Background()
params := &helo.SendBroadcastRequest{
From: helo.MailAddress{Email: "from@yourdomain.com", Name: "From name"},
Template: helo.SendBroadcastRequestTemplate{
Subject: "A test message from {{companyName}}",
Html: "<html><body><h1>Hi {{firstName | default: \"new friend\"}}.</h1><p>This is a test message, delivered with <3 by Helo.</p></body></html>",
Text: "Hi {{firstName | default: \"new friend\"}}, this is a test message, delivered with <3 by Helo.",
Data: map[string]any{
"companyName": "Helo",
},
},
Messages: []helo.SendBroadcastRequestMessage{{
To: []helo.MailAddress{
{Email: "recipient@example.com"},
},
Data: map[string]any{
"firstName": "Jane",
},
}},
Tags: []string{"newsletter"},
Tracking: &helo.SendBroadcastRequestTracking{
Opens: true,
Links: true,
},
}
opts := &helo.SendingBroadcastOptions{
ChannelID: "your-channel-id",
IdempotencyKey: "example",
}
result, err := client.Sending.Broadcast(ctx, params, opts)
if err != nil {
log.Fatal(err)
}
_ = result
}
import sdk_helo_email as helo
client = helo.Helo()
response = client.sending.broadcast(
from_={"email": "from@yourdomain.com", "name": "From name"},
template={
"subject": "A test message from {{companyName}}",
"html": "<html><body><h1>Hi {{firstName | default: \"new friend\"}}.</h1><p>This is a test message, delivered with <3 by Helo.</p></body></html>",
"text": "Hi {{firstName | default: \"new friend\"}}, this is a test message, delivered with <3 by Helo.",
"data": {"companyName": "Helo"},
},
messages=[{
"to": [{"email": "recipient@example.com"}],
"data": {"firstName": "Jane"},
}],
tags=["newsletter"],
tracking={"opens": True, "links": True},
channel_id="your-channel-id",
idempotency_key="example",
)

Manage domains, retrieve email performance insights, manage suppressions, and so much more. We’ve got endpoints for all your (email-related) needs.
Easily separate transactional mail from broadcast sends
And let Helo take care of optimizing deliverability for either mail type.
Separate email sending for your different customers to avoid deliverability issues. Let your users use their own domains for sending. Provide your users with email performance insights. Helo’s API powers it all.
