Team
Invite Team Member
Invite a team member by email
POST
/
api
/
v1
/
team
/
invitations
Invite Team Member
curl --request POST \
--url https://api.sequenzy.com/api/v1/team/invitations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"email": "<string>",
"role": "<string>",
"canManageBilling": true
}
'import requests
url = "https://api.sequenzy.com/api/v1/team/invitations"
payload = {
"email": "<string>",
"role": "<string>",
"canManageBilling": True
}
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({email: '<string>', role: '<string>', canManageBilling: true})
};
fetch('https://api.sequenzy.com/api/v1/team/invitations', 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.sequenzy.com/api/v1/team/invitations",
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([
'email' => '<string>',
'role' => '<string>',
'canManageBilling' => true
]),
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.sequenzy.com/api/v1/team/invitations"
payload := strings.NewReader("{\n \"email\": \"<string>\",\n \"role\": \"<string>\",\n \"canManageBilling\": true\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.sequenzy.com/api/v1/team/invitations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"<string>\",\n \"role\": \"<string>\",\n \"canManageBilling\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sequenzy.com/api/v1/team/invitations")
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 \"email\": \"<string>\",\n \"role\": \"<string>\",\n \"canManageBilling\": true\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"invitation": {
"id": "inv_abc123",
"email": "newhire@example.com",
"role": "viewer",
"canManageBilling": false,
"status": "pending",
"invitedAt": "2026-06-11T10:00:00.000Z",
"expiresAt": "2026-06-18T10:00:00.000Z"
}
}
{
"success": true,
"member": {
"id": "member_abc123",
"kind": "member",
"userId": "user_abc123",
"role": "admin",
"canManageBilling": false,
"user": {
"id": "user_abc123",
"name": "John Marketer",
"email": "john@example.com",
"image": null
},
"status": "joined",
"createdAt": "2026-06-11T10:00:00.000Z",
"invitedAt": "2026-06-11T10:00:00.000Z",
"expiresAt": null,
"invitedBy": {
"id": "user_owner123",
"name": "Jane Founder",
"email": "jane@example.com"
}
}
}
{
"success": false,
"error": "Invalid email address"
}
{
"success": false,
"error": "Cannot add the company owner as a team member."
}
{
"success": false,
"error": "You need admin access to manage team members."
}
{
"success": false,
"error": "Only the company owner can grant billing access."
}
{
"success": false,
"error": "Limited team members cannot manage billing."
}
{
"success": false,
"error": "This user is already a member of your team."
}
{
"success": false,
"error": "An invitation is already pending for this email."
}
{
"success": false,
"error": "Too many team invitations were sent recently. Wait before inviting more members, or contact support if you need a higher limit."
}
{
"success": false,
"error": "Failed to send invitation email"
}
Invite someone to your team. If the email belongs to an existing Sequenzy user, they are added to the team immediately and the response includes
Transactional email restrictions also apply when a campaign or sequence references
a transactional template, including alternate email styles and A/B variants.
Marketers cannot read, edit, copy, render, send, or share that protected content,
including its sent-email history, through the dashboard, API, CLI, or MCP.
member. Otherwise an invitation email is sent and the response includes invitation. Invitations expire after 7 days.
Requires owner or admin access. Only the company owner can grant billing access.
Invitation emails are rate limited per company and per inviting user to prevent abuse. If you hit the limit, the endpoint returns 429 - wait before inviting more members or contact support for a higher limit.
Request
string
required
Email address to invite.
string
required
Role for the new member:
admin, marketer, viewer, or restricted.
Marketers create, edit, and send campaigns and sequences and manage
subscribers, lists, tags, and segments, but cannot access transactional
emails, settings, billing, API keys, integrations, or the team. Restricted
members can open direct campaign links only.boolean
Whether the member can manage billing. Defaults to
false. Only the company
owner can set this to true. Marketer and restricted members cannot manage
billing.curl -X POST "https://api.sequenzy.com/api/v1/team/invitations" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"email": "newhire@example.com", "role": "viewer"}'
Responses
{
"success": true,
"invitation": {
"id": "inv_abc123",
"email": "newhire@example.com",
"role": "viewer",
"canManageBilling": false,
"status": "pending",
"invitedAt": "2026-06-11T10:00:00.000Z",
"expiresAt": "2026-06-18T10:00:00.000Z"
}
}
{
"success": true,
"member": {
"id": "member_abc123",
"kind": "member",
"userId": "user_abc123",
"role": "admin",
"canManageBilling": false,
"user": {
"id": "user_abc123",
"name": "John Marketer",
"email": "john@example.com",
"image": null
},
"status": "joined",
"createdAt": "2026-06-11T10:00:00.000Z",
"invitedAt": "2026-06-11T10:00:00.000Z",
"expiresAt": null,
"invitedBy": {
"id": "user_owner123",
"name": "Jane Founder",
"email": "jane@example.com"
}
}
}
{
"success": false,
"error": "Invalid email address"
}
{
"success": false,
"error": "Cannot add the company owner as a team member."
}
{
"success": false,
"error": "You need admin access to manage team members."
}
{
"success": false,
"error": "Only the company owner can grant billing access."
}
{
"success": false,
"error": "Limited team members cannot manage billing."
}
{
"success": false,
"error": "This user is already a member of your team."
}
{
"success": false,
"error": "An invitation is already pending for this email."
}
{
"success": false,
"error": "Too many team invitations were sent recently. Wait before inviting more members, or contact support if you need a higher limit."
}
{
"success": false,
"error": "Failed to send invitation email"
}
⌘I
Invite Team Member
curl --request POST \
--url https://api.sequenzy.com/api/v1/team/invitations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"email": "<string>",
"role": "<string>",
"canManageBilling": true
}
'import requests
url = "https://api.sequenzy.com/api/v1/team/invitations"
payload = {
"email": "<string>",
"role": "<string>",
"canManageBilling": True
}
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({email: '<string>', role: '<string>', canManageBilling: true})
};
fetch('https://api.sequenzy.com/api/v1/team/invitations', 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.sequenzy.com/api/v1/team/invitations",
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([
'email' => '<string>',
'role' => '<string>',
'canManageBilling' => true
]),
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.sequenzy.com/api/v1/team/invitations"
payload := strings.NewReader("{\n \"email\": \"<string>\",\n \"role\": \"<string>\",\n \"canManageBilling\": true\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.sequenzy.com/api/v1/team/invitations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"<string>\",\n \"role\": \"<string>\",\n \"canManageBilling\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sequenzy.com/api/v1/team/invitations")
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 \"email\": \"<string>\",\n \"role\": \"<string>\",\n \"canManageBilling\": true\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"invitation": {
"id": "inv_abc123",
"email": "newhire@example.com",
"role": "viewer",
"canManageBilling": false,
"status": "pending",
"invitedAt": "2026-06-11T10:00:00.000Z",
"expiresAt": "2026-06-18T10:00:00.000Z"
}
}
{
"success": true,
"member": {
"id": "member_abc123",
"kind": "member",
"userId": "user_abc123",
"role": "admin",
"canManageBilling": false,
"user": {
"id": "user_abc123",
"name": "John Marketer",
"email": "john@example.com",
"image": null
},
"status": "joined",
"createdAt": "2026-06-11T10:00:00.000Z",
"invitedAt": "2026-06-11T10:00:00.000Z",
"expiresAt": null,
"invitedBy": {
"id": "user_owner123",
"name": "Jane Founder",
"email": "jane@example.com"
}
}
}
{
"success": false,
"error": "Invalid email address"
}
{
"success": false,
"error": "Cannot add the company owner as a team member."
}
{
"success": false,
"error": "You need admin access to manage team members."
}
{
"success": false,
"error": "Only the company owner can grant billing access."
}
{
"success": false,
"error": "Limited team members cannot manage billing."
}
{
"success": false,
"error": "This user is already a member of your team."
}
{
"success": false,
"error": "An invitation is already pending for this email."
}
{
"success": false,
"error": "Too many team invitations were sent recently. Wait before inviting more members, or contact support if you need a higher limit."
}
{
"success": false,
"error": "Failed to send invitation email"
}