Nitrosend API
v1.0.0https://api.nitrosend.comProductionhttp://localhost:8000Local developmentMulti-channel marketing automation API. Send email campaigns, build automation flows, manage contacts and segments, track events, and configure your brand — all via a single REST API.
Authentication
All /v1/my/* endpoints require authentication via Bearer token.
Two token types are accepted (tried in order):
- API Key —
Authorization: Bearer nskey_live_... - JWT —
Authorization: Bearer <jwt>(obtained fromPOST /v1/login)
Pagination
Paginated endpoints return these headers:
X-Total-Count— total recordsX-Total-Pages— total pagesX-Page-Number— current pageX-Next-Page— next page (omitted on last page)X-Prev-Page— previous page (omitted on first page)
Use page and limit (or per) query params to control pagination.
Maximum limit is 100, default is 30.
Error Responses
All errors return a consistent JSON shape:
{
"code": 422,
"message": "Description of error",
"error": true,
"validation_errors": { "field": ["error message"] }
}The validation_errors key is only present on 422 responses.
Authentication
BearerAuthhttpAPI key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
Scheme: bearer
Auth
Login, logout, and registration
Create a new account
Body
userobjectrequiredResponse
Account created
Validation failed
curl -X POST 'https://api.nitrosend.com/v1/signup' \
-H 'Content-Type: application/json' \
-d '{
"user": {
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"mobile": "string",
"invite_token": "string",
"password": "********",
"password_confirmation": "********"
}
}'const response = await fetch('https://api.nitrosend.com/v1/signup', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"user": {
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"mobile": "string",
"invite_token": "string",
"password": "********",
"password_confirmation": "********"
}
}),
});
const data = await response.json();import requests
payload = {
"user": {
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"mobile": "string",
"invite_token": "string",
"password": "********",
"password_confirmation": "********"
}
}
response = requests.post('https://api.nitrosend.com/v1/signup', json=payload)
data = response.json(){
"user": {
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"mobile": "string",
"invite_token": "string",
"password": "********",
"password_confirmation": "********"
}
}{
"id": 0,
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"mobile": "string",
"country_code": "string",
"admin": true,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Sign in and receive a JWT
Body
userobjectrequiredResponse
Signed in
Not authenticated
curl -X POST 'https://api.nitrosend.com/v1/login' \
-H 'Content-Type: application/json' \
-d '{
"user": {
"email": "user@example.com",
"password": "********"
}
}'const response = await fetch('https://api.nitrosend.com/v1/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"user": {
"email": "user@example.com",
"password": "********"
}
}),
});
const data = await response.json();import requests
payload = {
"user": {
"email": "user@example.com",
"password": "********"
}
}
response = requests.post('https://api.nitrosend.com/v1/login', json=payload)
data = response.json(){
"user": {
"email": "user@example.com",
"password": "********"
}
}{
"id": 0,
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"mobile": "string",
"country_code": "string",
"admin": true,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Sign out and revoke JWT
Response
Signed out
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X DELETE 'https://api.nitrosend.com/v1/logout'const response = await fetch('https://api.nitrosend.com/v1/logout', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.nitrosend.com/v1/logout')
data = response.json()Get OAuth popup context
Returns the account-selection and subscription context used by the
/oauth/connect popup. This endpoint accepts the normal Bearer JWT
and, for popup resume flows, the authenticated browser session cookie
established by Devise/OmniAuth.
Response
Popup context
Not authenticated
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/oauth/me'const response = await fetch('https://api.nitrosend.com/v1/oauth/me', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/oauth/me')
data = response.json(){
"accounts": [
{
"id": 0,
"name": "string",
"can_manage": true,
"needs_subscribe": true
}
],
"plans": [
{
"id": 0,
"name": "string",
"slug": "string",
"base_price_cents": 0,
"interval": "string"
}
],
"stripe_publishable_key": "string"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Subscribe the selected OAuth popup account
Finalizes plan selection for the /oauth/connect popup before the
browser returns to the Doorkeeper consent screen. This endpoint accepts
the normal Bearer JWT and, for popup resume flows, the authenticated
browser session cookie established by Devise/OmniAuth.
Body
plan_idintegerrequiredaccount_idinteger | nullstripe_tokenstring | nullResponse
Popup can continue to consent
Not authenticated
Account or plan selection failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/oauth/subscribe' \
-H 'Content-Type: application/json' \
-d '{
"plan_id": 0,
"account_id": 0,
"stripe_token": "string"
}'const response = await fetch('https://api.nitrosend.com/v1/oauth/subscribe', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"plan_id": 0,
"account_id": 0,
"stripe_token": "string"
}),
});
const data = await response.json();import requests
payload = {
"plan_id": 0,
"account_id": 0,
"stripe_token": "string"
}
response = requests.post('https://api.nitrosend.com/v1/oauth/subscribe', json=payload)
data = response.json(){
"plan_id": 0,
"account_id": 0,
"stripe_token": "string"
}{
"next_step": "consent"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}{
"error": "string"
}Create a CSRF-safe OAuth provider launch URL
Mints a short-lived launch URL for Google or GitHub sign-in. The
frontend follows the returned API-origin launch page, which renders the
real POST form to /auth/:provider with a valid Rails authenticity
token. This preserves OmniAuth's POST-only request phase and CSRF
protection for both the app popup flow and the /oauth/connect agent
popup flow.
Body
providerstringgoogle_oauth2githubrequiredauth_intentstringappagentappauth_stepstringloginsignuploginresume_urlstring<uri> | nullRequired when auth_intent=agent; must point to the frontend /oauth/connect route.
Response
Launch URL created
Invalid provider or resume URL
curl -X POST 'https://api.nitrosend.com/v1/oauth/launch' \
-H 'Content-Type: application/json' \
-d '{
"provider": "google_oauth2",
"auth_intent": "app",
"auth_step": "login",
"resume_url": "https://example.com"
}'const response = await fetch('https://api.nitrosend.com/v1/oauth/launch', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"provider": "google_oauth2",
"auth_intent": "app",
"auth_step": "login",
"resume_url": "https://example.com"
}),
});
const data = await response.json();import requests
payload = {
"provider": "google_oauth2",
"auth_intent": "app",
"auth_step": "login",
"resume_url": "https://example.com"
}
response = requests.post('https://api.nitrosend.com/v1/oauth/launch', json=payload)
data = response.json(){
"provider": "google_oauth2",
"auth_intent": "app",
"auth_step": "login",
"resume_url": "https://example.com"
}{
"launch_url": "https://example.com"
}{
"error": "string"
}User
Current user profile
Get current user profile
Response
User profile
Not authenticated
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/user'const response = await fetch('https://api.nitrosend.com/v1/my/user', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/user')
data = response.json(){
"id": 0,
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"mobile": "string",
"country_code": "string",
"admin": true,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Update current user profile
Body
first_namestringlast_namestringemailstring<email>mobilestringResponse
Updated user
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X PATCH 'https://api.nitrosend.com/v1/my/user' \
-H 'Content-Type: application/json' \
-d '{
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"mobile": "string"
}'const response = await fetch('https://api.nitrosend.com/v1/my/user', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"mobile": "string"
}),
});
const data = await response.json();import requests
payload = {
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"mobile": "string"
}
response = requests.patch('https://api.nitrosend.com/v1/my/user', json=payload)
data = response.json(){
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"mobile": "string"
}{
"id": 0,
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"mobile": "string",
"country_code": "string",
"admin": true,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Account
Account settings and configuration
Get account details
Response
Account with brands and billing
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/account'const response = await fetch('https://api.nitrosend.com/v1/my/account', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/account')
data = response.json(){
"id": 0,
"name": "string",
"avatar": "string",
"banner": "string",
"account_tier": "free",
"safe_mode_enabled": true,
"billing": {
"plan_name": "string",
"wallet_balance_cents": 0,
"auto_topup": true,
"resources": {
"email": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0
},
"sms": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0
},
"ai": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0
}
},
"lifetime": {
"email_sent": 0,
"sms_sent": 0,
"ai_used": 0
}
},
"brands": [
{
"id": 0,
"sid": "string",
"account_id": 0,
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"font_heading": "string",
"font_body": "string",
"style_notes": "string",
"tone": "string",
"company_description": "string",
"industry": "string",
"example_copy": [
"string"
],
"default_header": {},
"default_footer": {},
"default_theme": {},
"physical_address": "string",
"company_name": "string",
"source_url": "string",
"last_scraped_at": "2024-01-15T09:30:00Z",
"links": [
{
"url": "string",
"icon": "string",
"title": "string"
}
],
"logo": "string",
"complete": true,
"email_from_name": "string",
"email_from_email": "string",
"email_reply_to": "string",
"test_email_recipients": [
"user@example.com"
],
"onboarding_state": {},
"onboarding": {
"steps": {},
"progress": {
"completed": 0,
"total": 0
}
},
"domain_verified": true,
"can_send": true,
"subscribed_contacts_count": 0,
"using_sandbox": true,
"sandbox_email": "string",
"sandbox_monthly_cap": 0,
"sandbox_sends_remaining": 0,
"capabilities": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
],
"team": {
"seat_limit": 0,
"seat_count": 0,
"member_count": 0,
"invite_count": 0,
"current_role": "string",
"can_manage_team": true
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}Update account settings
Body
namestringavatarstringSigned blob ID
bannerstringSigned blob ID
Response
Updated account
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X PATCH 'https://api.nitrosend.com/v1/my/account' \
-H 'Content-Type: application/json' \
-d '{
"name": "string",
"avatar": "string",
"banner": "string"
}'const response = await fetch('https://api.nitrosend.com/v1/my/account', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "string",
"avatar": "string",
"banner": "string"
}),
});
const data = await response.json();import requests
payload = {
"name": "string",
"avatar": "string",
"banner": "string"
}
response = requests.patch('https://api.nitrosend.com/v1/my/account', json=payload)
data = response.json(){
"name": "string",
"avatar": "string",
"banner": "string"
}{
"id": 0,
"name": "string",
"avatar": "string",
"banner": "string",
"account_tier": "free",
"safe_mode_enabled": true,
"billing": {
"plan_name": "string",
"wallet_balance_cents": 0,
"auto_topup": true,
"resources": {
"email": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0
},
"sms": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0
},
"ai": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0
}
},
"lifetime": {
"email_sent": 0,
"sms_sent": 0,
"ai_used": 0
}
},
"brands": [
{
"id": 0,
"sid": "string",
"account_id": 0,
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"font_heading": "string",
"font_body": "string",
"style_notes": "string",
"tone": "string",
"company_description": "string",
"industry": "string",
"example_copy": [
"string"
],
"default_header": {},
"default_footer": {},
"default_theme": {},
"physical_address": "string",
"company_name": "string",
"source_url": "string",
"last_scraped_at": "2024-01-15T09:30:00Z",
"links": [
{
"url": "string",
"icon": "string",
"title": "string"
}
],
"logo": "string",
"complete": true,
"email_from_name": "string",
"email_from_email": "string",
"email_reply_to": "string",
"test_email_recipients": [
"user@example.com"
],
"onboarding_state": {},
"onboarding": {
"steps": {},
"progress": {
"completed": 0,
"total": 0
}
},
"domain_verified": true,
"can_send": true,
"subscribed_contacts_count": 0,
"using_sandbox": true,
"sandbox_email": "string",
"sandbox_monthly_cap": 0,
"sandbox_sends_remaining": 0,
"capabilities": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
],
"team": {
"seat_limit": 0,
"seat_count": 0,
"member_count": 0,
"invite_count": 0,
"current_role": "string",
"can_manage_team": true
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}List accessible accounts
Response
Accessible accounts
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/accounts'const response = await fetch('https://api.nitrosend.com/v1/my/accounts', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/accounts')
data = response.json()[
{
"id": 0,
"name": "string",
"avatar": "string",
"banner": "string",
"account_tier": "free",
"safe_mode_enabled": true,
"billing": {
"plan_name": "string",
"wallet_balance_cents": 0,
"auto_topup": true,
"resources": {
"email": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0
},
"sms": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0
},
"ai": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0
}
},
"lifetime": {
"email_sent": 0,
"sms_sent": 0,
"ai_used": 0
}
},
"brands": [
{
"id": 0,
"sid": "string",
"account_id": 0,
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"font_heading": "string",
"font_body": "string",
"style_notes": "string",
"tone": "string",
"company_description": "string",
"industry": "string",
"example_copy": [
"string"
],
"default_header": {},
"default_footer": {},
"default_theme": {},
"physical_address": "string",
"company_name": "string",
"source_url": "string",
"last_scraped_at": "2024-01-15T09:30:00Z",
"links": [
{
"url": "string",
"icon": "string",
"title": "string"
}
],
"logo": "string",
"complete": true,
"email_from_name": "string",
"email_from_email": "string",
"email_reply_to": "string",
"test_email_recipients": [
"user@example.com"
],
"onboarding_state": {},
"onboarding": {
"steps": {},
"progress": {
"completed": 0,
"total": 0
}
},
"domain_verified": true,
"can_send": true,
"subscribed_contacts_count": 0,
"using_sandbox": true,
"sandbox_email": "string",
"sandbox_monthly_cap": 0,
"sandbox_sends_remaining": 0,
"capabilities": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
],
"team": {
"seat_limit": 0,
"seat_count": 0,
"member_count": 0,
"invite_count": 0,
"current_role": "string",
"can_manage_team": true
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]Get team metadata for the current account
Response
Team metadata
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/account/team'const response = await fetch('https://api.nitrosend.com/v1/my/account/team', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/account/team')
data = response.json(){
"account": {
"id": 0,
"name": "string",
"avatar": "string",
"banner": "string",
"account_tier": "free",
"safe_mode_enabled": true,
"billing": {
"plan_name": "string",
"wallet_balance_cents": 0,
"auto_topup": true,
"resources": {
"email": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0
},
"sms": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0
},
"ai": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0
}
},
"lifetime": {
"email_sent": 0,
"sms_sent": 0,
"ai_used": 0
}
},
"brands": [
{
"id": 0,
"sid": "string",
"account_id": 0,
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"font_heading": "string",
"font_body": "string",
"style_notes": "string",
"tone": "string",
"company_description": "string",
"industry": "string",
"example_copy": [
"string"
],
"default_header": {},
"default_footer": {},
"default_theme": {},
"physical_address": "string",
"company_name": "string",
"source_url": "string",
"last_scraped_at": "2024-01-15T09:30:00Z",
"links": [
{
"url": "string",
"icon": "string",
"title": "string"
}
],
"logo": "string",
"complete": true,
"email_from_name": "string",
"email_from_email": "string",
"email_reply_to": "string",
"test_email_recipients": [
"user@example.com"
],
"onboarding_state": {},
"onboarding": {
"steps": {},
"progress": {
"completed": 0,
"total": 0
}
},
"domain_verified": true,
"can_send": true,
"subscribed_contacts_count": 0,
"using_sandbox": true,
"sandbox_email": "string",
"sandbox_monthly_cap": 0,
"sandbox_sends_remaining": 0,
"capabilities": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
],
"team": {
"seat_limit": 0,
"seat_count": 0,
"member_count": 0,
"invite_count": 0,
"current_role": "string",
"can_manage_team": true
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
},
"memberships": [
{
"id": 0,
"role": "member",
"user_id": 0,
"email": "user@example.com",
"name": "string",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
],
"invites": [
{
"id": 0,
"account_id": 0,
"email": "user@example.com",
"role": "member",
"token": "string",
"status": "pending",
"accepted_at": "2024-01-15T09:30:00Z",
"revoked_at": "2024-01-15T09:30:00Z",
"expires_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
],
"accessible_accounts": [
{
"id": 0,
"name": "string",
"avatar": "string",
"banner": "string",
"account_tier": "free",
"safe_mode_enabled": true,
"billing": {
"plan_name": "string",
"wallet_balance_cents": 0,
"auto_topup": true,
"resources": {
"email": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0
},
"sms": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0
},
"ai": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0
}
},
"lifetime": {
"email_sent": 0,
"sms_sent": 0,
"ai_used": 0
}
},
"brands": [
{
"id": 0,
"sid": "string",
"account_id": 0,
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"font_heading": "string",
"font_body": "string",
"style_notes": "string",
"tone": "string",
"company_description": "string",
"industry": "string",
"example_copy": [
"string"
],
"default_header": {},
"default_footer": {},
"default_theme": {},
"physical_address": "string",
"company_name": "string",
"source_url": "string",
"last_scraped_at": "2024-01-15T09:30:00Z",
"links": [
{
"url": "string",
"icon": "string",
"title": "string"
}
],
"logo": "string",
"complete": true,
"email_from_name": "string",
"email_from_email": "string",
"email_reply_to": "string",
"test_email_recipients": [
"user@example.com"
],
"onboarding_state": {},
"onboarding": {
"steps": {},
"progress": {
"completed": 0,
"total": 0
}
},
"domain_verified": true,
"can_send": true,
"subscribed_contacts_count": 0,
"using_sandbox": true,
"sandbox_email": "string",
"sandbox_monthly_cap": 0,
"sandbox_sends_remaining": 0,
"capabilities": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
],
"team": {
"seat_limit": 0,
"seat_count": 0,
"member_count": 0,
"invite_count": 0,
"current_role": "string",
"can_manage_team": true
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}List account memberships
Response
Memberships
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/account/memberships'const response = await fetch('https://api.nitrosend.com/v1/my/account/memberships', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/account/memberships')
data = response.json()[
{
"id": 0,
"role": "member",
"user_id": 0,
"email": "user@example.com",
"name": "string",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]Remove a membership
Parameters
idintegerrequiredpathResponse
Removed membership
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X DELETE 'https://api.nitrosend.com/v1/my/account/memberships/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/account/memberships/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.nitrosend.com/v1/my/account/memberships/{id}')
data = response.json(){
"id": 0,
"role": "member",
"user_id": 0,
"email": "user@example.com",
"name": "string",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}Update a membership role
Body
rolestringmemberadminParameters
idintegerrequiredpathResponse
Updated membership
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X PATCH 'https://api.nitrosend.com/v1/my/account/memberships/{id}' \
-H 'Content-Type: application/json' \
-d '{
"role": "member"
}'const response = await fetch('https://api.nitrosend.com/v1/my/account/memberships/{id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"role": "member"
}),
});
const data = await response.json();import requests
payload = {
"role": "member"
}
response = requests.patch('https://api.nitrosend.com/v1/my/account/memberships/{id}', json=payload)
data = response.json(){
"role": "member"
}{
"id": 0,
"role": "member",
"user_id": 0,
"email": "user@example.com",
"name": "string",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}List account invites
Response
Invites
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/account/invites'const response = await fetch('https://api.nitrosend.com/v1/my/account/invites', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/account/invites')
data = response.json()[
{
"id": 0,
"account_id": 0,
"email": "user@example.com",
"role": "member",
"token": "string",
"status": "pending",
"accepted_at": "2024-01-15T09:30:00Z",
"revoked_at": "2024-01-15T09:30:00Z",
"expires_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]Create an account invite
Body
emailstring<email>requiredrolestringmemberadminResponse
Created invite
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/account/invites' \
-H 'Content-Type: application/json' \
-d '{
"email": "user@example.com",
"role": "member"
}'const response = await fetch('https://api.nitrosend.com/v1/my/account/invites', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"email": "user@example.com",
"role": "member"
}),
});
const data = await response.json();import requests
payload = {
"email": "user@example.com",
"role": "member"
}
response = requests.post('https://api.nitrosend.com/v1/my/account/invites', json=payload)
data = response.json(){
"email": "user@example.com",
"role": "member"
}{
"id": 0,
"account_id": 0,
"email": "user@example.com",
"role": "member",
"token": "string",
"status": "pending",
"accepted_at": "2024-01-15T09:30:00Z",
"revoked_at": "2024-01-15T09:30:00Z",
"expires_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Revoke an invite
Parameters
idintegerrequiredpathResponse
Revoked invite
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X DELETE 'https://api.nitrosend.com/v1/my/account/invites/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/account/invites/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.nitrosend.com/v1/my/account/invites/{id}')
data = response.json(){
"id": 0,
"account_id": 0,
"email": "user@example.com",
"role": "member",
"token": "string",
"status": "pending",
"accepted_at": "2024-01-15T09:30:00Z",
"revoked_at": "2024-01-15T09:30:00Z",
"expires_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}Accept an invite token
Parameters
idstringrequiredpathResponse
Accepted invite
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/account/invites/{id}/accept'const response = await fetch('https://api.nitrosend.com/v1/my/account/invites/{id}/accept', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.nitrosend.com/v1/my/account/invites/{id}/accept')
data = response.json(){
"id": 0,
"account_id": 0,
"email": "user@example.com",
"role": "member",
"token": "string",
"status": "pending",
"accepted_at": "2024-01-15T09:30:00Z",
"revoked_at": "2024-01-15T09:30:00Z",
"expires_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Contacts
Contact management
List contacts (paginated)
Parameters
pageinteger1querylimitinteger50querysearchstringqueryFull-text search across name, email, phone
list_idintegerqueryFilter contacts belonging to this list
tagstringqueryFilter contacts that have this tag. Tags are stored as an array of
strings under data.tags. Only one tag filter is supported here;
for more complex tag-based targeting, create a Segment with the
contact_tag filter and the cont predicate.
Response
Paginated contacts
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/contacts'const response = await fetch('https://api.nitrosend.com/v1/my/contacts', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/contacts')
data = response.json()[
{
"id": 0,
"brand_id": 0,
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"first_name": "string",
"last_name": "string",
"source": "string",
"country_code": "string",
"data": {
"tags": [
"vip",
"newsletter"
],
"plan": "pro"
},
"subscribed_phone": true,
"subscribed_email": true,
"verification_status": "verified",
"enrichment_status": "enriched",
"list_ids": [
0
],
"last_interacted_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"channels": [
{
"id": 0,
"contact_id": 0,
"kind": "email",
"value": "string",
"subscribed": true,
"verified": true,
"opt_in_at": "2024-01-15T09:30:00Z",
"opt_out_at": "2024-01-15T09:30:00Z",
"sent_count": 0,
"fail_count": 0,
"data": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}
]Create a contact
Body
first_namestringlast_namestringemailstring<email>Creates/updates email channel with opt_in
phonestringE.164 format. Creates/updates phone channel with opt_in
sourcestringcountry_codestringlist_idsArray<integer>dataobjectCustom key-value data. The reserved key tags holds an
array of string labels used for segmentation — e.g.
{"tags": ["vip", "newsletter"]}. Writing data.tags
replaces the contact's existing tag list.
channels_attributesArray<object>Response
Contact created
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/contacts' \
-H 'Content-Type: application/json' \
-d '{
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"phone": "string",
"source": "string",
"country_code": "string",
"list_ids": [
0
],
"data": {
"tags": [
"vip",
"newsletter"
],
"plan": "pro"
},
"channels_attributes": [
{
"kind": "email",
"value": "string",
"subscribed": true
}
]
}'const response = await fetch('https://api.nitrosend.com/v1/my/contacts', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"phone": "string",
"source": "string",
"country_code": "string",
"list_ids": [
0
],
"data": {
"tags": [
"vip",
"newsletter"
],
"plan": "pro"
},
"channels_attributes": [
{
"kind": "email",
"value": "string",
"subscribed": true
}
]
}),
});
const data = await response.json();import requests
payload = {
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"phone": "string",
"source": "string",
"country_code": "string",
"list_ids": [
0
],
"data": {
"tags": [
"vip",
"newsletter"
],
"plan": "pro"
},
"channels_attributes": [
{
"kind": "email",
"value": "string",
"subscribed": True
}
]
}
response = requests.post('https://api.nitrosend.com/v1/my/contacts', json=payload)
data = response.json(){
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"phone": "string",
"source": "string",
"country_code": "string",
"list_ids": [
0
],
"data": {
"tags": [
"vip",
"newsletter"
],
"plan": "pro"
},
"channels_attributes": [
{
"kind": "email",
"value": "string",
"subscribed": true
}
]
}{
"id": 0,
"brand_id": 0,
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"first_name": "string",
"last_name": "string",
"source": "string",
"country_code": "string",
"data": {
"tags": [
"vip",
"newsletter"
],
"plan": "pro"
},
"subscribed_phone": true,
"subscribed_email": true,
"verification_status": "verified",
"enrichment_status": "enriched",
"list_ids": [
0
],
"last_interacted_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"channels": [
{
"id": 0,
"contact_id": 0,
"kind": "email",
"value": "string",
"subscribed": true,
"verified": true,
"opt_in_at": "2024-01-15T09:30:00Z",
"opt_out_at": "2024-01-15T09:30:00Z",
"sent_count": 0,
"fail_count": 0,
"data": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Get a contact
Parameters
idintegerrequiredpathResponse
Contact with channels
Resource not found
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/contacts/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/contacts/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/contacts/{id}')
data = response.json(){
"id": 0,
"brand_id": 0,
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"first_name": "string",
"last_name": "string",
"source": "string",
"country_code": "string",
"data": {
"tags": [
"vip",
"newsletter"
],
"plan": "pro"
},
"subscribed_phone": true,
"subscribed_email": true,
"verification_status": "verified",
"enrichment_status": "enriched",
"list_ids": [
0
],
"last_interacted_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"channels": [
{
"id": 0,
"contact_id": 0,
"kind": "email",
"value": "string",
"subscribed": true,
"verified": true,
"opt_in_at": "2024-01-15T09:30:00Z",
"opt_out_at": "2024-01-15T09:30:00Z",
"sent_count": 0,
"fail_count": 0,
"data": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Delete a contact
Parameters
idintegerrequiredpathResponse
Deleted contact
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X DELETE 'https://api.nitrosend.com/v1/my/contacts/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/contacts/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.nitrosend.com/v1/my/contacts/{id}')
data = response.json(){
"id": 0,
"brand_id": 0,
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"first_name": "string",
"last_name": "string",
"source": "string",
"country_code": "string",
"data": {
"tags": [
"vip",
"newsletter"
],
"plan": "pro"
},
"subscribed_phone": true,
"subscribed_email": true,
"verification_status": "verified",
"enrichment_status": "enriched",
"list_ids": [
0
],
"last_interacted_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"channels": [
{
"id": 0,
"contact_id": 0,
"kind": "email",
"value": "string",
"subscribed": true,
"verified": true,
"opt_in_at": "2024-01-15T09:30:00Z",
"opt_out_at": "2024-01-15T09:30:00Z",
"sent_count": 0,
"fail_count": 0,
"data": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}Update a contact
Body
first_namestringlast_namestringemailstring<email>phonestringsourcestringcountry_codestringlist_idsArray<integer>dataobjectCustom key-value data. The reserved key tags holds an
array of string labels used for segmentation — e.g.
{"tags": ["vip", "newsletter"]}.
The data object is replaced wholesale on update.
Sending a partial data hash will overwrite any other
keys currently stored (e.g. data.plan, enrichment
metadata). To change a single key, GET the contact, merge
your change into the existing data, then PATCH the full
merged object back. For add/remove tag semantics across
many contacts, use the nitro_manage_audience MCP tool
with operation: "bulk_tag".
channels_attributesArray<object>Parameters
idintegerrequiredpathResponse
Updated contact
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X PATCH 'https://api.nitrosend.com/v1/my/contacts/{id}' \
-H 'Content-Type: application/json' \
-d '{
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"phone": "string",
"source": "string",
"country_code": "string",
"list_ids": [
0
],
"data": {
"tags": [
"vip",
"newsletter"
],
"plan": "pro"
},
"channels_attributes": [
{
"id": 0,
"kind": "email",
"value": "string",
"subscribed": true,
"_destroy": true
}
]
}'const response = await fetch('https://api.nitrosend.com/v1/my/contacts/{id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"phone": "string",
"source": "string",
"country_code": "string",
"list_ids": [
0
],
"data": {
"tags": [
"vip",
"newsletter"
],
"plan": "pro"
},
"channels_attributes": [
{
"id": 0,
"kind": "email",
"value": "string",
"subscribed": true,
"_destroy": true
}
]
}),
});
const data = await response.json();import requests
payload = {
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"phone": "string",
"source": "string",
"country_code": "string",
"list_ids": [
0
],
"data": {
"tags": [
"vip",
"newsletter"
],
"plan": "pro"
},
"channels_attributes": [
{
"id": 0,
"kind": "email",
"value": "string",
"subscribed": True,
"_destroy": True
}
]
}
response = requests.patch('https://api.nitrosend.com/v1/my/contacts/{id}', json=payload)
data = response.json(){
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"phone": "string",
"source": "string",
"country_code": "string",
"list_ids": [
0
],
"data": {
"tags": [
"vip",
"newsletter"
],
"plan": "pro"
},
"channels_attributes": [
{
"id": 0,
"kind": "email",
"value": "string",
"subscribed": true,
"_destroy": true
}
]
}{
"id": 0,
"brand_id": 0,
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"first_name": "string",
"last_name": "string",
"source": "string",
"country_code": "string",
"data": {
"tags": [
"vip",
"newsletter"
],
"plan": "pro"
},
"subscribed_phone": true,
"subscribed_email": true,
"verification_status": "verified",
"enrichment_status": "enriched",
"list_ids": [
0
],
"last_interacted_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"channels": [
{
"id": 0,
"contact_id": 0,
"kind": "email",
"value": "string",
"subscribed": true,
"verified": true,
"opt_in_at": "2024-01-15T09:30:00Z",
"opt_out_at": "2024-01-15T09:30:00Z",
"sent_count": 0,
"fail_count": 0,
"data": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Re-enrich a contact via email verification + Apollo
Queues the contact for email verification and Apollo enrichment. Consumes 2 validation allowance units. Requires the contact to have an email channel.
Parameters
idintegerrequiredpathResponse
Enrichment queued
Contact has no email or validation allowance exhausted
Not authenticated
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/contacts/{id}/enrich'const response = await fetch('https://api.nitrosend.com/v1/my/contacts/{id}/enrich', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.nitrosend.com/v1/my/contacts/{id}/enrich')
data = response.json(){
"id": 0,
"brand_id": 0,
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"first_name": "string",
"last_name": "string",
"source": "string",
"country_code": "string",
"data": {
"tags": [
"vip",
"newsletter"
],
"plan": "pro"
},
"subscribed_phone": true,
"subscribed_email": true,
"verification_status": "verified",
"enrichment_status": "enriched",
"list_ids": [
0
],
"last_interacted_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"channels": [
{
"id": 0,
"contact_id": 0,
"kind": "email",
"value": "string",
"subscribed": true,
"verified": true,
"opt_in_at": "2024-01-15T09:30:00Z",
"opt_out_at": "2024-01-15T09:30:00Z",
"sent_count": 0,
"fail_count": 0,
"data": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Imports
Bulk CSV import jobs
List import jobs
Parameters
pageinteger1querylimitinteger25queryResponse
Paginated import jobs
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/imports'const response = await fetch('https://api.nitrosend.com/v1/my/imports', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/imports')
data = response.json()[
{
"id": 0,
"resource": "contacts",
"parser": "default",
"status": "pending",
"total_rows": 0,
"success_rows": 0,
"failed_rows": 0,
"import_errors": [
[
0
]
],
"columns": {},
"options": {},
"started_at": "2024-01-15T09:30:00Z",
"ended_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}
]Start a CSV import
Uploads a CSV file and enqueues an import job. Poll GET /v1/my/imports/{id} for status, row counts, and row-level errors.
For contact imports, pass options as a JSON object or JSON string
with list_ids to assign imported contacts to one or more lists,
e.g. {"list_ids":[88]}.
Body
filestring<binary>requiredCSV file, maximum 10 MB
resourcestringcontactscontactsparserstringdefaultdefaultdry_runbooleanfalsecolumnsobject | stringCSV column mapping as a JSON object or JSON string.
optionsobject | stringImport options as a JSON object or JSON string.
Response
Import queued
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/imports' \
-H 'Content-Type: multipart/form-data' \
-d '{
"file": "<binary>",
"resource": "contacts",
"parser": "default",
"dry_run": false,
"columns": {
"email": "Email",
"first_name": "First Name"
},
"options": {
"list_ids": [
88
]
}
}'const response = await fetch('https://api.nitrosend.com/v1/my/imports', {
method: 'POST',
headers: {
'Content-Type': 'multipart/form-data',
},
body: JSON.stringify({
"file": "<binary>",
"resource": "contacts",
"parser": "default",
"dry_run": false,
"columns": {
"email": "Email",
"first_name": "First Name"
},
"options": {
"list_ids": [
88
]
}
}),
});
const data = await response.json();import requests
payload = {
"file": "<binary>",
"resource": "contacts",
"parser": "default",
"dry_run": False,
"columns": {
"email": "Email",
"first_name": "First Name"
},
"options": {
"list_ids": [
88
]
}
}
response = requests.post('https://api.nitrosend.com/v1/my/imports', json=payload)
data = response.json(){
"file": "<binary>",
"resource": "contacts",
"parser": "default",
"dry_run": false,
"columns": {
"email": "Email",
"first_name": "First Name"
},
"options": {
"list_ids": [
88
]
}
}{
"id": 0,
"resource": "contacts",
"parser": "default",
"status": "pending",
"total_rows": 0,
"success_rows": 0,
"failed_rows": 0,
"import_errors": [
[
0
]
],
"columns": {},
"options": {},
"started_at": "2024-01-15T09:30:00Z",
"ended_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Get import schema metadata
Parameters
resourcestringcontactsqueryOptional resource name. Omit to list all schemas.
Response
Import schema metadata
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/imports/spec'const response = await fetch('https://api.nitrosend.com/v1/my/imports/spec', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/imports/spec')
data = response.json(){}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Get import job status
Parameters
idintegerrequiredpathResponse
Import job with status, counts, and row errors
Resource not found
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/imports/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/imports/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/imports/{id}')
data = response.json(){
"id": 0,
"resource": "contacts",
"parser": "default",
"status": "pending",
"total_rows": 0,
"success_rows": 0,
"failed_rows": 0,
"import_errors": [
[
0
]
],
"columns": {},
"options": {},
"started_at": "2024-01-15T09:30:00Z",
"ended_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Delete an import record
Parameters
idintegerrequiredpathResponse
Deleted import
Resource not found
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X DELETE 'https://api.nitrosend.com/v1/my/imports/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/imports/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.nitrosend.com/v1/my/imports/{id}')
data = response.json(){
"id": 0,
"resource": "contacts",
"parser": "default",
"status": "pending",
"total_rows": 0,
"success_rows": 0,
"failed_rows": 0,
"import_errors": [
[
0
]
],
"columns": {},
"options": {},
"started_at": "2024-01-15T09:30:00Z",
"ended_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Cancel a pending or processing import
Parameters
idintegerrequiredpathResponse
Canceled import
Resource not found
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/imports/{id}/cancel'const response = await fetch('https://api.nitrosend.com/v1/my/imports/{id}/cancel', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.nitrosend.com/v1/my/imports/{id}/cancel')
data = response.json(){
"id": 0,
"resource": "contacts",
"parser": "default",
"status": "pending",
"total_rows": 0,
"success_rows": 0,
"failed_rows": 0,
"import_errors": [
[
0
]
],
"columns": {},
"options": {},
"started_at": "2024-01-15T09:30:00Z",
"ended_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Lists
Contact lists
List contact lists (paginated)
Parameters
namestringqueryExact case-insensitive list name filter
pageinteger1querylimitinteger25queryResponse
Paginated contact lists
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/lists'const response = await fetch('https://api.nitrosend.com/v1/my/lists', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/lists')
data = response.json()[
{
"id": 0,
"account_id": 0,
"brand_id": 0,
"name": "string",
"contacts_count": 0,
"segment_id": 0,
"stale": true,
"last_populated_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]Create a contact list
Body
namestringrequiredsegment_idinteger | nullcontact_idsArray<integer>Response
List created
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/lists' \
-H 'Content-Type: application/json' \
-d '{
"name": "string",
"segment_id": 0,
"contact_ids": [
0
]
}'const response = await fetch('https://api.nitrosend.com/v1/my/lists', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "string",
"segment_id": 0,
"contact_ids": [
0
]
}),
});
const data = await response.json();import requests
payload = {
"name": "string",
"segment_id": 0,
"contact_ids": [
0
]
}
response = requests.post('https://api.nitrosend.com/v1/my/lists', json=payload)
data = response.json(){
"name": "string",
"segment_id": 0,
"contact_ids": [
0
]
}{
"id": 0,
"account_id": 0,
"brand_id": 0,
"name": "string",
"contacts_count": 0,
"segment_id": 0,
"stale": true,
"last_populated_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Get a contact list
Parameters
idintegerrequiredpathResponse
Contact list
Resource not found
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/lists/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/lists/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/lists/{id}')
data = response.json(){
"id": 0,
"account_id": 0,
"brand_id": 0,
"name": "string",
"contacts_count": 0,
"segment_id": 0,
"stale": true,
"last_populated_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Delete a contact list
Parameters
idintegerrequiredpathResponse
Deleted list
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X DELETE 'https://api.nitrosend.com/v1/my/lists/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/lists/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.nitrosend.com/v1/my/lists/{id}')
data = response.json(){
"id": 0,
"account_id": 0,
"brand_id": 0,
"name": "string",
"contacts_count": 0,
"segment_id": 0,
"stale": true,
"last_populated_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}Update a contact list
Body
namestringsegment_idinteger | nullcontact_idsArray<integer>Parameters
idintegerrequiredpathResponse
Updated list
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X PATCH 'https://api.nitrosend.com/v1/my/lists/{id}' \
-H 'Content-Type: application/json' \
-d '{
"name": "string",
"segment_id": 0,
"contact_ids": [
0
]
}'const response = await fetch('https://api.nitrosend.com/v1/my/lists/{id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "string",
"segment_id": 0,
"contact_ids": [
0
]
}),
});
const data = await response.json();import requests
payload = {
"name": "string",
"segment_id": 0,
"contact_ids": [
0
]
}
response = requests.patch('https://api.nitrosend.com/v1/my/lists/{id}', json=payload)
data = response.json(){
"name": "string",
"segment_id": 0,
"contact_ids": [
0
]
}{
"id": 0,
"account_id": 0,
"brand_id": 0,
"name": "string",
"contacts_count": 0,
"segment_id": 0,
"stale": true,
"last_populated_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Get delete warning metadata for a contact list
Parameters
idintegerrequiredpathResponse
Flows connected to this list
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/lists/{id}/delete_warning'const response = await fetch('https://api.nitrosend.com/v1/my/lists/{id}/delete_warning', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/lists/{id}/delete_warning')
data = response.json(){
"campaign_names": [
"string"
],
"flow_names": [
"string"
]
}Add or remove existing contacts from a list by email
Public REST equivalent of the list membership batch primitive. The
endpoint resolves existing contacts by email within the current brand
and adds or removes memberships idempotently. It does not create
contacts; emails with no current-brand contact are returned in
not_found.
Body
actionstringaddremoverequiredAdd existing contacts to the list or remove them from it.
emailsArray<string>requiredParameters
idintegerrequiredpathResponse
Bulk list membership result
Resource not found
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/lists/{id}/contacts/bulk' \
-H 'Content-Type: application/json' \
-d '{
"action": "add",
"emails": [
"user@example.com"
]
}'const response = await fetch('https://api.nitrosend.com/v1/my/lists/{id}/contacts/bulk', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"action": "add",
"emails": [
"user@example.com"
]
}),
});
const data = await response.json();import requests
payload = {
"action": "add",
"emails": [
"user@example.com"
]
}
response = requests.post('https://api.nitrosend.com/v1/my/lists/{id}/contacts/bulk', json=payload)
data = response.json(){
"action": "add",
"emails": [
"user@example.com"
]
}{
"action": "add",
"list_id": 0,
"added": 0,
"removed": 0,
"already_in_list": [
"user@example.com"
],
"not_in_list": [
"user@example.com"
],
"not_found": [
"user@example.com"
],
"invalid_emails": [
"string"
]
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Segments
Dynamic contact segments
List all segments
Response
Segments
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/segments'const response = await fetch('https://api.nitrosend.com/v1/my/segments', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/segments')
data = response.json()[
{
"id": 0,
"account_id": 0,
"brand_id": 0,
"name": "string",
"filters": [
{
"name": "string",
"predicate": "string"
}
],
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]Create a segment
Body
namestringrequiredfiltersArray<object>Response
Segment created
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/segments' \
-H 'Content-Type: application/json' \
-d '{
"name": "string",
"filters": [
{
"name": "string",
"predicate": "string"
}
]
}'const response = await fetch('https://api.nitrosend.com/v1/my/segments', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "string",
"filters": [
{
"name": "string",
"predicate": "string"
}
]
}),
});
const data = await response.json();import requests
payload = {
"name": "string",
"filters": [
{
"name": "string",
"predicate": "string"
}
]
}
response = requests.post('https://api.nitrosend.com/v1/my/segments', json=payload)
data = response.json(){
"name": "string",
"filters": [
{
"name": "string",
"predicate": "string"
}
]
}{
"id": 0,
"account_id": 0,
"brand_id": 0,
"name": "string",
"filters": [
{
"name": "string",
"predicate": "string"
}
],
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Get a segment
Parameters
idintegerrequiredpathResponse
Segment
Resource not found
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/segments/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/segments/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/segments/{id}')
data = response.json(){
"id": 0,
"account_id": 0,
"brand_id": 0,
"name": "string",
"filters": [
{
"name": "string",
"predicate": "string"
}
],
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Delete a segment
Parameters
idintegerrequiredpathResponse
Deleted segment
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X DELETE 'https://api.nitrosend.com/v1/my/segments/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/segments/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.nitrosend.com/v1/my/segments/{id}')
data = response.json(){
"id": 0,
"account_id": 0,
"brand_id": 0,
"name": "string",
"filters": [
{
"name": "string",
"predicate": "string"
}
],
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}Update a segment
Body
namestringfiltersArray<object>Parameters
idintegerrequiredpathResponse
Updated segment
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X PATCH 'https://api.nitrosend.com/v1/my/segments/{id}' \
-H 'Content-Type: application/json' \
-d '{
"name": "string",
"filters": [
{
"name": "string",
"predicate": "string"
}
]
}'const response = await fetch('https://api.nitrosend.com/v1/my/segments/{id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "string",
"filters": [
{
"name": "string",
"predicate": "string"
}
]
}),
});
const data = await response.json();import requests
payload = {
"name": "string",
"filters": [
{
"name": "string",
"predicate": "string"
}
]
}
response = requests.patch('https://api.nitrosend.com/v1/my/segments/{id}', json=payload)
data = response.json(){
"name": "string",
"filters": [
{
"name": "string",
"predicate": "string"
}
]
}{
"id": 0,
"account_id": 0,
"brand_id": 0,
"name": "string",
"filters": [
{
"name": "string",
"predicate": "string"
}
],
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Count contacts matching filters
Preview how many contacts match a set of segment filters without creating or saving a segment.
Body
filtersArray<object>Response
Contact count
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/segments/count' \
-H 'Content-Type: application/json' \
-d '{
"filters": [
{
"name": "string",
"predicate": "string"
}
]
}'const response = await fetch('https://api.nitrosend.com/v1/my/segments/count', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"filters": [
{
"name": "string",
"predicate": "string"
}
]
}),
});
const data = await response.json();import requests
payload = {
"filters": [
{
"name": "string",
"predicate": "string"
}
]
}
response = requests.post('https://api.nitrosend.com/v1/my/segments/count', json=payload)
data = response.json(){
"filters": [
{
"name": "string",
"predicate": "string"
}
]
}{
"count": 0
}Campaigns
Email and SMS campaigns
List campaigns (paginated)
Parameters
pageinteger1querylimitinteger25queryResponse
Paginated campaigns
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/campaigns'const response = await fetch('https://api.nitrosend.com/v1/my/campaigns', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/campaigns')
data = response.json()[
{
"id": 0,
"account_id": 0,
"brand_id": 0,
"status": "draft",
"approval_state": "string",
"channel": "email",
"name": "string",
"data": {},
"scheduled_at": "2024-01-15T09:30:00Z",
"sent_count": 0,
"editable": true,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"trigger": {
"id": 0,
"flow_id": 0,
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"data": {},
"triggered_count": 0,
"last_triggered_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
},
"template": {
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
},
"variables": {},
"generation_id": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
},
"templates": [
{
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
},
"variables": {},
"generation_id": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}
]Create a campaign
Body
namestringrequiredchannelstringemailsmsemailResponse
Campaign created
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/campaigns' \
-H 'Content-Type: application/json' \
-d '{
"name": "string",
"channel": "email"
}'const response = await fetch('https://api.nitrosend.com/v1/my/campaigns', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "string",
"channel": "email"
}),
});
const data = await response.json();import requests
payload = {
"name": "string",
"channel": "email"
}
response = requests.post('https://api.nitrosend.com/v1/my/campaigns', json=payload)
data = response.json(){
"name": "string",
"channel": "email"
}{
"id": 0,
"account_id": 0,
"brand_id": 0,
"status": "draft",
"approval_state": "string",
"channel": "email",
"name": "string",
"data": {},
"scheduled_at": "2024-01-15T09:30:00Z",
"sent_count": 0,
"editable": true,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"trigger": {
"id": 0,
"flow_id": 0,
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"data": {},
"triggered_count": 0,
"last_triggered_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
},
"template": {
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
},
"variables": {},
"generation_id": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
},
"templates": [
{
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
},
"variables": {},
"generation_id": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Get a campaign
Parameters
idintegerrequiredpathResponse
Campaign with trigger, template, and templates
Resource not found
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/campaigns/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/campaigns/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/campaigns/{id}')
data = response.json(){
"id": 0,
"account_id": 0,
"brand_id": 0,
"status": "draft",
"approval_state": "string",
"channel": "email",
"name": "string",
"data": {},
"scheduled_at": "2024-01-15T09:30:00Z",
"sent_count": 0,
"editable": true,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"trigger": {
"id": 0,
"flow_id": 0,
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"data": {},
"triggered_count": 0,
"last_triggered_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
},
"template": {
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
},
"variables": {},
"generation_id": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
},
"templates": [
{
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
},
"variables": {},
"generation_id": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Delete a campaign
Parameters
idintegerrequiredpathResponse
Deleted campaign
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X DELETE 'https://api.nitrosend.com/v1/my/campaigns/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/campaigns/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.nitrosend.com/v1/my/campaigns/{id}')
data = response.json(){
"id": 0,
"account_id": 0,
"brand_id": 0,
"status": "draft",
"approval_state": "string",
"channel": "email",
"name": "string",
"data": {},
"scheduled_at": "2024-01-15T09:30:00Z",
"sent_count": 0,
"editable": true,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"trigger": {
"id": 0,
"flow_id": 0,
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"data": {},
"triggered_count": 0,
"last_triggered_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
},
"template": {
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
},
"variables": {},
"generation_id": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
},
"templates": [
{
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
},
"variables": {},
"generation_id": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}Update a campaign
Updates the campaign. When the campaign is no longer editable (see the
editable field on the Campaign schema — false for live/paused/
completed/cancelled/archived, and for scheduled campaigns within 5
minutes of their send time), only name-only payloads and status
transitions (Resume, Cancel) are accepted. Any other attribute returns
422 with error_code: "campaign_locked". Use the /duplicate endpoint
to fork a sent campaign into a new draft.
Body
namestringstatusstringchannelstringemailsmsscheduled_atstring<date-time> | nulltrigger_attributesobjecttemplate_attributesobjectParameters
idintegerrequiredpathResponse
Updated campaign
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X PATCH 'https://api.nitrosend.com/v1/my/campaigns/{id}' \
-H 'Content-Type: application/json' \
-d '{
"name": "string",
"status": "string",
"channel": "email",
"scheduled_at": "2024-01-15T09:30:00Z",
"trigger_attributes": {
"event": "string",
"audience_type": "lists",
"contact_list_id": 0,
"contact_list_ids": [
0
],
"segment_id": 0,
"data": {}
},
"template_attributes": {
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "user@example.com",
"reply_to": "user@example.com",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
}
}
}'const response = await fetch('https://api.nitrosend.com/v1/my/campaigns/{id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "string",
"status": "string",
"channel": "email",
"scheduled_at": "2024-01-15T09:30:00Z",
"trigger_attributes": {
"event": "string",
"audience_type": "lists",
"contact_list_id": 0,
"contact_list_ids": [
0
],
"segment_id": 0,
"data": {}
},
"template_attributes": {
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "user@example.com",
"reply_to": "user@example.com",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
}
}
}),
});
const data = await response.json();import requests
payload = {
"name": "string",
"status": "string",
"channel": "email",
"scheduled_at": "2024-01-15T09:30:00Z",
"trigger_attributes": {
"event": "string",
"audience_type": "lists",
"contact_list_id": 0,
"contact_list_ids": [
0
],
"segment_id": 0,
"data": {}
},
"template_attributes": {
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "user@example.com",
"reply_to": "user@example.com",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
}
}
}
response = requests.patch('https://api.nitrosend.com/v1/my/campaigns/{id}', json=payload)
data = response.json(){
"name": "string",
"status": "string",
"channel": "email",
"scheduled_at": "2024-01-15T09:30:00Z",
"trigger_attributes": {
"event": "string",
"audience_type": "lists",
"contact_list_id": 0,
"contact_list_ids": [
0
],
"segment_id": 0,
"data": {}
},
"template_attributes": {
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "user@example.com",
"reply_to": "user@example.com",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
}
}
}{
"id": 0,
"account_id": 0,
"brand_id": 0,
"status": "draft",
"approval_state": "string",
"channel": "email",
"name": "string",
"data": {},
"scheduled_at": "2024-01-15T09:30:00Z",
"sent_count": 0,
"editable": true,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"trigger": {
"id": 0,
"flow_id": 0,
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"data": {},
"triggered_count": 0,
"last_triggered_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
},
"template": {
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
},
"variables": {},
"generation_id": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
},
"templates": [
{
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
},
"variables": {},
"generation_id": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Duplicate a campaign
Creates a new draft campaign that copies the source's audience (trigger.audience_type, contact_list_ids, segment_id) and template content (design, subject, preheader, body, from_name, from_email, reply_to). Resets status to draft, approval_state to pending_review, scheduled_at to null, and trigger.event to manual. Works on any status — this is how clients fork a sent campaign into a new draft. Sessions, activities, approvals, and metrics are not copied.
Pass cancel_source: true to atomically cancel the source campaign
in the same transaction as the duplicate — useful for 'cancel and
duplicate' flows on paused campaigns.
Body
cancel_sourcebooleanfalseWhen true, cancels the source campaign in the same DB transaction as the duplicate creation.
Parameters
idintegerrequiredpathResponse
New draft campaign
Resource not found
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/campaigns/{id}/duplicate' \
-H 'Content-Type: application/json' \
-d '{
"cancel_source": false
}'const response = await fetch('https://api.nitrosend.com/v1/my/campaigns/{id}/duplicate', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"cancel_source": false
}),
});
const data = await response.json();import requests
payload = {
"cancel_source": False
}
response = requests.post('https://api.nitrosend.com/v1/my/campaigns/{id}/duplicate', json=payload)
data = response.json(){
"cancel_source": false
}{
"id": 0,
"account_id": 0,
"brand_id": 0,
"status": "draft",
"approval_state": "string",
"channel": "email",
"name": "string",
"data": {},
"scheduled_at": "2024-01-15T09:30:00Z",
"sent_count": 0,
"editable": true,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"trigger": {
"id": 0,
"flow_id": 0,
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"data": {},
"triggered_count": 0,
"last_triggered_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
},
"template": {
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
},
"variables": {},
"generation_id": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
},
"templates": [
{
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
},
"variables": {},
"generation_id": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Send a campaign
Transitions the campaign and its flow to live, then delivers.
Optionally update trigger and template attributes in the same request.
Returns 422 campaign_locked if the campaign is not editable
(live, paused, completed, cancelled, archived, or scheduled within
5 minutes of send).
Body
confirm_send_to_allbooleanRequired when trigger_attributes.audience_type or the saved trigger audience_type is all_contacts.
trigger_attributesobjecttemplate_attributesobjectParameters
idintegerrequiredpathResponse
Campaign sent
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/campaigns/{id}/send' \
-H 'Content-Type: application/json' \
-d '{
"confirm_send_to_all": true,
"trigger_attributes": {
"event": "string",
"audience_type": "lists",
"contact_list_id": 0,
"contact_list_ids": [
0
],
"segment_id": 0,
"data": {}
},
"template_attributes": {
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "user@example.com",
"reply_to": "user@example.com",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
}
}
}'const response = await fetch('https://api.nitrosend.com/v1/my/campaigns/{id}/send', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"confirm_send_to_all": true,
"trigger_attributes": {
"event": "string",
"audience_type": "lists",
"contact_list_id": 0,
"contact_list_ids": [
0
],
"segment_id": 0,
"data": {}
},
"template_attributes": {
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "user@example.com",
"reply_to": "user@example.com",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
}
}
}),
});
const data = await response.json();import requests
payload = {
"confirm_send_to_all": True,
"trigger_attributes": {
"event": "string",
"audience_type": "lists",
"contact_list_id": 0,
"contact_list_ids": [
0
],
"segment_id": 0,
"data": {}
},
"template_attributes": {
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "user@example.com",
"reply_to": "user@example.com",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
}
}
}
response = requests.post('https://api.nitrosend.com/v1/my/campaigns/{id}/send', json=payload)
data = response.json(){
"confirm_send_to_all": true,
"trigger_attributes": {
"event": "string",
"audience_type": "lists",
"contact_list_id": 0,
"contact_list_ids": [
0
],
"segment_id": 0,
"data": {}
},
"template_attributes": {
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "user@example.com",
"reply_to": "user@example.com",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
}
}
}{
"id": 0,
"account_id": 0,
"brand_id": 0,
"status": "draft",
"approval_state": "string",
"channel": "email",
"name": "string",
"data": {},
"scheduled_at": "2024-01-15T09:30:00Z",
"sent_count": 0,
"editable": true,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"trigger": {
"id": 0,
"flow_id": 0,
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"data": {},
"triggered_count": 0,
"last_triggered_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
},
"template": {
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
},
"variables": {},
"generation_id": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
},
"templates": [
{
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
},
"variables": {},
"generation_id": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Messages
Transactional email and SMS messages
List messages
Returns transactional messages by default. Use source_type=all to include flow/campaign-generated messages, or source_type=flow for flow-only.
Parameters
source_typestringallflowqueryFilter by source. Omit for transactional only, 'all' for everything, 'flow' for flow/campaign messages.
channelstringemailsmsquerystatusstringqueuedsentfailedquerypageinteger1querylimitinteger25queryResponse
Paginated list of messages
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/messages'const response = await fetch('https://api.nitrosend.com/v1/my/messages', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/messages')
data = response.json()[
{
"id": 0,
"channel": "email",
"to": "string",
"subject": "string",
"status": "queued",
"provider_id": "string",
"flow_id": 0,
"source_type": "campaign",
"source_name": "string",
"sent_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}
]Send a transactional message
Send a transactional email or SMS to a single recipient immediately. No campaign, no audience, no approval required. Use for receipts, password resets, OTPs, order confirmations, and system notifications.
Body
channelstringemailsmsrequiredtostringrequiredRecipient email address or E.164 phone number
subjectstringEmail subject line (required for email channel)
bodystringMessage body. Required for SMS. Optional plain text for email.
template_idintegerLoad email design from an existing template (email only)
dataobjectMerge variables
idempotency_keystringIdempotency key (alternative to header)
Parameters
Idempotency-KeystringheaderPrevents duplicate sends on retry. Same key returns the original message.
Response
Message created
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/messages' \
-H 'Content-Type: application/json' \
-d '{
"channel": "email",
"to": "string",
"subject": "string",
"body": "string",
"template_id": 0,
"data": {},
"idempotency_key": "string"
}'const response = await fetch('https://api.nitrosend.com/v1/my/messages', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"channel": "email",
"to": "string",
"subject": "string",
"body": "string",
"template_id": 0,
"data": {},
"idempotency_key": "string"
}),
});
const data = await response.json();import requests
payload = {
"channel": "email",
"to": "string",
"subject": "string",
"body": "string",
"template_id": 0,
"data": {},
"idempotency_key": "string"
}
response = requests.post('https://api.nitrosend.com/v1/my/messages', json=payload)
data = response.json(){
"channel": "email",
"to": "string",
"subject": "string",
"body": "string",
"template_id": 0,
"data": {},
"idempotency_key": "string"
}{
"id": 0,
"channel": "email",
"to": "string",
"subject": "string",
"status": "queued",
"provider_id": "string",
"flow_id": 0,
"source_type": "campaign",
"source_name": "string",
"sent_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Get a transactional message
Parameters
idintegerrequiredpathResponse
Message
Resource not found
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/messages/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/messages/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/messages/{id}')
data = response.json(){
"id": 0,
"channel": "email",
"to": "string",
"subject": "string",
"status": "queued",
"provider_id": "string",
"flow_id": 0,
"source_type": "campaign",
"source_name": "string",
"sent_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Templates
Email templates, preview, and component schema
List all templates
Returns a summary view with section counts (not full design).
Response
Template summaries
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/templates'const response = await fetch('https://api.nitrosend.com/v1/my/templates', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/templates')
data = response.json()[
{
"id": 0,
"name": "string",
"subject": "string",
"preheader": "string",
"flow_id": 0,
"section_count": 0,
"section_types": [
"string"
],
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]Create a standalone template
Body
namestringrequiredsubjectstringpreheaderstringgeneration_idinteger | nulldesignobjectEmail template design document
Response
Created template
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/templates' \
-H 'Content-Type: application/json' \
-d '{
"name": "string",
"subject": "string",
"preheader": "string",
"generation_id": 0,
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
}
}'const response = await fetch('https://api.nitrosend.com/v1/my/templates', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "string",
"subject": "string",
"preheader": "string",
"generation_id": 0,
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
}
}),
});
const data = await response.json();import requests
payload = {
"name": "string",
"subject": "string",
"preheader": "string",
"generation_id": 0,
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
}
}
response = requests.post('https://api.nitrosend.com/v1/my/templates', json=payload)
data = response.json(){
"name": "string",
"subject": "string",
"preheader": "string",
"generation_id": 0,
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
}
}{
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
},
"variables": {},
"generation_id": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Get a template with full design
Parameters
idintegerrequiredpathResponse
Full template including design
Resource not found
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/templates/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/templates/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/templates/{id}')
data = response.json(){
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
},
"variables": {},
"generation_id": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Update a template
Body
namestringsubjectstringbodystringpreheaderstringfrom_namestringfrom_emailstring<email>reply_tostring<email>generation_idinteger | nulldesignobjectEmail template design document
Parameters
idintegerrequiredpathResponse
Updated template
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X PATCH 'https://api.nitrosend.com/v1/my/templates/{id}' \
-H 'Content-Type: application/json' \
-d '{
"name": "string",
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "user@example.com",
"reply_to": "user@example.com",
"generation_id": 0,
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
}
}'const response = await fetch('https://api.nitrosend.com/v1/my/templates/{id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "string",
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "user@example.com",
"reply_to": "user@example.com",
"generation_id": 0,
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
}
}),
});
const data = await response.json();import requests
payload = {
"name": "string",
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "user@example.com",
"reply_to": "user@example.com",
"generation_id": 0,
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
}
}
response = requests.patch('https://api.nitrosend.com/v1/my/templates/{id}', json=payload)
data = response.json(){
"name": "string",
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "user@example.com",
"reply_to": "user@example.com",
"generation_id": 0,
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
}
}{
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
},
"variables": {},
"generation_id": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Send a test email
Send a test email for the given template. Provide email for an
explicit recipient, contact_id to use a contact's email (with
merge-tag personalization), or omit both to send to the account owner.
Body
emailstring<email>contact_idintegerParameters
idintegerrequiredpathResponse
Test email sent
Resource not found
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/templates/{id}/send_test' \
-H 'Content-Type: application/json' \
-d '{
"email": "user@example.com",
"contact_id": 0
}'const response = await fetch('https://api.nitrosend.com/v1/my/templates/{id}/send_test', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"email": "user@example.com",
"contact_id": 0
}),
});
const data = await response.json();import requests
payload = {
"email": "user@example.com",
"contact_id": 0
}
response = requests.post('https://api.nitrosend.com/v1/my/templates/{id}/send_test', json=payload)
data = response.json(){
"email": "user@example.com",
"contact_id": 0
}{
"sent": 0,
"results": [
{
"email": "string",
"success": true
}
]
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Render an email design to HTML
Body
documentobjectrequiredEmail template design document
Response
Rendered HTML
Bad request
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/templates/preview' \
-H 'Content-Type: application/json' \
-d '{
"document": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
}
}'const response = await fetch('https://api.nitrosend.com/v1/my/templates/preview', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"document": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
}
}),
});
const data = await response.json();import requests
payload = {
"document": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
}
}
response = requests.post('https://api.nitrosend.com/v1/my/templates/preview', json=payload)
data = response.json(){
"document": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
}
}{
"html": "string"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Get the email component schema
Returns the full schema for email design sections including all
component types, their props, required fields, and defaults.
Sourced from config/email_components.yml.
Response
Email component schema
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/templates/spec'const response = await fetch('https://api.nitrosend.com/v1/my/templates/spec', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/templates/spec')
data = response.json(){
"version": 0,
"design_guidelines": "string",
"components": [
{
"type": "string",
"description": "string",
"tips": [
"string"
],
"props": {}
}
],
"common_styles": {},
"variables": [
"string"
],
"theme_fields": [
"string"
]
}List email starter designs
Returns config-based starter email designs with the current brand's theme merged and an HTML preview rendered for each starter.
Response
Starter designs with brand theme and preview HTML
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/templates/starters'const response = await fetch('https://api.nitrosend.com/v1/my/templates/starters', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/templates/starters')
data = response.json()[
{
"id": "string",
"category": "string",
"name": "string",
"description": "string",
"icon": "string",
"suggested_goals": [
"string"
],
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
},
"preview_html": "string"
}
]AI-generate an email template
Generate a complete email design from a text goal using AI. Returns a sections-based design, subject line, preheader, and inferred category. Supports refine mode by passing existing sections[] for modification.
Body
goalstringrequiredWhat the email should accomplish
categorystringOptional category hint (welcome, newsletter, promotion, etc.)
tonestringOptional tone override (formal, casual, etc.)
sectionsArray<object>Current sections for refine mode — LLM adjusts existing content
Response
Generated email design
Validation error
Rate limit exceeded
Generation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/templates/generate' \
-H 'Content-Type: application/json' \
-d '{
"goal": "Welcome new subscribers and introduce the brand",
"category": "string",
"tone": "string",
"sections": [
{}
]
}'const response = await fetch('https://api.nitrosend.com/v1/my/templates/generate', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"goal": "Welcome new subscribers and introduce the brand",
"category": "string",
"tone": "string",
"sections": [
{}
]
}),
});
const data = await response.json();import requests
payload = {
"goal": "Welcome new subscribers and introduce the brand",
"category": "string",
"tone": "string",
"sections": [
{}
]
}
response = requests.post('https://api.nitrosend.com/v1/my/templates/generate', json=payload)
data = response.json(){
"goal": "Welcome new subscribers and introduce the brand",
"category": "string",
"tone": "string",
"sections": [
{}
]
}{
"design": {},
"subject": "string",
"preheader": "string",
"category": "string",
"prompt_version": "string"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Flows
Automation flows and step schema
List automation flows (paginated)
Returns standalone flows only (excludes campaign-attached flows).
Parameters
pageinteger1querylimitinteger25queryResponse
Paginated flows
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/flows'const response = await fetch('https://api.nitrosend.com/v1/my/flows', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/flows')
data = response.json()[]Create a flow
Body
namestringrequiredstatusstringdraftactivepausedarchivedtriggerobjectstepsArray<any>Response
Flow created
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/flows' \
-H 'Content-Type: application/json' \
-d '{
"name": "string",
"status": "draft",
"trigger": {
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"data": {}
},
"steps": []
}'const response = await fetch('https://api.nitrosend.com/v1/my/flows', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "string",
"status": "draft",
"trigger": {
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"data": {}
},
"steps": []
}),
});
const data = await response.json();import requests
payload = {
"name": "string",
"status": "draft",
"trigger": {
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"data": {}
},
"steps": []
}
response = requests.post('https://api.nitrosend.com/v1/my/flows', json=payload)
data = response.json(){
"name": "string",
"status": "draft",
"trigger": {
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"data": {}
},
"steps": []
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Get a flow
Parameters
idintegerrequiredpathResponse
Flow with full graph
Resource not found
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/flows/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/flows/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/flows/{id}')
data = response.json(){
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Delete a flow
Parameters
idintegerrequiredpathResponse
Deleted flow
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X DELETE 'https://api.nitrosend.com/v1/my/flows/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/flows/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.nitrosend.com/v1/my/flows/{id}')
data = response.json()Update a flow
Supports optimistic concurrency — pass updated_at to reject
the update if the flow was modified externally.
Body
namestringstatusstringdraftactivepausedarchivedupdated_atstring<date-time>Optimistic concurrency check
triggerobjectstepsArray<any>Parameters
idintegerrequiredpathResponse
Updated flow
Conflict — flow was modified externally
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X PATCH 'https://api.nitrosend.com/v1/my/flows/{id}' \
-H 'Content-Type: application/json' \
-d '{
"name": "string",
"status": "draft",
"updated_at": "2024-01-15T09:30:00Z",
"trigger": {
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"data": {}
},
"steps": []
}'const response = await fetch('https://api.nitrosend.com/v1/my/flows/{id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "string",
"status": "draft",
"updated_at": "2024-01-15T09:30:00Z",
"trigger": {
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"data": {}
},
"steps": []
}),
});
const data = await response.json();import requests
payload = {
"name": "string",
"status": "draft",
"updated_at": "2024-01-15T09:30:00Z",
"trigger": {
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"data": {}
},
"steps": []
}
response = requests.patch('https://api.nitrosend.com/v1/my/flows/{id}', json=payload)
data = response.json(){
"name": "string",
"status": "draft",
"updated_at": "2024-01-15T09:30:00Z",
"trigger": {
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"data": {}
},
"steps": []
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Get the flow step type schema
Returns the schema for flow step types, trigger events, and
segment filters. Sourced from config/flows.yml.
Response
Flow specification
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/flows/spec'const response = await fetch('https://api.nitrosend.com/v1/my/flows/spec', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/flows/spec')
data = response.json(){
"filters": {},
"triggers": [
{
"title": "string",
"event": "string"
}
],
"steps": [
{
"type": "string",
"title": "string",
"summary": "string",
"params": {}
}
]
}Events
Contact event tracking
List events (paginated)
Parameters
pageinteger1querylimitinteger50queryeventstringqueryFilter by event type
contact_idintegerquerycreated_afterstring<date-time>querycreated_beforestring<date-time>queryresource_uidstringqueryresource_namestringquerytestbooleanqueryResponse
Paginated events
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/events'const response = await fetch('https://api.nitrosend.com/v1/my/events', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/events')
data = response.json()[
{
"id": 0,
"account_id": 0,
"contact_id": 0,
"user_id": 0,
"event": "string",
"amount": 0,
"data": {},
"idempotency_key": "string",
"resource_uid": "string",
"resource_name": "string",
"resource_url": "string",
"test": true,
"generated": true,
"chain_depth": 0,
"ip": "string",
"user_agent": "string",
"browser": "string",
"os": "string",
"device_type": "string",
"referrer": "string",
"utm_source": "string",
"utm_medium": "string",
"utm_term": "string",
"utm_content": "string",
"utm_campaign": "string",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]Track a contact event
Requires an idempotency key via the Idempotency-Key header or
idempotency_key body param. Duplicate events (same account +
event type + idempotency key) return the existing event.
Body
eventstringrequiredEvent type name (lowercase, underscores)
contact_idintegercontact_emailstring<email>Alternative to contact_id — resolves contact by email
idempotency_keystringIdempotency key (alternative to header)
amountnumber<double>resource_uidstringresource_namestringresource_urlstring<uri>testbooleanfalsedataobjectCustom event payload (max 32KB)
utm_sourcestringutm_mediumstringutm_termstringutm_contentstringutm_campaignstringParameters
Idempotency-KeystringheaderIdempotency key (alternative to body param)
Response
Duplicate event (idempotent — returns existing)
Event created
Bad request
Resource not found
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/events' \
-H 'Content-Type: application/json' \
-d '{
"event": "string",
"contact_id": 0,
"contact_email": "user@example.com",
"idempotency_key": "string",
"amount": 0,
"resource_uid": "string",
"resource_name": "string",
"resource_url": "https://example.com",
"test": false,
"data": {},
"utm_source": "string",
"utm_medium": "string",
"utm_term": "string",
"utm_content": "string",
"utm_campaign": "string"
}'const response = await fetch('https://api.nitrosend.com/v1/my/events', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"event": "string",
"contact_id": 0,
"contact_email": "user@example.com",
"idempotency_key": "string",
"amount": 0,
"resource_uid": "string",
"resource_name": "string",
"resource_url": "https://example.com",
"test": false,
"data": {},
"utm_source": "string",
"utm_medium": "string",
"utm_term": "string",
"utm_content": "string",
"utm_campaign": "string"
}),
});
const data = await response.json();import requests
payload = {
"event": "string",
"contact_id": 0,
"contact_email": "user@example.com",
"idempotency_key": "string",
"amount": 0,
"resource_uid": "string",
"resource_name": "string",
"resource_url": "https://example.com",
"test": False,
"data": {},
"utm_source": "string",
"utm_medium": "string",
"utm_term": "string",
"utm_content": "string",
"utm_campaign": "string"
}
response = requests.post('https://api.nitrosend.com/v1/my/events', json=payload)
data = response.json(){
"event": "string",
"contact_id": 0,
"contact_email": "user@example.com",
"idempotency_key": "string",
"amount": 0,
"resource_uid": "string",
"resource_name": "string",
"resource_url": "https://example.com",
"test": false,
"data": {},
"utm_source": "string",
"utm_medium": "string",
"utm_term": "string",
"utm_content": "string",
"utm_campaign": "string"
}{
"id": 0,
"account_id": 0,
"contact_id": 0,
"user_id": 0,
"event": "string",
"amount": 0,
"data": {},
"idempotency_key": "string",
"resource_uid": "string",
"resource_name": "string",
"resource_url": "string",
"test": true,
"generated": true,
"chain_depth": 0,
"ip": "string",
"user_agent": "string",
"browser": "string",
"os": "string",
"device_type": "string",
"referrer": "string",
"utm_source": "string",
"utm_medium": "string",
"utm_term": "string",
"utm_content": "string",
"utm_campaign": "string",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"id": 0,
"account_id": 0,
"contact_id": 0,
"user_id": 0,
"event": "string",
"amount": 0,
"data": {},
"idempotency_key": "string",
"resource_uid": "string",
"resource_name": "string",
"resource_url": "string",
"test": true,
"generated": true,
"chain_depth": 0,
"ip": "string",
"user_agent": "string",
"browser": "string",
"os": "string",
"device_type": "string",
"referrer": "string",
"utm_source": "string",
"utm_medium": "string",
"utm_term": "string",
"utm_content": "string",
"utm_campaign": "string",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Get an event
Parameters
idintegerrequiredpathResponse
Event
Resource not found
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/events/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/events/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/events/{id}')
data = response.json(){
"id": 0,
"account_id": 0,
"contact_id": 0,
"user_id": 0,
"event": "string",
"amount": 0,
"data": {},
"idempotency_key": "string",
"resource_uid": "string",
"resource_name": "string",
"resource_url": "string",
"test": true,
"generated": true,
"chain_depth": 0,
"ip": "string",
"user_agent": "string",
"browser": "string",
"os": "string",
"device_type": "string",
"referrer": "string",
"utm_source": "string",
"utm_medium": "string",
"utm_term": "string",
"utm_content": "string",
"utm_campaign": "string",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Delete an event
Parameters
idintegerrequiredpathResponse
Deleted event
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X DELETE 'https://api.nitrosend.com/v1/my/events/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/events/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.nitrosend.com/v1/my/events/{id}')
data = response.json(){
"id": 0,
"account_id": 0,
"contact_id": 0,
"user_id": 0,
"event": "string",
"amount": 0,
"data": {},
"idempotency_key": "string",
"resource_uid": "string",
"resource_name": "string",
"resource_url": "string",
"test": true,
"generated": true,
"chain_depth": 0,
"ip": "string",
"user_agent": "string",
"browser": "string",
"os": "string",
"device_type": "string",
"referrer": "string",
"utm_source": "string",
"utm_medium": "string",
"utm_term": "string",
"utm_content": "string",
"utm_campaign": "string",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}Domains
Sending domain verification
List sending domains (paginated)
Parameters
pageinteger1queryperinteger30queryResponse
Paginated domains
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/domains'const response = await fetch('https://api.nitrosend.com/v1/my/domains', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/domains')
data = response.json()[
{
"id": 0,
"brand_id": 0,
"name": "string",
"provider": "ses",
"integration_id": 0,
"status": "pending",
"dns_records": [
{
"record_type": "string",
"name": "string",
"value": "string",
"priority": "string",
"valid": "string"
}
],
"dns_health": {},
"dns_setup_status": "unchecked",
"verified_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}
]Add a sending domain
Initiates domain verification. Returns DNS records that must be
added at your domain registrar before calling POST /verify.
Body
domainobjectrequiredResponse
Domain registered with DNS records to configure
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/domains' \
-H 'Content-Type: application/json' \
-d '{
"domain": {
"name": "string"
}
}'const response = await fetch('https://api.nitrosend.com/v1/my/domains', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"domain": {
"name": "string"
}
}),
});
const data = await response.json();import requests
payload = {
"domain": {
"name": "string"
}
}
response = requests.post('https://api.nitrosend.com/v1/my/domains', json=payload)
data = response.json(){
"domain": {
"name": "string"
}
}{
"id": 0,
"brand_id": 0,
"name": "string",
"provider": "ses",
"integration_id": 0,
"status": "pending",
"dns_records": [
{
"record_type": "string",
"name": "string",
"value": "string",
"priority": "string",
"valid": "string"
}
],
"dns_health": {},
"dns_setup_status": "unchecked",
"verified_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Get a domain with DNS records and status
Parameters
idintegerrequiredpathResponse
Domain
Resource not found
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/domains/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/domains/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/domains/{id}')
data = response.json(){
"id": 0,
"brand_id": 0,
"name": "string",
"provider": "ses",
"integration_id": 0,
"status": "pending",
"dns_records": [
{
"record_type": "string",
"name": "string",
"value": "string",
"priority": "string",
"valid": "string"
}
],
"dns_health": {},
"dns_setup_status": "unchecked",
"verified_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Remove a sending domain
Parameters
idintegerrequiredpathResponse
Domain deleted
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X DELETE 'https://api.nitrosend.com/v1/my/domains/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/domains/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.nitrosend.com/v1/my/domains/{id}')
data = response.json()Verify domain DNS records
Checks if the required DNS records have propagated. If verified,
completes the domain_verified onboarding step and enables sending.
Parameters
idintegerrequiredpathResponse
Domain verification status
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/domains/{id}/verify'const response = await fetch('https://api.nitrosend.com/v1/my/domains/{id}/verify', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.nitrosend.com/v1/my/domains/{id}/verify')
data = response.json(){
"id": 0,
"brand_id": 0,
"name": "string",
"provider": "ses",
"integration_id": 0,
"status": "pending",
"dns_records": [
{
"record_type": "string",
"name": "string",
"value": "string",
"priority": "string",
"valid": "string"
}
],
"dns_health": {},
"dns_setup_status": "unchecked",
"verified_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}Create an Entri bootstrap session for a pending domain
Returns a short-lived Entri JWT plus the DNS record payload needed to launch the Entri modal for a pending domain owned by the current brand.
Parameters
idintegerrequiredpathResponse
Entri bootstrap payload
Resource not found
Validation failed
Rate limit exceeded
Upstream service unavailable
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/domains/{id}/entri_session'const response = await fetch('https://api.nitrosend.com/v1/my/domains/{id}/entri_session', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.nitrosend.com/v1/my/domains/{id}/entri_session')
data = response.json(){
"domain": {
"id": 0,
"name": "string",
"status": "pending"
},
"entri": {
"application_id": "string",
"token": "string",
"prefilled_domain": "string",
"user_id": "string",
"dns_records": [
{
"type": "string",
"host": "string",
"value": "string",
"ttl": 0,
"priority": 0
}
]
}
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Integrations
BYO provider integration management
List integrations (paginated)
Parameters
categorystringemailsmscrmquerypageinteger1queryperinteger30queryResponse
Paginated integrations
Bad request
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/integrations'const response = await fetch('https://api.nitrosend.com/v1/my/integrations', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/integrations')
data = response.json()[
{
"id": 0,
"provider": "mailgun",
"category": "email",
"active": true,
"primary": true,
"status": "pending",
"connected_at": "2024-01-15T09:30:00Z",
"last_tested_at": "2024-01-15T09:30:00Z",
"error_message": "string",
"config_summary": {},
"secret_hints": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Create or connect an email provider integration
Body
integrationobject | object | object | object | objectrequiredResponse
Integration created
Bad request
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/integrations' \
-H 'Content-Type: application/json' \
-d '{
"integration": {
"provider": "mailgun",
"api_key": "string",
"domain": "string",
"region": "string",
"active": true
}
}'const response = await fetch('https://api.nitrosend.com/v1/my/integrations', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"integration": {
"provider": "mailgun",
"api_key": "string",
"domain": "string",
"region": "string",
"active": true
}
}),
});
const data = await response.json();import requests
payload = {
"integration": {
"provider": "mailgun",
"api_key": "string",
"domain": "string",
"region": "string",
"active": True
}
}
response = requests.post('https://api.nitrosend.com/v1/my/integrations', json=payload)
data = response.json(){
"integration": {
"provider": "mailgun",
"api_key": "string",
"domain": "string",
"region": "string",
"active": true
}
}{
"id": 0,
"provider": "mailgun",
"category": "email",
"active": true,
"primary": true,
"status": "pending",
"connected_at": "2024-01-15T09:30:00Z",
"last_tested_at": "2024-01-15T09:30:00Z",
"error_message": "string",
"config_summary": {},
"secret_hints": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Get an integration
Parameters
idintegerrequiredpathResponse
Integration
Resource not found
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/integrations/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/integrations/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/integrations/{id}')
data = response.json(){
"id": 0,
"provider": "mailgun",
"category": "email",
"active": true,
"primary": true,
"status": "pending",
"connected_at": "2024-01-15T09:30:00Z",
"last_tested_at": "2024-01-15T09:30:00Z",
"error_message": "string",
"config_summary": {},
"secret_hints": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Disconnect and delete an integration
Parameters
idintegerrequiredpathconfirmbooleanrequiredqueryMust be true to confirm the destructive action.
Response
Integration deleted
Bad request
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X DELETE 'https://api.nitrosend.com/v1/my/integrations/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/integrations/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.nitrosend.com/v1/my/integrations/{id}')
data = response.json(){
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Update an email provider integration
Updates credentials or operational fields for an existing email provider. The provider cannot be changed once the integration exists.
Body
integrationobject | object | object | object | objectrequiredParameters
idintegerrequiredpathResponse
Integration updated
Bad request
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X PATCH 'https://api.nitrosend.com/v1/my/integrations/{id}' \
-H 'Content-Type: application/json' \
-d '{
"integration": {
"provider": "mailgun",
"api_key": "string",
"domain": "string",
"region": "string",
"active": true
}
}'const response = await fetch('https://api.nitrosend.com/v1/my/integrations/{id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"integration": {
"provider": "mailgun",
"api_key": "string",
"domain": "string",
"region": "string",
"active": true
}
}),
});
const data = await response.json();import requests
payload = {
"integration": {
"provider": "mailgun",
"api_key": "string",
"domain": "string",
"region": "string",
"active": True
}
}
response = requests.patch('https://api.nitrosend.com/v1/my/integrations/{id}', json=payload)
data = response.json(){
"integration": {
"provider": "mailgun",
"api_key": "string",
"domain": "string",
"region": "string",
"active": true
}
}{
"id": 0,
"provider": "mailgun",
"category": "email",
"active": true,
"primary": true,
"status": "pending",
"connected_at": "2024-01-15T09:30:00Z",
"last_tested_at": "2024-01-15T09:30:00Z",
"error_message": "string",
"config_summary": {},
"secret_hints": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Test integration connectivity
Parameters
idintegerrequiredpathResponse
Tested integration
Resource not found
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/integrations/{id}/test'const response = await fetch('https://api.nitrosend.com/v1/my/integrations/{id}/test', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.nitrosend.com/v1/my/integrations/{id}/test')
data = response.json(){
"id": 0,
"provider": "mailgun",
"category": "email",
"active": true,
"primary": true,
"status": "pending",
"connected_at": "2024-01-15T09:30:00Z",
"last_tested_at": "2024-01-15T09:30:00Z",
"error_message": "string",
"config_summary": {},
"secret_hints": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Set an integration as the primary provider for its category
Parameters
idintegerrequiredpathResponse
Integration marked primary
Bad request
Resource not found
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X PATCH 'https://api.nitrosend.com/v1/my/integrations/{id}/primary'const response = await fetch('https://api.nitrosend.com/v1/my/integrations/{id}/primary', {
method: 'PATCH',
});
const data = await response.json();import requests
response = requests.patch('https://api.nitrosend.com/v1/my/integrations/{id}/primary')
data = response.json(){
"id": 0,
"provider": "mailgun",
"category": "email",
"active": true,
"primary": true,
"status": "pending",
"connected_at": "2024-01-15T09:30:00Z",
"last_tested_at": "2024-01-15T09:30:00Z",
"error_message": "string",
"config_summary": {},
"secret_hints": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Start Attio OAuth connect flow
Returns an Attio OAuth authorize URL for the authenticated account/brand. The response URL includes a signed state payload and the API callback URI.
Response
OAuth authorize URL
Not authenticated
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/integrations/attio/connect'const response = await fetch('https://api.nitrosend.com/v1/my/integrations/attio/connect', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.nitrosend.com/v1/my/integrations/attio/connect')
data = response.json(){
"authorize_url": "https://example.com"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Attio OAuth callback endpoint
Public callback endpoint used by Attio after user authorization. Verifies signed state, exchanges auth code, and finalizes Attio integration connection.
Parameters
codestringquerystatestringqueryerrorstringqueryerror_descriptionstringqueryResponse
OAuth callback processed (HTML)
Invalid callback request
OAuth exchange or webhook provisioning failure
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/integrations/attio/callback'const response = await fetch('https://api.nitrosend.com/integrations/attio/callback', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/integrations/attio/callback')
data = response.json()"string""string""string"Brands
Brand identity, theme, and per-brand configuration
List brands
Response
All brands for the account
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/brands'const response = await fetch('https://api.nitrosend.com/v1/my/brands', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/brands')
data = response.json()[
{
"id": 0,
"sid": "string",
"account_id": 0,
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"font_heading": "string",
"font_body": "string",
"style_notes": "string",
"tone": "string",
"company_description": "string",
"industry": "string",
"example_copy": [
"string"
],
"default_header": {},
"default_footer": {},
"default_theme": {},
"physical_address": "string",
"company_name": "string",
"source_url": "string",
"last_scraped_at": "2024-01-15T09:30:00Z",
"links": [
{
"url": "string",
"icon": "string",
"title": "string"
}
],
"logo": "string",
"complete": true,
"email_from_name": "string",
"email_from_email": "string",
"email_reply_to": "string",
"test_email_recipients": [
"user@example.com"
],
"onboarding_state": {},
"onboarding": {
"steps": {},
"progress": {
"completed": 0,
"total": 0
}
},
"domain_verified": true,
"can_send": true,
"subscribed_contacts_count": 0,
"using_sandbox": true,
"sandbox_email": "string",
"sandbox_monthly_cap": 0,
"sandbox_sends_remaining": 0,
"capabilities": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]Create a brand
Body
brand_colorstringtext_colorstringbg_colorstringfont_headingstringfont_bodystringstyle_notesstringtonestringcompany_descriptionstringindustrystringphysical_addressstringcompany_namestringlogostringSigned blob ID or URL
email_from_namestringemail_from_emailstring<email>email_reply_tostring<email>test_email_recipientsArray<string>example_copyArray<string>linksArray<object>default_headerobjectdefault_footerobjectdefault_themeobjectResponse
Brand created
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/brands' \
-H 'Content-Type: application/json' \
-d '{
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"font_heading": "string",
"font_body": "string",
"style_notes": "string",
"tone": "string",
"company_description": "string",
"industry": "string",
"physical_address": "string",
"company_name": "string",
"logo": "string",
"email_from_name": "string",
"email_from_email": "user@example.com",
"email_reply_to": "user@example.com",
"test_email_recipients": [
"user@example.com"
],
"example_copy": [
"string"
],
"links": [
{
"url": "https://example.com",
"icon": "string",
"title": "string"
}
],
"default_header": {},
"default_footer": {},
"default_theme": {}
}'const response = await fetch('https://api.nitrosend.com/v1/my/brands', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"font_heading": "string",
"font_body": "string",
"style_notes": "string",
"tone": "string",
"company_description": "string",
"industry": "string",
"physical_address": "string",
"company_name": "string",
"logo": "string",
"email_from_name": "string",
"email_from_email": "user@example.com",
"email_reply_to": "user@example.com",
"test_email_recipients": [
"user@example.com"
],
"example_copy": [
"string"
],
"links": [
{
"url": "https://example.com",
"icon": "string",
"title": "string"
}
],
"default_header": {},
"default_footer": {},
"default_theme": {}
}),
});
const data = await response.json();import requests
payload = {
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"font_heading": "string",
"font_body": "string",
"style_notes": "string",
"tone": "string",
"company_description": "string",
"industry": "string",
"physical_address": "string",
"company_name": "string",
"logo": "string",
"email_from_name": "string",
"email_from_email": "user@example.com",
"email_reply_to": "user@example.com",
"test_email_recipients": [
"user@example.com"
],
"example_copy": [
"string"
],
"links": [
{
"url": "https://example.com",
"icon": "string",
"title": "string"
}
],
"default_header": {},
"default_footer": {},
"default_theme": {}
}
response = requests.post('https://api.nitrosend.com/v1/my/brands', json=payload)
data = response.json(){
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"font_heading": "string",
"font_body": "string",
"style_notes": "string",
"tone": "string",
"company_description": "string",
"industry": "string",
"physical_address": "string",
"company_name": "string",
"logo": "string",
"email_from_name": "string",
"email_from_email": "user@example.com",
"email_reply_to": "user@example.com",
"test_email_recipients": [
"user@example.com"
],
"example_copy": [
"string"
],
"links": [
{
"url": "https://example.com",
"icon": "string",
"title": "string"
}
],
"default_header": {},
"default_footer": {},
"default_theme": {}
}{
"id": 0,
"sid": "string",
"account_id": 0,
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"font_heading": "string",
"font_body": "string",
"style_notes": "string",
"tone": "string",
"company_description": "string",
"industry": "string",
"example_copy": [
"string"
],
"default_header": {},
"default_footer": {},
"default_theme": {},
"physical_address": "string",
"company_name": "string",
"source_url": "string",
"last_scraped_at": "2024-01-15T09:30:00Z",
"links": [
{
"url": "string",
"icon": "string",
"title": "string"
}
],
"logo": "string",
"complete": true,
"email_from_name": "string",
"email_from_email": "string",
"email_reply_to": "string",
"test_email_recipients": [
"user@example.com"
],
"onboarding_state": {},
"onboarding": {
"steps": {},
"progress": {
"completed": 0,
"total": 0
}
},
"domain_verified": true,
"can_send": true,
"subscribed_contacts_count": 0,
"using_sandbox": true,
"sandbox_email": "string",
"sandbox_monthly_cap": 0,
"sandbox_sends_remaining": 0,
"capabilities": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Get a brand
Parameters
sidstringrequiredpathBrand secure identifier
Response
Brand
Resource not found
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/brands/{sid}'const response = await fetch('https://api.nitrosend.com/v1/my/brands/{sid}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/brands/{sid}')
data = response.json(){
"id": 0,
"sid": "string",
"account_id": 0,
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"font_heading": "string",
"font_body": "string",
"style_notes": "string",
"tone": "string",
"company_description": "string",
"industry": "string",
"example_copy": [
"string"
],
"default_header": {},
"default_footer": {},
"default_theme": {},
"physical_address": "string",
"company_name": "string",
"source_url": "string",
"last_scraped_at": "2024-01-15T09:30:00Z",
"links": [
{
"url": "string",
"icon": "string",
"title": "string"
}
],
"logo": "string",
"complete": true,
"email_from_name": "string",
"email_from_email": "string",
"email_reply_to": "string",
"test_email_recipients": [
"user@example.com"
],
"onboarding_state": {},
"onboarding": {
"steps": {},
"progress": {
"completed": 0,
"total": 0
}
},
"domain_verified": true,
"can_send": true,
"subscribed_contacts_count": 0,
"using_sandbox": true,
"sandbox_email": "string",
"sandbox_monthly_cap": 0,
"sandbox_sends_remaining": 0,
"capabilities": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Delete a brand
Parameters
sidstringrequiredpathBrand secure identifier
Response
Deleted brand
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X DELETE 'https://api.nitrosend.com/v1/my/brands/{sid}'const response = await fetch('https://api.nitrosend.com/v1/my/brands/{sid}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.nitrosend.com/v1/my/brands/{sid}')
data = response.json(){
"id": 0,
"sid": "string",
"account_id": 0,
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"font_heading": "string",
"font_body": "string",
"style_notes": "string",
"tone": "string",
"company_description": "string",
"industry": "string",
"example_copy": [
"string"
],
"default_header": {},
"default_footer": {},
"default_theme": {},
"physical_address": "string",
"company_name": "string",
"source_url": "string",
"last_scraped_at": "2024-01-15T09:30:00Z",
"links": [
{
"url": "string",
"icon": "string",
"title": "string"
}
],
"logo": "string",
"complete": true,
"email_from_name": "string",
"email_from_email": "string",
"email_reply_to": "string",
"test_email_recipients": [
"user@example.com"
],
"onboarding_state": {},
"onboarding": {
"steps": {},
"progress": {
"completed": 0,
"total": 0
}
},
"domain_verified": true,
"can_send": true,
"subscribed_contacts_count": 0,
"using_sandbox": true,
"sandbox_email": "string",
"sandbox_monthly_cap": 0,
"sandbox_sends_remaining": 0,
"capabilities": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}Update a brand
Body
brand_colorstringtext_colorstringbg_colorstringfont_headingstringfont_bodystringstyle_notesstringtonestringcompany_descriptionstringindustrystringphysical_addressstringcompany_namestringlogostringSigned blob ID or URL
email_from_namestringemail_from_emailstring<email>email_reply_tostring<email>test_email_recipientsArray<string>example_copyArray<string>linksArray<object>default_headerobjectdefault_footerobjectdefault_themeobjectParameters
sidstringrequiredpathBrand secure identifier
Response
Updated brand
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X PATCH 'https://api.nitrosend.com/v1/my/brands/{sid}' \
-H 'Content-Type: application/json' \
-d '{
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"font_heading": "string",
"font_body": "string",
"style_notes": "string",
"tone": "string",
"company_description": "string",
"industry": "string",
"physical_address": "string",
"company_name": "string",
"logo": "string",
"email_from_name": "string",
"email_from_email": "user@example.com",
"email_reply_to": "user@example.com",
"test_email_recipients": [
"user@example.com"
],
"example_copy": [
"string"
],
"links": [
{
"url": "https://example.com",
"icon": "string",
"title": "string"
}
],
"default_header": {},
"default_footer": {},
"default_theme": {}
}'const response = await fetch('https://api.nitrosend.com/v1/my/brands/{sid}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"font_heading": "string",
"font_body": "string",
"style_notes": "string",
"tone": "string",
"company_description": "string",
"industry": "string",
"physical_address": "string",
"company_name": "string",
"logo": "string",
"email_from_name": "string",
"email_from_email": "user@example.com",
"email_reply_to": "user@example.com",
"test_email_recipients": [
"user@example.com"
],
"example_copy": [
"string"
],
"links": [
{
"url": "https://example.com",
"icon": "string",
"title": "string"
}
],
"default_header": {},
"default_footer": {},
"default_theme": {}
}),
});
const data = await response.json();import requests
payload = {
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"font_heading": "string",
"font_body": "string",
"style_notes": "string",
"tone": "string",
"company_description": "string",
"industry": "string",
"physical_address": "string",
"company_name": "string",
"logo": "string",
"email_from_name": "string",
"email_from_email": "user@example.com",
"email_reply_to": "user@example.com",
"test_email_recipients": [
"user@example.com"
],
"example_copy": [
"string"
],
"links": [
{
"url": "https://example.com",
"icon": "string",
"title": "string"
}
],
"default_header": {},
"default_footer": {},
"default_theme": {}
}
response = requests.patch('https://api.nitrosend.com/v1/my/brands/{sid}', json=payload)
data = response.json(){
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"font_heading": "string",
"font_body": "string",
"style_notes": "string",
"tone": "string",
"company_description": "string",
"industry": "string",
"physical_address": "string",
"company_name": "string",
"logo": "string",
"email_from_name": "string",
"email_from_email": "user@example.com",
"email_reply_to": "user@example.com",
"test_email_recipients": [
"user@example.com"
],
"example_copy": [
"string"
],
"links": [
{
"url": "https://example.com",
"icon": "string",
"title": "string"
}
],
"default_header": {},
"default_footer": {},
"default_theme": {}
}{
"id": 0,
"sid": "string",
"account_id": 0,
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"font_heading": "string",
"font_body": "string",
"style_notes": "string",
"tone": "string",
"company_description": "string",
"industry": "string",
"example_copy": [
"string"
],
"default_header": {},
"default_footer": {},
"default_theme": {},
"physical_address": "string",
"company_name": "string",
"source_url": "string",
"last_scraped_at": "2024-01-15T09:30:00Z",
"links": [
{
"url": "string",
"icon": "string",
"title": "string"
}
],
"logo": "string",
"complete": true,
"email_from_name": "string",
"email_from_email": "string",
"email_reply_to": "string",
"test_email_recipients": [
"user@example.com"
],
"onboarding_state": {},
"onboarding": {
"steps": {},
"progress": {
"completed": 0,
"total": 0
}
},
"domain_verified": true,
"can_send": true,
"subscribed_contacts_count": 0,
"using_sandbox": true,
"sandbox_email": "string",
"sandbox_monthly_cap": 0,
"sandbox_sends_remaining": 0,
"capabilities": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Auto-detect brand from website
Enqueues a background job that scrapes the URL for brand colors,
fonts, logo, and tone. Returns 202 immediately. Poll
GET /v1/my/brands/{sid} for results.
Body
urlstring<uri>requiredParameters
sidstringrequiredpathBrand secure identifier
Response
Scrape job enqueued
Invalid URL
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/brands/{sid}/scrape' \
-H 'Content-Type: application/json' \
-d '{
"url": "https://example.com"
}'const response = await fetch('https://api.nitrosend.com/v1/my/brands/{sid}/scrape', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"url": "https://example.com"
}),
});
const data = await response.json();import requests
payload = {
"url": "https://example.com"
}
response = requests.post('https://api.nitrosend.com/v1/my/brands/{sid}/scrape', json=payload)
data = response.json(){
"url": "https://example.com"
}{
"status": "scraping",
"url": "https://example.com"
}{
"error": "string"
}Get brand onboarding state
Parameters
sidstringrequiredpathBrand secure identifier
Response
Onboarding state for the brand
Resource not found
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/brands/{sid}/onboarding'const response = await fetch('https://api.nitrosend.com/v1/my/brands/{sid}/onboarding', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/brands/{sid}/onboarding')
data = response.json(){
"steps": {},
"progress": {
"completed": 0,
"total": 0
}
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Complete a brand onboarding step
Body
stepstringbrand_setupdomain_verifiedfirst_contactfirst_sendrequiredParameters
sidstringrequiredpathBrand secure identifier
Response
Updated onboarding state
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/my/brands/{sid}/onboarding/steps' \
-H 'Content-Type: application/json' \
-d '{
"step": "brand_setup"
}'const response = await fetch('https://api.nitrosend.com/v1/my/brands/{sid}/onboarding/steps', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"step": "brand_setup"
}),
});
const data = await response.json();import requests
payload = {
"step": "brand_setup"
}
response = requests.post('https://api.nitrosend.com/v1/my/brands/{sid}/onboarding/steps', json=payload)
data = response.json(){
"step": "brand_setup"
}{
"steps": {},
"progress": {
"completed": 0,
"total": 0
}
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Get brand setup center state
Parameters
sidstringrequiredpathBrand secure identifier
Response
Setup center state for the brand
Resource not found
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X GET 'https://api.nitrosend.com/v1/my/brands/{sid}/setup_center'const response = await fetch('https://api.nitrosend.com/v1/my/brands/{sid}/setup_center', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/brands/{sid}/setup_center')
data = response.json(){
"cards": [
{
"id": "brand_scan",
"complete": true,
"acknowledged": true,
"acknowledged_at": "2024-01-15T09:30:00Z"
}
],
"sections": {
"required": [
"string"
],
"recommended": [
"string"
]
},
"progress": {
"completed": 0,
"total": 0
},
"seen": true,
"dismissed": true,
"complete": true
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Update brand setup center state
Body
Provide one of seen, dismissed, or card.
seenbooleandismissedbooleancardstringbrand_scandnsplanconnect_agentimport_subscribersconnect_transactionalmetadataobjectParameters
sidstringrequiredpathBrand secure identifier
Response
Updated setup center state
Validation failed
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X PATCH 'https://api.nitrosend.com/v1/my/brands/{sid}/setup_center' \
-H 'Content-Type: application/json' \
-d '{
"seen": true,
"dismissed": true,
"card": "brand_scan",
"metadata": {}
}'const response = await fetch('https://api.nitrosend.com/v1/my/brands/{sid}/setup_center', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"seen": true,
"dismissed": true,
"card": "brand_scan",
"metadata": {}
}),
});
const data = await response.json();import requests
payload = {
"seen": True,
"dismissed": True,
"card": "brand_scan",
"metadata": {}
}
response = requests.patch('https://api.nitrosend.com/v1/my/brands/{sid}/setup_center', json=payload)
data = response.json(){
"seen": true,
"dismissed": true,
"card": "brand_scan",
"metadata": {}
}{
"cards": [
{
"id": "brand_scan",
"complete": true,
"acknowledged": true,
"acknowledged_at": "2024-01-15T09:30:00Z"
}
],
"sections": {
"required": [
"string"
],
"recommended": [
"string"
]
},
"progress": {
"completed": 0,
"total": 0
},
"seen": true,
"dismissed": true,
"complete": true
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}Public
Unauthenticated public endpoints
Add or attach a public signup contact
Idempotent public signup endpoint for landing pages and embeds. Authenticate with a brand public API key in the Bearer token.
Body
emailstring<email>requiredlist_idintegerrequiredsourcestring | nullResponse
Contact accepted
Not authenticated
Resource not found
Validation failed
Rate limit exceeded
Authorization
BearerAuthhttp (bearer)API key (nskey_live_...) or JWT token. API key is checked first;
if not found, falls back to Devise JWT authentication.
For multi-brand accounts, include the X-Brand-SID header to scope
requests to a specific brand. If omitted, the account's default
brand is used. JWT requests can also include X-Account-ID to select
an accessible account.
curl -X POST 'https://api.nitrosend.com/v1/public/contacts' \
-H 'Content-Type: application/json' \
-d '{
"email": "user@example.com",
"list_id": 0,
"source": "string"
}'const response = await fetch('https://api.nitrosend.com/v1/public/contacts', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"email": "user@example.com",
"list_id": 0,
"source": "string"
}),
});
const data = await response.json();import requests
payload = {
"email": "user@example.com",
"list_id": 0,
"source": "string"
}
response = requests.post('https://api.nitrosend.com/v1/public/contacts', json=payload)
data = response.json(){
"email": "user@example.com",
"list_id": 0,
"source": "string"
}{
"ok": true
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"validation_errors": {}
}{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}Get available plans
Response
Active plans
curl -X GET 'https://api.nitrosend.com/v1/app'const response = await fetch('https://api.nitrosend.com/v1/app', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/app')
data = response.json(){
"plans": [
{
"id": 0,
"name": "string",
"active": true
}
]
}Models
Error
objectcodeintegerrequiredmessagestringrequirederrorbooleanrequirederror_codestring | nullOptional machine-readable error reason.
{
"code": 0,
"message": "string",
"error": true,
"error_code": "string"
}User
objectidintegerfirst_namestring | nulllast_namestring | nullemailstring<email>mobilestring | nullcountry_codestring | nulladminbooleancreated_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"mobile": "string",
"country_code": "string",
"admin": true,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}Account
objectidintegernamestring | nullavatarstring | nullSigned blob ID
bannerstring | nullSigned blob ID
account_tierstringfreepaidtrustedsafe_mode_enabledbooleanbillingobjectbrandsArray<object>teamobjectcreated_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"name": "string",
"avatar": "string",
"banner": "string",
"account_tier": "free",
"safe_mode_enabled": true,
"billing": {
"plan_name": "string",
"wallet_balance_cents": 0,
"auto_topup": true,
"resources": {
"email": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0
},
"sms": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0
},
"ai": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0
}
},
"lifetime": {
"email_sent": 0,
"sms_sent": 0,
"ai_used": 0
}
},
"brands": [
{
"id": 0,
"sid": "string",
"account_id": 0,
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"font_heading": "string",
"font_body": "string",
"style_notes": "string",
"tone": "string",
"company_description": "string",
"industry": "string",
"example_copy": [
"string"
],
"default_header": {},
"default_footer": {},
"default_theme": {},
"physical_address": "string",
"company_name": "string",
"source_url": "string",
"last_scraped_at": "2024-01-15T09:30:00Z",
"links": [
{
"url": "string",
"icon": "string",
"title": "string"
}
],
"logo": "string",
"complete": true,
"email_from_name": "string",
"email_from_email": "string",
"email_reply_to": "string",
"test_email_recipients": [
"user@example.com"
],
"onboarding_state": {},
"onboarding": {
"steps": {},
"progress": {
"completed": 0,
"total": 0
}
},
"domain_verified": true,
"can_send": true,
"subscribed_contacts_count": 0,
"using_sandbox": true,
"sandbox_email": "string",
"sandbox_monthly_cap": 0,
"sandbox_sends_remaining": 0,
"capabilities": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
],
"team": {
"seat_limit": 0,
"seat_count": 0,
"member_count": 0,
"invite_count": 0,
"current_role": "string",
"can_manage_team": true
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}AccountTeam
objectaccountobjectmembershipsArray<object>invitesArray<object>accessible_accountsArray<object>{
"account": {
"id": 0,
"name": "string",
"avatar": "string",
"banner": "string",
"account_tier": "free",
"safe_mode_enabled": true,
"billing": {
"plan_name": "string",
"wallet_balance_cents": 0,
"auto_topup": true,
"resources": {
"email": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0
},
"sms": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0
},
"ai": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0
}
},
"lifetime": {
"email_sent": 0,
"sms_sent": 0,
"ai_used": 0
}
},
"brands": [
{
"id": 0,
"sid": "string",
"account_id": 0,
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"font_heading": "string",
"font_body": "string",
"style_notes": "string",
"tone": "string",
"company_description": "string",
"industry": "string",
"example_copy": [
"string"
],
"default_header": {},
"default_footer": {},
"default_theme": {},
"physical_address": "string",
"company_name": "string",
"source_url": "string",
"last_scraped_at": "2024-01-15T09:30:00Z",
"links": [
{
"url": "string",
"icon": "string",
"title": "string"
}
],
"logo": "string",
"complete": true,
"email_from_name": "string",
"email_from_email": "string",
"email_reply_to": "string",
"test_email_recipients": [
"user@example.com"
],
"onboarding_state": {},
"onboarding": {
"steps": {},
"progress": {
"completed": 0,
"total": 0
}
},
"domain_verified": true,
"can_send": true,
"subscribed_contacts_count": 0,
"using_sandbox": true,
"sandbox_email": "string",
"sandbox_monthly_cap": 0,
"sandbox_sends_remaining": 0,
"capabilities": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
],
"team": {
"seat_limit": 0,
"seat_count": 0,
"member_count": 0,
"invite_count": 0,
"current_role": "string",
"can_manage_team": true
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
},
"memberships": [
{
"id": 0,
"role": "member",
"user_id": 0,
"email": "user@example.com",
"name": "string",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
],
"invites": [
{
"id": 0,
"account_id": 0,
"email": "user@example.com",
"role": "member",
"token": "string",
"status": "pending",
"accepted_at": "2024-01-15T09:30:00Z",
"revoked_at": "2024-01-15T09:30:00Z",
"expires_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
],
"accessible_accounts": [
{
"id": 0,
"name": "string",
"avatar": "string",
"banner": "string",
"account_tier": "free",
"safe_mode_enabled": true,
"billing": {
"plan_name": "string",
"wallet_balance_cents": 0,
"auto_topup": true,
"resources": {
"email": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0
},
"sms": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0
},
"ai": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0
}
},
"lifetime": {
"email_sent": 0,
"sms_sent": 0,
"ai_used": 0
}
},
"brands": [
{
"id": 0,
"sid": "string",
"account_id": 0,
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"font_heading": "string",
"font_body": "string",
"style_notes": "string",
"tone": "string",
"company_description": "string",
"industry": "string",
"example_copy": [
"string"
],
"default_header": {},
"default_footer": {},
"default_theme": {},
"physical_address": "string",
"company_name": "string",
"source_url": "string",
"last_scraped_at": "2024-01-15T09:30:00Z",
"links": [
{
"url": "string",
"icon": "string",
"title": "string"
}
],
"logo": "string",
"complete": true,
"email_from_name": "string",
"email_from_email": "string",
"email_reply_to": "string",
"test_email_recipients": [
"user@example.com"
],
"onboarding_state": {},
"onboarding": {
"steps": {},
"progress": {
"completed": 0,
"total": 0
}
},
"domain_verified": true,
"can_send": true,
"subscribed_contacts_count": 0,
"using_sandbox": true,
"sandbox_email": "string",
"sandbox_monthly_cap": 0,
"sandbox_sends_remaining": 0,
"capabilities": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
],
"team": {
"seat_limit": 0,
"seat_count": 0,
"member_count": 0,
"invite_count": 0,
"current_role": "string",
"can_manage_team": true
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}AccountMembership
objectidintegerrolestringmemberadminowneruser_idintegeremailstring<email>namestring | nullcreated_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"role": "member",
"user_id": 0,
"email": "user@example.com",
"name": "string",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}AccountInvite
objectidintegeraccount_idintegeremailstring<email>rolestringmemberadmintokenstringstatusstringpendingacceptedrevokedexpiredaccepted_atstring<date-time> | nullrevoked_atstring<date-time> | nullexpires_atstring<date-time> | nullcreated_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"account_id": 0,
"email": "user@example.com",
"role": "member",
"token": "string",
"status": "pending",
"accepted_at": "2024-01-15T09:30:00Z",
"revoked_at": "2024-01-15T09:30:00Z",
"expires_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}OAuthPopupAccount
objectidintegerrequirednamestringrequiredcan_managebooleanneeds_subscribebooleanrequired{
"id": 0,
"name": "string",
"can_manage": true,
"needs_subscribe": true
}OAuthPopupPlan
objectidintegerrequirednamestringrequiredslugstringrequiredbase_price_centsintegerrequiredintervalstring | null{
"id": 0,
"name": "string",
"slug": "string",
"base_price_cents": 0,
"interval": "string"
}OAuthPopupContext
objectaccountsArray<object>requiredplansArray<object>requiredstripe_publishable_keystring | null{
"accounts": [
{
"id": 0,
"name": "string",
"can_manage": true,
"needs_subscribe": true
}
],
"plans": [
{
"id": 0,
"name": "string",
"slug": "string",
"base_price_cents": 0,
"interval": "string"
}
],
"stripe_publishable_key": "string"
}OAuthPopupSubscribeRequest
objectplan_idintegerrequiredaccount_idinteger | nullstripe_tokenstring | null{
"plan_id": 0,
"account_id": 0,
"stripe_token": "string"
}OAuthLaunchRequest
objectproviderstringgoogle_oauth2githubrequiredauth_intentstringappagentappauth_stepstringloginsignuploginresume_urlstring<uri> | nullRequired when auth_intent=agent; must point to the frontend /oauth/connect route.
{
"provider": "google_oauth2",
"auth_intent": "app",
"auth_step": "login",
"resume_url": "https://example.com"
}OAuthLaunchResponse
objectlaunch_urlstring<uri>required{
"launch_url": "https://example.com"
}Brand
objectidintegersidstringread onlyPublic secure identifier (non-sequential)
account_idintegerbrand_colorstring | nulltext_colorstring | nullbg_colorstring | nullfont_headingstring | nullfont_bodystring | nullstyle_notesstring | nulltonestring | nullcompany_descriptionstring | nullindustrystring | nullexample_copyArray<string> | nulldefault_headerobject | nulldefault_footerobject | nulldefault_themeobject | nullphysical_addressstring | nullcompany_namestring | nullsource_urlstring | nulllast_scraped_atstring<date-time> | nulllinksArray<object> | nulllogostring | nullLogo URL
completebooleanTrue when brand_color and company_name are set
email_from_namestring | nullemail_from_emailstring | nullemail_reply_tostring | nulltest_email_recipientsArray<string>onboarding_stateobjectJSONB — keys are step names, values are completion metadata
onboardingobjectdomain_verifiedbooleancan_sendbooleansubscribed_contacts_countintegerCount of subscribed contacts in this brand.
using_sandboxbooleansandbox_emailstring | nullsandbox_monthly_capintegersandbox_sends_remainingintegercapabilitiesobjectcreated_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"sid": "string",
"account_id": 0,
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"font_heading": "string",
"font_body": "string",
"style_notes": "string",
"tone": "string",
"company_description": "string",
"industry": "string",
"example_copy": [
"string"
],
"default_header": {},
"default_footer": {},
"default_theme": {},
"physical_address": "string",
"company_name": "string",
"source_url": "string",
"last_scraped_at": "2024-01-15T09:30:00Z",
"links": [
{
"url": "string",
"icon": "string",
"title": "string"
}
],
"logo": "string",
"complete": true,
"email_from_name": "string",
"email_from_email": "string",
"email_reply_to": "string",
"test_email_recipients": [
"user@example.com"
],
"onboarding_state": {},
"onboarding": {
"steps": {},
"progress": {
"completed": 0,
"total": 0
}
},
"domain_verified": true,
"can_send": true,
"subscribed_contacts_count": 0,
"using_sandbox": true,
"sandbox_email": "string",
"sandbox_monthly_cap": 0,
"sandbox_sends_remaining": 0,
"capabilities": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}SetupCenterPayload
objectcardsArray<object>sectionsobjectprogressobjectseenbooleandismissedbooleancompleteboolean{
"cards": [
{
"id": "brand_scan",
"complete": true,
"acknowledged": true,
"acknowledged_at": "2024-01-15T09:30:00Z"
}
],
"sections": {
"required": [
"string"
],
"recommended": [
"string"
]
},
"progress": {
"completed": 0,
"total": 0
},
"seen": true,
"dismissed": true,
"complete": true
}SetupCenterCard
objectidstringbrand_scandnsplanconnect_agentimport_subscribersconnect_transactionalcompletebooleanacknowledgedbooleanacknowledged_atstring<date-time> | null{
"id": "brand_scan",
"complete": true,
"acknowledged": true,
"acknowledged_at": "2024-01-15T09:30:00Z"
}Contact
objectidintegerbrand_idinteger | nulluuidstring<uuid>first_namestring | nulllast_namestring | nullsourcestring | nullcountry_codestring | nulldataobjectCustom key-value data. The reserved key tags holds an array of
string labels used for segmentation and targeting.
subscribed_phonebooleansubscribed_emailbooleanverification_statusstringverifiedsuppressedunverifiedenrichment_statusstringenrichednot_enrichedlist_idsArray<integer>last_interacted_atstring<date-time> | nullcreated_atstring<date-time>updated_atstring<date-time>channelsArray<object>{
"id": 0,
"brand_id": 0,
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"first_name": "string",
"last_name": "string",
"source": "string",
"country_code": "string",
"data": {
"tags": [
"vip",
"newsletter"
],
"plan": "pro"
},
"subscribed_phone": true,
"subscribed_email": true,
"verification_status": "verified",
"enrichment_status": "enriched",
"list_ids": [
0
],
"last_interacted_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"channels": [
{
"id": 0,
"contact_id": 0,
"kind": "email",
"value": "string",
"subscribed": true,
"verified": true,
"opt_in_at": "2024-01-15T09:30:00Z",
"opt_out_at": "2024-01-15T09:30:00Z",
"sent_count": 0,
"fail_count": 0,
"data": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}ContactChannel
objectidintegercontact_idintegerkindstringemailphonevaluestringsubscribedbooleanverifiedbooleanopt_in_atstring<date-time> | nullopt_out_atstring<date-time> | nullsent_countintegerfail_countintegerdataobjectcreated_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"contact_id": 0,
"kind": "email",
"value": "string",
"subscribed": true,
"verified": true,
"opt_in_at": "2024-01-15T09:30:00Z",
"opt_out_at": "2024-01-15T09:30:00Z",
"sent_count": 0,
"fail_count": 0,
"data": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}ContactList
objectidintegeraccount_idintegerbrand_idinteger | nullnamestringcontacts_countintegersegment_idinteger | nullstalebooleanlast_populated_atstring<date-time> | nullcreated_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"account_id": 0,
"brand_id": 0,
"name": "string",
"contacts_count": 0,
"segment_id": 0,
"stale": true,
"last_populated_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}ListDeleteWarning
objectcampaign_namesArray<string>flow_namesArray<string>{
"campaign_names": [
"string"
],
"flow_names": [
"string"
]
}BulkListContactsRequest
objectactionstringaddremoverequiredAdd existing contacts to the list or remove them from it.
emailsArray<string>required{
"action": "add",
"emails": [
"user@example.com"
]
}BulkListContactsResponse
objectactionstringaddremovelist_idintegeraddedintegerContacts newly added for add actions
removedintegerContacts removed for remove actions
already_in_listArray<string>not_in_listArray<string>not_foundArray<string>invalid_emailsArray<string>{
"action": "add",
"list_id": 0,
"added": 0,
"removed": 0,
"already_in_list": [
"user@example.com"
],
"not_in_list": [
"user@example.com"
],
"not_found": [
"user@example.com"
],
"invalid_emails": [
"string"
]
}Import
objectidintegerresourcestringcontactsparserstringdefaultstatusstringpendingprocessingfailedcanceledcompletetotal_rowsinteger | nullsuccess_rowsinteger | nullfailed_rowsinteger | nullimport_errorsArray<Array<integer | string>>Row-level errors as [line_number, message, source].
columnsobject | nulloptionsobject | nullstarted_atstring<date-time> | nullended_atstring<date-time> | nullcreated_atstring<date-time>{
"id": 0,
"resource": "contacts",
"parser": "default",
"status": "pending",
"total_rows": 0,
"success_rows": 0,
"failed_rows": 0,
"import_errors": [
[
0
]
],
"columns": {},
"options": {},
"started_at": "2024-01-15T09:30:00Z",
"ended_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}Segment
objectidintegeraccount_idintegerbrand_idinteger | nullnamestringfiltersArray<object>created_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"account_id": 0,
"brand_id": 0,
"name": "string",
"filters": [
{
"name": "string",
"predicate": "string"
}
],
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}Campaign
objectidintegeraccount_idintegerbrand_idinteger | nullstatusstringdraftactivepausedcompletedapproval_statestringchannelstringemailsmsnamestringdataobjectscheduled_atstring<date-time> | nullsent_countintegereditablebooleanread onlyTrue when the campaign's content/audience/template can be edited.
False for live, paused, completed, cancelled, archived, and for
scheduled campaigns within 5 minutes of their scheduled_at. When
false, PUT update accepts only name-only payloads and status
transitions (Resume / Cancel); anything else returns 422
campaign_locked. Use POST /duplicate to fork into a new draft.
created_atstring<date-time>updated_atstring<date-time>triggerobjecttemplateobject | nulltemplatesArray<object>{
"id": 0,
"account_id": 0,
"brand_id": 0,
"status": "draft",
"approval_state": "string",
"channel": "email",
"name": "string",
"data": {},
"scheduled_at": "2024-01-15T09:30:00Z",
"sent_count": 0,
"editable": true,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"trigger": {
"id": 0,
"flow_id": 0,
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"data": {},
"triggered_count": 0,
"last_triggered_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
},
"template": {
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
},
"variables": {},
"generation_id": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
},
"templates": [
{
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
},
"variables": {},
"generation_id": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}Message
objectidintegerchannelstringemailsmstostringsubjectstring | nullstatusstringqueuedsentfailedprovider_idstring | nullflow_idinteger | nullSource flow ID (null for transactional)
source_typestring | nullcampaignflowcampaign, flow, or null (transactional)
source_namestring | nullName of source campaign or flow
sent_atstring<date-time> | nullcreated_atstring<date-time>{
"id": 0,
"channel": "email",
"to": "string",
"subject": "string",
"status": "queued",
"provider_id": "string",
"flow_id": 0,
"source_type": "campaign",
"source_name": "string",
"sent_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}Template
objectidintegernamestring | nullflow_idinteger | nullaction_idinteger | nullsubjectstring | nullbodystring | nullpreheaderstring | nullfrom_namestring | nullfrom_emailstring | nullreply_tostring | nulldesignobject | nullvariablesobjectgeneration_idinteger | nullcreated_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
},
"variables": {},
"generation_id": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}EmailStarter
objectidstringcategorystringnamestringdescriptionstringiconstringsuggested_goalsArray<string>designobjectEmail template design document
preview_htmlstring | null{
"id": "string",
"category": "string",
"name": "string",
"description": "string",
"icon": "string",
"suggested_goals": [
"string"
],
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
},
"preview_html": "string"
}TemplateSummary
objectidintegernamestring | nullsubjectstring | nullpreheaderstring | nullflow_idinteger | nullsection_countintegersection_typesArray<string>created_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"name": "string",
"subject": "string",
"preheader": "string",
"flow_id": 0,
"section_count": 0,
"section_types": [
"string"
],
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}Flow
objectidintegeraccount_idintegerbrand_idinteger | nullstatusstringdraftactivepausedarchivedapproval_statestringnamestringgoalstring | nulltriggerobjectTrigger as returned by Flow::Format.dump
stepsArray<any>sent_countintegercreated_atstring<date-time>updated_atstring<date-time>templatesArray<object>{
"id": 0,
"account_id": 0,
"brand_id": 0,
"status": "draft",
"approval_state": "string",
"name": "string",
"goal": "string",
"trigger": {
"event": "string",
"segment_id": 0,
"contact_list_id": 0,
"data": {}
},
"steps": [],
"sent_count": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"templates": [
{
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
},
"variables": {},
"generation_id": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}FlowTrigger
objectidintegerflow_idintegereventstringaudience_typestring | nulllistssegmentall_contactsExplicit campaign audience target; null means no audience selected.
segment_idinteger | nullcontact_list_idinteger | nulldeprecatedDeprecated — use contact_list_ids
contact_list_idsArray<integer>Contact list IDs targeted by this trigger
dataobject | nulltriggered_countintegerlast_triggered_atstring<date-time> | nullcreated_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"flow_id": 0,
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"data": {},
"triggered_count": 0,
"last_triggered_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}FlowTriggerInput
objecteventstringBuilt-in: contact_add, keyword, message, list_add, list_remove, product_view, checkout, cart_add, cart_remove, cart_abandoned, browse_abandoned. Custom: any lowercase alphanumeric with underscores.
audience_typestring | nulllistssegmentall_contactsExplicit campaign audience target; null means no audience selected.
segment_idinteger | nullcontact_list_idinteger | nulldeprecatedDeprecated — use contact_list_ids
contact_list_idsArray<integer>Contact list IDs to target
dataobject{
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"data": {}
}FlowTriggerOutput
objectTrigger as returned by Flow::Format.dump
eventstringsegment_idinteger | nullcontact_list_idinteger | nulldataobject | null{
"event": "string",
"segment_id": 0,
"contact_list_id": 0,
"data": {}
}FlowStepInput
objecttypestringemailsmswaitsplitemit_eventrequiredsubjectstringEmail step: subject line
bodystringSMS body or email plain text
preheaderstringEmail step: preheader
from_namestringfrom_emailstringreply_tostringdesignobjectEmail template design document
durationintegerWait step: seconds
filtersArray<object>Split step: condition filters
yesArray<any>Split step: yes branch
noArray<any>Split step: no branch
event_namestringEmit event step: event to fire
forward_event_databooleanfalseevent_dataobjecttransactionalbooleanfalse{
"type": "email",
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
},
"duration": 0,
"filters": [
{
"name": "string",
"predicate": "string"
}
],
"yes": [],
"no": [],
"event_name": "string",
"forward_event_data": false,
"event_data": {},
"transactional": false
}FlowStepOutput
objectStep as returned by Flow::Format.dump
typestringemailsmswaitsplitemit_eventsubjectstringbodystringpreheaderstringdurationintegerfiltersArray<object>yesArray<any>noArray<any>event_namestringforward_event_databoolean{
"type": "email",
"subject": "string",
"body": "string",
"preheader": "string",
"duration": 0,
"filters": [
{}
],
"yes": [],
"no": [],
"event_name": "string",
"forward_event_data": true
}Event
objectidintegeraccount_idintegercontact_idintegeruser_idintegereventstringamountnumber<double> | nulldataobjectidempotency_keystring | nullresource_uidstring | nullresource_namestring | nullresource_urlstring | nulltestbooleangeneratedbooleanchain_depthintegeripstring | nulluser_agentstring | nullbrowserstring | nullosstring | nulldevice_typestring | nullreferrerstring | nullutm_sourcestring | nullutm_mediumstring | nullutm_termstring | nullutm_contentstring | nullutm_campaignstring | nullcreated_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"account_id": 0,
"contact_id": 0,
"user_id": 0,
"event": "string",
"amount": 0,
"data": {},
"idempotency_key": "string",
"resource_uid": "string",
"resource_name": "string",
"resource_url": "string",
"test": true,
"generated": true,
"chain_depth": 0,
"ip": "string",
"user_agent": "string",
"browser": "string",
"os": "string",
"device_type": "string",
"referrer": "string",
"utm_source": "string",
"utm_medium": "string",
"utm_term": "string",
"utm_content": "string",
"utm_campaign": "string",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}Domain
objectidintegerbrand_idinteger | nullnamestringproviderstringsesintegration_idinteger | nullstatusstringpendingverifiedfaileddns_recordsArray<object> | nulldns_healthobject | nulldns_setup_statusstringuncheckedincompletereadyverifiedverified_atstring<date-time> | nullcreated_atstring<date-time>{
"id": 0,
"brand_id": 0,
"name": "string",
"provider": "ses",
"integration_id": 0,
"status": "pending",
"dns_records": [
{
"record_type": "string",
"name": "string",
"value": "string",
"priority": "string",
"valid": "string"
}
],
"dns_health": {},
"dns_setup_status": "unchecked",
"verified_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}EntriSessionResponse
objectdomainobjectentriobject{
"domain": {
"id": 0,
"name": "string",
"status": "pending"
},
"entri": {
"application_id": "string",
"token": "string",
"prefilled_domain": "string",
"user_id": "string",
"dns_records": [
{
"type": "string",
"host": "string",
"value": "string",
"ttl": 0,
"priority": 0
}
]
}
}EntriDnsRecord
objecttypestringhoststringvaluestringttlintegerpriorityinteger | null{
"type": "string",
"host": "string",
"value": "string",
"ttl": 0,
"priority": 0
}Integration
objectidintegerproviderstringmailgunsespostmarkresendsendgridtwilioattiocategorystringemailsmscrmactivebooleanprimarybooleanstatusstringpendingconnectederrorconnected_atstring<date-time> | nulllast_tested_atstring<date-time> | nullerror_messagestring | nullconfig_summaryobjectsecret_hintsobjectcreated_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"provider": "mailgun",
"category": "email",
"active": true,
"primary": true,
"status": "pending",
"connected_at": "2024-01-15T09:30:00Z",
"last_tested_at": "2024-01-15T09:30:00Z",
"error_message": "string",
"config_summary": {},
"secret_hints": {},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}IntegrationWriteRequest
objectintegrationobject | object | object | object | objectrequired{
"integration": {
"provider": "mailgun",
"api_key": "string",
"domain": "string",
"region": "string",
"active": true
}
}MailgunIntegrationInput
objectproviderstringmailgunrequiredapi_keystringrequireddomainstringrequiredMailgun sending domain
regionstring | nullOptional Mailgun region hint
activebooleantrue{
"provider": "mailgun",
"api_key": "string",
"domain": "string",
"region": "string",
"active": true
}SesIntegrationInput
objectproviderstringsesrequiredaccess_key_idstringrequiredsecret_access_keystringrequiredregionstringrequiredAWS SES region
activebooleantrue{
"provider": "ses",
"access_key_id": "string",
"secret_access_key": "string",
"region": "string",
"active": true
}PostmarkIntegrationInput
objectproviderstringpostmarkrequiredserver_tokenstringrequiredPostmark server token for sending email
account_tokenstringrequiredPostmark account token for domains API access
activebooleantrue{
"provider": "postmark",
"server_token": "string",
"account_token": "string",
"active": true
}ResendIntegrationInput
objectproviderstringresendrequiredapi_keystringrequiredactivebooleantrue{
"provider": "resend",
"api_key": "string",
"active": true
}SendgridIntegrationInput
objectproviderstringsendgridrequiredapi_keystringrequiredactivebooleantrue{
"provider": "sendgrid",
"api_key": "string",
"active": true
}EmailDesign
objectEmail template design document
sectionsArray<object>themeobjectTheme overrides merged on top of brand theme
{
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"logo_url": "string"
}
}EmailSection
objecttypestringheaderherotextimagebuttoncolumnsproductsocialdividerspacerfooterrequiredpropsobjectSection-specific properties (see email component spec)
stylesobject{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"padding": "string",
"align": "left"
}
}EmailComponentSpec
objectFull schema for email design sections. Each component has type, description, props (with types, required flags, defaults), and tips.
versionintegerdesign_guidelinesstringcomponentsArray<object>common_stylesobjectvariablesArray<string>theme_fieldsArray<string>{
"version": 0,
"design_guidelines": "string",
"components": [
{
"type": "string",
"description": "string",
"tips": [
"string"
],
"props": {}
}
],
"common_styles": {},
"variables": [
"string"
],
"theme_fields": [
"string"
]
}FlowSpec
objectSchema for flow step types, trigger events, and segment filter names. Note: the raw response includes internal fields (icon, visible, inputs, outputs, alias) used by the flow editor UI — these can be ignored by API consumers.
filtersobjecttriggersArray<object>stepsArray<object>{
"filters": {},
"triggers": [
{
"title": "string",
"event": "string"
}
],
"steps": [
{
"type": "string",
"title": "string",
"summary": "string",
"params": {}
}
]
}