Nitrosend API
v1.1.6https://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 Kit — all via a single REST API.
Authentication
All /v1/my/* endpoints require authentication via Bearer token.
Three token types are accepted:
- API Key —
Authorization: Bearer nskey_live_... - JWT —
Authorization: Bearer <jwt>(obtained fromPOST /v1/login) - Shopify ID token — supplied by App Bridge for an installed embedded app
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
BearerAuthhttpAuthentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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
PartnerProvisioningCredentialhttpManager-account provisioning credential revealed once at issuance.
Scheme: bearer (nspk_live)
ManagementCredentialhttpOne-time-revealed operator_v1 credential pinned to one active management grant and Brand.
Scheme: bearer (nsmc_live)
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",
"time_zone": "string",
"admin": true,
"ui_login_count": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"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",
"time_zone": "string",
"admin": true,
"ui_login_count": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Sign out and revoke JWT
Response
Signed out
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"access": {
"source": "owner",
"delegated": true,
"manager_account_id": 0,
"manager_account_name": "string",
"management_grant_id": 0,
"permission_set": "operator_v1",
"credential_type": "management"
},
"can_manage": true,
"needs_subscribe": true
}
],
"plans": [
{
"id": 0,
"name": "string",
"slug": "string",
"base_price_cents": 0,
"interval": "string"
}
],
"stripe_publishable_key": "string"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}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)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"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)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"time_zone": "string",
"admin": true,
"ui_login_count": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Update current user profile
Body
first_namestringlast_namestringemailstring | Array<string>mobilestringtime_zonestring | nullResponse
Updated user
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"time_zone": "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",
"time_zone": "string"
}),
});
const data = await response.json();import requests
payload = {
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"mobile": "string",
"time_zone": "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",
"time_zone": "string"
}{
"id": 0,
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"mobile": "string",
"country_code": "string",
"time_zone": "string",
"admin": true,
"ui_login_count": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Get current impersonation status
Response
Current impersonation state
Not authenticated
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/impersonation'const response = await fetch('https://api.nitrosend.com/v1/my/impersonation', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/impersonation')
data = response.json(){
"impersonating": true,
"impersonator": {
"id": 0,
"email": "user@example.com",
"name": "string"
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Revoke the active impersonation session
Response
Impersonation session revoked
Not authenticated
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/impersonation'const response = await fetch('https://api.nitrosend.com/v1/my/impersonation', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.nitrosend.com/v1/my/impersonation')
data = response.json(){
"redirect_url": "https://api.nitrosend.com/adm"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Account
Account settings and configuration
Get account details
Response
Account with billing. Brands are listed by GET /v1/my/brands.
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"commercial_tier": "unsubscribed",
"safe_mode_enabled": true,
"access": {
"source": "owner",
"delegated": true,
"manager_account_id": 0,
"manager_account_name": "string",
"management_grant_id": 0,
"permission_set": "operator_v1",
"credential_type": "management"
},
"billing": {
"access_policy": "free_allowed",
"plan_name": "string",
"plan": {
"id": 0,
"name": "string",
"active": true,
"probation_recipient_cap_24h": 0,
"standard_recipient_cap_24h": 0,
"trusted_recipient_cap_24h": 0,
"entitlements": {
"agent_inbox": {
"enabled": true,
"max_inboxes": 0,
"inbound_messages_included": 0,
"inbound_messages_metered": true,
"inbound_message_overage_rate_cents": "string",
"max_inbound_domains": 0,
"max_apex_domains": 0,
"apex_mx": true,
"legacy_forwarding": true,
"catch_all": true,
"retention_days": 0,
"advanced_queue_controls": true
}
}
},
"spend_cap_monthly_cents": 0,
"comped": true,
"overage": {},
"entitlements": {
"agent_inbox": {
"enabled": true,
"max_inboxes": 0,
"inbound_messages_included": 0,
"inbound_messages_metered": true,
"inbound_message_overage_rate_cents": "string",
"max_inbound_domains": 0,
"max_apex_domains": 0,
"apex_mx": true,
"legacy_forwarding": true,
"catch_all": true,
"retention_days": 0,
"advanced_queue_controls": true
}
},
"resources": {
"email": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
},
"sms": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
},
"ai": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
}
},
"funding": {},
"provider_route": {},
"brands": {
"used": 0,
"limit": 0,
"remaining": 0,
"unlimited": true,
"can_create": true
},
"lifetime": {
"email_sent": 0,
"sms_sent": 0,
"ai_used": 0
}
},
"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)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"commercial_tier": "unsubscribed",
"safe_mode_enabled": true,
"access": {
"source": "owner",
"delegated": true,
"manager_account_id": 0,
"manager_account_name": "string",
"management_grant_id": 0,
"permission_set": "operator_v1",
"credential_type": "management"
},
"billing": {
"access_policy": "free_allowed",
"plan_name": "string",
"plan": {
"id": 0,
"name": "string",
"active": true,
"probation_recipient_cap_24h": 0,
"standard_recipient_cap_24h": 0,
"trusted_recipient_cap_24h": 0,
"entitlements": {
"agent_inbox": {
"enabled": true,
"max_inboxes": 0,
"inbound_messages_included": 0,
"inbound_messages_metered": true,
"inbound_message_overage_rate_cents": "string",
"max_inbound_domains": 0,
"max_apex_domains": 0,
"apex_mx": true,
"legacy_forwarding": true,
"catch_all": true,
"retention_days": 0,
"advanced_queue_controls": true
}
}
},
"spend_cap_monthly_cents": 0,
"comped": true,
"overage": {},
"entitlements": {
"agent_inbox": {
"enabled": true,
"max_inboxes": 0,
"inbound_messages_included": 0,
"inbound_messages_metered": true,
"inbound_message_overage_rate_cents": "string",
"max_inbound_domains": 0,
"max_apex_domains": 0,
"apex_mx": true,
"legacy_forwarding": true,
"catch_all": true,
"retention_days": 0,
"advanced_queue_controls": true
}
},
"resources": {
"email": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
},
"sms": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
},
"ai": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
}
},
"funding": {},
"provider_route": {},
"brands": {
"used": 0,
"limit": 0,
"remaining": 0,
"unlimited": true,
"can_create": true
},
"lifetime": {
"email_sent": 0,
"sms_sent": 0,
"ai_used": 0
}
},
"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"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}List accessible accounts (paginated)
Parameters
pageinteger1queryperinteger<= 100100queryResponse
Accessible accounts
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"commercial_tier": "unsubscribed",
"safe_mode_enabled": true,
"access": {
"source": "owner",
"delegated": true,
"manager_account_id": 0,
"manager_account_name": "string",
"management_grant_id": 0,
"permission_set": "operator_v1",
"credential_type": "management"
},
"billing": {
"access_policy": "free_allowed",
"plan_name": "string",
"plan": {
"id": 0,
"name": "string",
"active": true,
"probation_recipient_cap_24h": 0,
"standard_recipient_cap_24h": 0,
"trusted_recipient_cap_24h": 0,
"entitlements": {
"agent_inbox": {
"enabled": true,
"max_inboxes": 0,
"inbound_messages_included": 0,
"inbound_messages_metered": true,
"inbound_message_overage_rate_cents": "string",
"max_inbound_domains": 0,
"max_apex_domains": 0,
"apex_mx": true,
"legacy_forwarding": true,
"catch_all": true,
"retention_days": 0,
"advanced_queue_controls": true
}
}
},
"spend_cap_monthly_cents": 0,
"comped": true,
"overage": {},
"entitlements": {
"agent_inbox": {
"enabled": true,
"max_inboxes": 0,
"inbound_messages_included": 0,
"inbound_messages_metered": true,
"inbound_message_overage_rate_cents": "string",
"max_inbound_domains": 0,
"max_apex_domains": 0,
"apex_mx": true,
"legacy_forwarding": true,
"catch_all": true,
"retention_days": 0,
"advanced_queue_controls": true
}
},
"resources": {
"email": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
},
"sms": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
},
"ai": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
}
},
"funding": {},
"provider_route": {},
"brands": {
"used": 0,
"limit": 0,
"remaining": 0,
"unlimited": true,
"can_create": true
},
"lifetime": {
"email_sent": 0,
"sms_sent": 0,
"ai_used": 0
}
},
"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 the current account's pending or active management grant
Only the canonical owner of the selected managed account may use this endpoint.
Response
Current management grant
Not authorized
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/management_grant'const response = await fetch('https://api.nitrosend.com/v1/my/account/management_grant', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/account/management_grant')
data = response.json(){
"id": 0,
"status": "pending",
"permission_set": "operator_v1",
"manager_account": {
"id": 0,
"name": "string"
},
"requested_at": "2024-01-15T09:30:00Z",
"activated_at": "2024-01-15T09:30:00Z",
"revoked_at": "2024-01-15T09:30:00Z",
"released_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Reconcile a consented, paid managed-account grant
This endpoint cannot record owner consent or bypass paid activation.
Body
management_grant_idintegerrequiredExact grant returned by the show endpoint; prevents a stale command from targeting a replacement grant.
Response
Active management grant
Bad request
Not authorized
Resource not found
The grant cannot transition from its current state
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/management_grant/confirm' \
-H 'Content-Type: application/json' \
-d '{
"management_grant_id": 0
}'const response = await fetch('https://api.nitrosend.com/v1/my/account/management_grant/confirm', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"management_grant_id": 0
}),
});
const data = await response.json();import requests
payload = {
"management_grant_id": 0
}
response = requests.post('https://api.nitrosend.com/v1/my/account/management_grant/confirm', json=payload)
data = response.json(){
"management_grant_id": 0
}{
"id": 0,
"status": "pending",
"permission_set": "operator_v1",
"manager_account": {
"id": 0,
"name": "string"
},
"requested_at": "2024-01-15T09:30:00Z",
"activated_at": "2024-01-15T09:30:00Z",
"revoked_at": "2024-01-15T09:30:00Z",
"released_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Revoke an exact pending or active management grant
Revocation takes effect on the next REST or MCP request and is idempotent for the exact grant.
Body
management_grant_idintegerrequiredExact grant returned by the show endpoint; prevents a stale command from targeting a replacement grant.
Response
Revoked management grant
Bad request
Not authorized
Resource not found
The grant cannot transition from its current state
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/management_grant/revoke' \
-H 'Content-Type: application/json' \
-d '{
"management_grant_id": 0
}'const response = await fetch('https://api.nitrosend.com/v1/my/account/management_grant/revoke', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"management_grant_id": 0
}),
});
const data = await response.json();import requests
payload = {
"management_grant_id": 0
}
response = requests.post('https://api.nitrosend.com/v1/my/account/management_grant/revoke', json=payload)
data = response.json(){
"management_grant_id": 0
}{
"id": 0,
"status": "pending",
"permission_set": "operator_v1",
"manager_account": {
"id": 0,
"name": "string"
},
"requested_at": "2024-01-15T09:30:00Z",
"activated_at": "2024-01-15T09:30:00Z",
"revoked_at": "2024-01-15T09:30:00Z",
"released_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Get team metadata for the current account
Response
Team metadata
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"commercial_tier": "unsubscribed",
"safe_mode_enabled": true,
"access": {
"source": "owner",
"delegated": true,
"manager_account_id": 0,
"manager_account_name": "string",
"management_grant_id": 0,
"permission_set": "operator_v1",
"credential_type": "management"
},
"billing": {
"access_policy": "free_allowed",
"plan_name": "string",
"plan": {
"id": 0,
"name": "string",
"active": true,
"probation_recipient_cap_24h": 0,
"standard_recipient_cap_24h": 0,
"trusted_recipient_cap_24h": 0,
"entitlements": {
"agent_inbox": {
"enabled": true,
"max_inboxes": 0,
"inbound_messages_included": 0,
"inbound_messages_metered": true,
"inbound_message_overage_rate_cents": "string",
"max_inbound_domains": 0,
"max_apex_domains": 0,
"apex_mx": true,
"legacy_forwarding": true,
"catch_all": true,
"retention_days": 0,
"advanced_queue_controls": true
}
}
},
"spend_cap_monthly_cents": 0,
"comped": true,
"overage": {},
"entitlements": {
"agent_inbox": {
"enabled": true,
"max_inboxes": 0,
"inbound_messages_included": 0,
"inbound_messages_metered": true,
"inbound_message_overage_rate_cents": "string",
"max_inbound_domains": 0,
"max_apex_domains": 0,
"apex_mx": true,
"legacy_forwarding": true,
"catch_all": true,
"retention_days": 0,
"advanced_queue_controls": true
}
},
"resources": {
"email": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
},
"sms": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
},
"ai": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
}
},
"funding": {},
"provider_route": {},
"brands": {
"used": 0,
"limit": 0,
"remaining": 0,
"unlimited": true,
"can_create": true
},
"lifetime": {
"email_sent": 0,
"sms_sent": 0,
"ai_used": 0
}
},
"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",
"commercial_tier": "unsubscribed",
"safe_mode_enabled": true,
"access": {
"source": "owner",
"delegated": true,
"manager_account_id": 0,
"manager_account_name": "string",
"management_grant_id": 0,
"permission_set": "operator_v1",
"credential_type": "management"
},
"billing": {
"access_policy": "free_allowed",
"plan_name": "string",
"plan": {
"id": 0,
"name": "string",
"active": true,
"probation_recipient_cap_24h": 0,
"standard_recipient_cap_24h": 0,
"trusted_recipient_cap_24h": 0,
"entitlements": {
"agent_inbox": {
"enabled": true,
"max_inboxes": 0,
"inbound_messages_included": 0,
"inbound_messages_metered": true,
"inbound_message_overage_rate_cents": "string",
"max_inbound_domains": 0,
"max_apex_domains": 0,
"apex_mx": true,
"legacy_forwarding": true,
"catch_all": true,
"retention_days": 0,
"advanced_queue_controls": true
}
}
},
"spend_cap_monthly_cents": 0,
"comped": true,
"overage": {},
"entitlements": {
"agent_inbox": {
"enabled": true,
"max_inboxes": 0,
"inbound_messages_included": 0,
"inbound_messages_metered": true,
"inbound_message_overage_rate_cents": "string",
"max_inbound_domains": 0,
"max_apex_domains": 0,
"apex_mx": true,
"legacy_forwarding": true,
"catch_all": true,
"retention_days": 0,
"advanced_queue_controls": true
}
},
"resources": {
"email": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
},
"sms": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
},
"ai": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
}
},
"funding": {},
"provider_route": {},
"brands": {
"used": 0,
"limit": 0,
"remaining": 0,
"unlimited": true,
"can_create": true
},
"lifetime": {
"email_sent": 0,
"sms_sent": 0,
"ai_used": 0
}
},
"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"
}
]
}How far one send to an audience gets on the current plan
Read-only. Reports the recipients per day at the account's sending standing and the emails left this month on the current plan, whether they cover a full send to the audience, and the cheapest listed plan whose first month would. The numbers come from the plan catalogue and this month's usage; the summary sentence is the one every surface shows. Silent (no summary, no recommendation) when the current plan covers the audience.
Parameters
audienceinteger>= 1requiredqueryNumber of recipients of one full send
Response
Reach on the current plan and the recommended plan
audience is not a positive whole number (error_code audience_invalid)
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/reach'const response = await fetch('https://api.nitrosend.com/v1/my/account/reach', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/account/reach')
data = response.json(){
"audience": 0,
"cohort": "string",
"current": {
"plan_id": 0,
"slug": "string",
"name": "string",
"tier_group": "string",
"daily_cap": 0,
"capacity": 0,
"days_to_reach": 0,
"covers": true
},
"recommended": {
"plan_id": 0,
"slug": "string",
"name": "string",
"tier_group": "string",
"daily_cap": 0,
"capacity": 0,
"days_to_reach": 0,
"covers": true
},
"covered": true,
"summary": "string"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}List account memberships (paginated)
Parameters
pageinteger1queryperinteger<= 100100queryResponse
Memberships
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}List account invites (paginated)
Parameters
pageinteger1queryperinteger<= 100100queryResponse
Invites
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Revoke an invite
Parameters
idintegerrequiredpathResponse
Revoked invite
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Affiliate Center
Entitled affiliate link, standing, and lifetime performance
Get the current account's Affiliate Center
Session/JWT only. API keys are rejected. For an entitled account that is not linked locally, the first read starts one background reconciliation. That reconciliation links an existing Rewardful affiliate by the account owner's email or creates one when absent.
Response
Affiliate Center payload or temporary setup state
Not authorized
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/affiliate'const response = await fetch('https://api.nitrosend.com/v1/my/affiliate', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/affiliate')
data = response.json(){
"enrolled": true,
"available": true,
"state": "active",
"setup_status": "pending",
"share_url": "https://example.com",
"stats": {
"visitors": 0,
"leads": 0,
"conversions": 0
},
"earnings": {
"known": true,
"total_cents": 0,
"currency": "string"
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Reconcile the current account's affiliate immediately
Session/JWT-only repair path. This is idempotent and uses the same existing-or-create behavior as background reconciliation.
Body
first_namestringlast_namestringResponse
Existing or already-linked affiliate
Affiliate identity linked to the account
Not authorized
Resource not found
Validation failed
Upstream service unavailable
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/affiliate' \
-H 'Content-Type: application/json' \
-d '{
"first_name": "string",
"last_name": "string"
}'const response = await fetch('https://api.nitrosend.com/v1/my/affiliate', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"first_name": "string",
"last_name": "string"
}),
});
const data = await response.json();import requests
payload = {
"first_name": "string",
"last_name": "string"
}
response = requests.post('https://api.nitrosend.com/v1/my/affiliate', json=payload)
data = response.json(){
"first_name": "string",
"last_name": "string"
}{
"enrolled": true,
"available": true,
"state": "active",
"setup_status": "pending",
"share_url": "https://example.com",
"stats": {
"visitors": 0,
"leads": 0,
"conversions": 0
},
"earnings": {
"known": true,
"total_cents": 0,
"currency": "string"
}
}{
"enrolled": true,
"available": true,
"state": "active",
"setup_status": "pending",
"share_url": "https://example.com",
"stats": {
"visitors": 0,
"leads": 0,
"conversions": 0
},
"earnings": {
"known": true,
"total_cents": 0,
"currency": "string"
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Managed Clients
Explicitly enabled client provisioning, consent, and portfolio operations
List the selected manager account's client portfolio
Parameters
pageinteger1queryperinteger<= 10025queryqstringquerystatusManagedAccountLifecycleStatusFilterqueryUse needs_setup to group preparing, awaiting owner, payment required, and payment issue rows.
sortstringcreated_atnameowner_emailstatuscreated_atquerydirectionstringascdescdescqueryResponse
Bounded managed-client portfolio
Not authorized
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/managed_accounts'const response = await fetch('https://api.nitrosend.com/v1/my/managed_accounts', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/managed_accounts')
data = response.json()[
{
"id": 0,
"external_ref": "string",
"source": "dashboard",
"status": "preparing",
"permission_set": "operator_v1",
"allowed_actions": [
"send_invitation"
],
"managed_account": {
"id": 0,
"name": "string"
},
"owner": {
"email": "user@example.com"
},
"invitation": {
"expired": true,
"expires_at": "2024-01-15T09:30:00Z",
"deadline_at": "2024-01-15T09:30:00Z",
"notice_sent_at": "2024-01-15T09:30:00Z",
"claimed_at": "2024-01-15T09:30:00Z",
"reissues_remaining": 0
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Provision a paid-required, client-owned account
Body
managed_accountobjectrequiredParameters
Idempotency-KeystringrequiredheaderExact-request idempotency key; changed normalized input conflicts.
Response
Exact idempotent replay
Client provisioned in preparing state; no owner invitation has been sent
Not authorized
Request conflicts with durable lifecycle or idempotency state
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/managed_accounts' \
-H 'Content-Type: application/json' \
-d '{
"managed_account": {
"owner_email": "user@example.com",
"owner_first_name": "string",
"owner_last_name": "string",
"account_name": "string"
}
}'const response = await fetch('https://api.nitrosend.com/v1/my/managed_accounts', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"managed_account": {
"owner_email": "user@example.com",
"owner_first_name": "string",
"owner_last_name": "string",
"account_name": "string"
}
}),
});
const data = await response.json();import requests
payload = {
"managed_account": {
"owner_email": "user@example.com",
"owner_first_name": "string",
"owner_last_name": "string",
"account_name": "string"
}
}
response = requests.post('https://api.nitrosend.com/v1/my/managed_accounts', json=payload)
data = response.json(){
"managed_account": {
"owner_email": "user@example.com",
"owner_first_name": "string",
"owner_last_name": "string",
"account_name": "string"
}
}{
"id": 0,
"external_ref": "string",
"source": "dashboard",
"status": "preparing",
"permission_set": "operator_v1",
"allowed_actions": [
"send_invitation"
],
"managed_account": {
"id": 0,
"name": "string"
},
"owner": {
"email": "user@example.com"
},
"invitation": {
"expired": true,
"expires_at": "2024-01-15T09:30:00Z",
"deadline_at": "2024-01-15T09:30:00Z",
"notice_sent_at": "2024-01-15T09:30:00Z",
"claimed_at": "2024-01-15T09:30:00Z",
"reissues_remaining": 0
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"idempotent_replay": true
}{
"id": 0,
"external_ref": "string",
"source": "dashboard",
"status": "preparing",
"permission_set": "operator_v1",
"allowed_actions": [
"send_invitation"
],
"managed_account": {
"id": 0,
"name": "string"
},
"owner": {
"email": "user@example.com"
},
"invitation": {
"expired": true,
"expires_at": "2024-01-15T09:30:00Z",
"deadline_at": "2024-01-15T09:30:00Z",
"notice_sent_at": "2024-01-15T09:30:00Z",
"claimed_at": "2024-01-15T09:30:00Z",
"reissues_remaining": 0
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"idempotent_replay": true
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Get one managed-client portfolio row
Parameters
idintegerrequiredpathResponse
Managed-client portfolio row
Not authorized
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/managed_accounts/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/managed_accounts/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/managed_accounts/{id}')
data = response.json(){
"id": 0,
"external_ref": "string",
"source": "dashboard",
"status": "preparing",
"permission_set": "operator_v1",
"allowed_actions": [
"send_invitation"
],
"managed_account": {
"id": 0,
"name": "string"
},
"owner": {
"email": "user@example.com"
},
"invitation": {
"expired": true,
"expires_at": "2024-01-15T09:30:00Z",
"deadline_at": "2024-01-15T09:30:00Z",
"notice_sent_at": "2024-01-15T09:30:00Z",
"claimed_at": "2024-01-15T09:30:00Z",
"reissues_remaining": 0
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Invalidate the prior invitation and queue a bounded replacement for owner-only delivery
Parameters
idintegerrequiredpathResponse
Updated portfolio row; no invitation capability is returned
Not authorized
Request conflicts with durable lifecycle or idempotency state
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/managed_accounts/{id}/resend_invitation'const response = await fetch('https://api.nitrosend.com/v1/my/managed_accounts/{id}/resend_invitation', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.nitrosend.com/v1/my/managed_accounts/{id}/resend_invitation')
data = response.json(){
"id": 0,
"external_ref": "string",
"source": "dashboard",
"status": "preparing",
"permission_set": "operator_v1",
"allowed_actions": [
"send_invitation"
],
"managed_account": {
"id": 0,
"name": "string"
},
"owner": {
"email": "user@example.com"
},
"invitation": {
"expired": true,
"expires_at": "2024-01-15T09:30:00Z",
"deadline_at": "2024-01-15T09:30:00Z",
"notice_sent_at": "2024-01-15T09:30:00Z",
"claimed_at": "2024-01-15T09:30:00Z",
"reissues_remaining": 0
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Queue the first bounded owner invitation after client setup is ready
Parameters
idintegerrequiredpathResponse
Updated portfolio row; no invitation capability is returned
Not authorized
Request conflicts with durable lifecycle or idempotency state
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/managed_accounts/{id}/send_invitation'const response = await fetch('https://api.nitrosend.com/v1/my/managed_accounts/{id}/send_invitation', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.nitrosend.com/v1/my/managed_accounts/{id}/send_invitation')
data = response.json(){
"id": 0,
"external_ref": "string",
"source": "dashboard",
"status": "preparing",
"permission_set": "operator_v1",
"allowed_actions": [
"send_invitation"
],
"managed_account": {
"id": 0,
"name": "string"
},
"owner": {
"email": "user@example.com"
},
"invitation": {
"expired": true,
"expires_at": "2024-01-15T09:30:00Z",
"deadline_at": "2024-01-15T09:30:00Z",
"notice_sent_at": "2024-01-15T09:30:00Z",
"claimed_at": "2024-01-15T09:30:00Z",
"reissues_remaining": 0
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Queue a cooldown-bound payment reminder to the owner
Parameters
idintegerrequiredpathResponse
Reminder accepted for delivery
Not authorized
Request conflicts with durable lifecycle or idempotency state
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/managed_accounts/{id}/payment_reminder'const response = await fetch('https://api.nitrosend.com/v1/my/managed_accounts/{id}/payment_reminder', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.nitrosend.com/v1/my/managed_accounts/{id}/payment_reminder')
data = response.json(){
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}End the selected manager's relationship with the client
Parameters
idintegerrequiredpathResponse
Ended managed-client relationship
Not authorized
Request conflicts with durable lifecycle or idempotency state
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/managed_accounts/{id}/release'const response = await fetch('https://api.nitrosend.com/v1/my/managed_accounts/{id}/release', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.nitrosend.com/v1/my/managed_accounts/{id}/release')
data = response.json(){
"id": 0,
"external_ref": "string",
"source": "dashboard",
"status": "preparing",
"permission_set": "operator_v1",
"allowed_actions": [
"send_invitation"
],
"managed_account": {
"id": 0,
"name": "string"
},
"owner": {
"email": "user@example.com"
},
"invitation": {
"expired": true,
"expires_at": "2024-01-15T09:30:00Z",
"deadline_at": "2024-01-15T09:30:00Z",
"notice_sent_at": "2024-01-15T09:30:00Z",
"claimed_at": "2024-01-15T09:30:00Z",
"reissues_remaining": 0
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}List non-secret provisioning credential metadata
Response
Provisioning credential metadata
Not authorized
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/provisioning_credentials'const response = await fetch('https://api.nitrosend.com/v1/my/account/provisioning_credentials', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/account/provisioning_credentials')
data = response.json()[
{
"id": 0,
"name": "string",
"scopes": [
"provision"
],
"secret_hint": "string",
"expires_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z",
"revoked_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}
]{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Issue a provisioning credential and reveal its secret once
Body
credentialobjectrequiredResponse
One-time credential result
Not authorized
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/provisioning_credentials' \
-H 'Content-Type: application/json' \
-d '{
"credential": {
"name": "string",
"scopes": [
"provision"
],
"expires_at": "2024-01-15T09:30:00Z"
}
}'const response = await fetch('https://api.nitrosend.com/v1/my/account/provisioning_credentials', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"credential": {
"name": "string",
"scopes": [
"provision"
],
"expires_at": "2024-01-15T09:30:00Z"
}
}),
});
const data = await response.json();import requests
payload = {
"credential": {
"name": "string",
"scopes": [
"provision"
],
"expires_at": "2024-01-15T09:30:00Z"
}
}
response = requests.post('https://api.nitrosend.com/v1/my/account/provisioning_credentials', json=payload)
data = response.json(){
"credential": {
"name": "string",
"scopes": [
"provision"
],
"expires_at": "2024-01-15T09:30:00Z"
}
}{
"id": 0,
"name": "string",
"scopes": [
"provision"
],
"secret_hint": "string",
"expires_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z",
"revoked_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"secret": "string"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Revoke one manager-bound provisioning credential
Parameters
idintegerrequiredpathResponse
Revoked credential metadata
Not authorized
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/provisioning_credentials/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/account/provisioning_credentials/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.nitrosend.com/v1/my/account/provisioning_credentials/{id}')
data = response.json(){
"id": 0,
"name": "string",
"scopes": [
"provision"
],
"secret_hint": "string",
"expires_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z",
"revoked_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Inspect a bounded owner consent capability
Body
claimobjectrequiredResponse
Bounded claim projection
One-time capability is invalid, expired, rotated, or consumed
curl -X POST 'https://api.nitrosend.com/v1/managed_account_claims/inspect' \
-H 'Content-Type: application/json' \
-d '{
"claim": {
"token": "string"
}
}'const response = await fetch('https://api.nitrosend.com/v1/managed_account_claims/inspect', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"claim": {
"token": "string"
}
}),
});
const data = await response.json();import requests
payload = {
"claim": {
"token": "string"
}
}
response = requests.post('https://api.nitrosend.com/v1/managed_account_claims/inspect', json=payload)
data = response.json(){
"claim": {
"token": "string"
}
}{
"manager": {
"name": "string"
},
"managed_account": {
"name": "string"
},
"owner_email": "string",
"expires_at": "2024-01-15T09:30:00Z",
"authentication": "login_required"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Record one-time consent for the exact authenticated owner
Body
claimobjectrequiredResponse
Consent recorded; status remains payment_required until paid activation
Not authorized
One-time capability is invalid, expired, rotated, or consumed
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/managed_account_claims/complete' \
-H 'Content-Type: application/json' \
-d '{
"claim": {
"token": "string"
}
}'const response = await fetch('https://api.nitrosend.com/v1/managed_account_claims/complete', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"claim": {
"token": "string"
}
}),
});
const data = await response.json();import requests
payload = {
"claim": {
"token": "string"
}
}
response = requests.post('https://api.nitrosend.com/v1/managed_account_claims/complete', json=payload)
data = response.json(){
"claim": {
"token": "string"
}
}{
"claimed": true,
"status": "payment_required",
"managed_account": {
"id": 0,
"name": "string"
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Partner
Provisioning-credential authenticated managed-client operations
List managed clients using a manager-bound credential
Response
Managed-client portfolio
Not authenticated
Not authorized
Authorization
PartnerProvisioningCredentialhttp (bearer)Manager-account provisioning credential revealed once at issuance.
curl -X GET 'https://api.nitrosend.com/v1/partner/managed_accounts'const response = await fetch('https://api.nitrosend.com/v1/partner/managed_accounts', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/partner/managed_accounts')
data = response.json()[
{
"id": 0,
"external_ref": "string",
"source": "dashboard",
"status": "preparing",
"permission_set": "operator_v1",
"allowed_actions": [
"send_invitation"
],
"managed_account": {
"id": 0,
"name": "string"
},
"owner": {
"email": "user@example.com"
},
"invitation": {
"expired": true,
"expires_at": "2024-01-15T09:30:00Z",
"deadline_at": "2024-01-15T09:30:00Z",
"notice_sent_at": "2024-01-15T09:30:00Z",
"claimed_at": "2024-01-15T09:30:00Z",
"reissues_remaining": 0
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Provision a paid-required client-owned account
Body
managed_accountobjectrequiredParameters
Idempotency-KeystringrequiredheaderExact-request idempotency key; changed normalized input conflicts.
Response
Exact idempotent replay
Client provisioned in preparing state; no owner invitation has been sent
Not authenticated
Not authorized
Request conflicts with durable lifecycle or idempotency state
Validation failed
Authorization
PartnerProvisioningCredentialhttp (bearer)Manager-account provisioning credential revealed once at issuance.
curl -X POST 'https://api.nitrosend.com/v1/partner/managed_accounts' \
-H 'Content-Type: application/json' \
-d '{
"managed_account": {
"external_ref": "string",
"owner_email": "user@example.com",
"owner_first_name": "string",
"owner_last_name": "string",
"account_name": "string"
}
}'const response = await fetch('https://api.nitrosend.com/v1/partner/managed_accounts', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"managed_account": {
"external_ref": "string",
"owner_email": "user@example.com",
"owner_first_name": "string",
"owner_last_name": "string",
"account_name": "string"
}
}),
});
const data = await response.json();import requests
payload = {
"managed_account": {
"external_ref": "string",
"owner_email": "user@example.com",
"owner_first_name": "string",
"owner_last_name": "string",
"account_name": "string"
}
}
response = requests.post('https://api.nitrosend.com/v1/partner/managed_accounts', json=payload)
data = response.json(){
"managed_account": {
"external_ref": "string",
"owner_email": "user@example.com",
"owner_first_name": "string",
"owner_last_name": "string",
"account_name": "string"
}
}{
"id": 0,
"external_ref": "string",
"source": "dashboard",
"status": "preparing",
"permission_set": "operator_v1",
"allowed_actions": [
"send_invitation"
],
"managed_account": {
"id": 0,
"name": "string"
},
"owner": {
"email": "user@example.com"
},
"invitation": {
"expired": true,
"expires_at": "2024-01-15T09:30:00Z",
"deadline_at": "2024-01-15T09:30:00Z",
"notice_sent_at": "2024-01-15T09:30:00Z",
"claimed_at": "2024-01-15T09:30:00Z",
"reissues_remaining": 0
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"idempotent_replay": true
}{
"id": 0,
"external_ref": "string",
"source": "dashboard",
"status": "preparing",
"permission_set": "operator_v1",
"allowed_actions": [
"send_invitation"
],
"managed_account": {
"id": 0,
"name": "string"
},
"owner": {
"email": "user@example.com"
},
"invitation": {
"expired": true,
"expires_at": "2024-01-15T09:30:00Z",
"deadline_at": "2024-01-15T09:30:00Z",
"notice_sent_at": "2024-01-15T09:30:00Z",
"claimed_at": "2024-01-15T09:30:00Z",
"reissues_remaining": 0
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"idempotent_replay": true
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Get one manager-scoped portfolio row
Parameters
idintegerrequiredpathResponse
Managed-client portfolio row
Not authenticated
Not authorized
Resource not found
Authorization
PartnerProvisioningCredentialhttp (bearer)Manager-account provisioning credential revealed once at issuance.
curl -X GET 'https://api.nitrosend.com/v1/partner/managed_accounts/{id}'const response = await fetch('https://api.nitrosend.com/v1/partner/managed_accounts/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/partner/managed_accounts/{id}')
data = response.json(){
"id": 0,
"external_ref": "string",
"source": "dashboard",
"status": "preparing",
"permission_set": "operator_v1",
"allowed_actions": [
"send_invitation"
],
"managed_account": {
"id": 0,
"name": "string"
},
"owner": {
"email": "user@example.com"
},
"invitation": {
"expired": true,
"expires_at": "2024-01-15T09:30:00Z",
"deadline_at": "2024-01-15T09:30:00Z",
"notice_sent_at": "2024-01-15T09:30:00Z",
"claimed_at": "2024-01-15T09:30:00Z",
"reissues_remaining": 0
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Invalidate the prior invitation and queue a bounded replacement for owner-only delivery
Parameters
idintegerrequiredpathResponse
Updated portfolio row; no invitation capability is returned
Not authenticated
Not authorized
Request conflicts with durable lifecycle or idempotency state
Authorization
PartnerProvisioningCredentialhttp (bearer)Manager-account provisioning credential revealed once at issuance.
curl -X POST 'https://api.nitrosend.com/v1/partner/managed_accounts/{id}/resend_invitation'const response = await fetch('https://api.nitrosend.com/v1/partner/managed_accounts/{id}/resend_invitation', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.nitrosend.com/v1/partner/managed_accounts/{id}/resend_invitation')
data = response.json(){
"id": 0,
"external_ref": "string",
"source": "dashboard",
"status": "preparing",
"permission_set": "operator_v1",
"allowed_actions": [
"send_invitation"
],
"managed_account": {
"id": 0,
"name": "string"
},
"owner": {
"email": "user@example.com"
},
"invitation": {
"expired": true,
"expires_at": "2024-01-15T09:30:00Z",
"deadline_at": "2024-01-15T09:30:00Z",
"notice_sent_at": "2024-01-15T09:30:00Z",
"claimed_at": "2024-01-15T09:30:00Z",
"reissues_remaining": 0
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Queue the first bounded owner invitation after client setup is ready
Parameters
idintegerrequiredpathResponse
Updated portfolio row; no invitation capability is returned
Not authenticated
Not authorized
Request conflicts with durable lifecycle or idempotency state
Authorization
PartnerProvisioningCredentialhttp (bearer)Manager-account provisioning credential revealed once at issuance.
curl -X POST 'https://api.nitrosend.com/v1/partner/managed_accounts/{id}/send_invitation'const response = await fetch('https://api.nitrosend.com/v1/partner/managed_accounts/{id}/send_invitation', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.nitrosend.com/v1/partner/managed_accounts/{id}/send_invitation')
data = response.json(){
"id": 0,
"external_ref": "string",
"source": "dashboard",
"status": "preparing",
"permission_set": "operator_v1",
"allowed_actions": [
"send_invitation"
],
"managed_account": {
"id": 0,
"name": "string"
},
"owner": {
"email": "user@example.com"
},
"invitation": {
"expired": true,
"expires_at": "2024-01-15T09:30:00Z",
"deadline_at": "2024-01-15T09:30:00Z",
"notice_sent_at": "2024-01-15T09:30:00Z",
"claimed_at": "2024-01-15T09:30:00Z",
"reissues_remaining": 0
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}List non-secret agent credential metadata for one managed client
Parameters
provisioning_idintegerrequiredpathManager-scoped provisioning row id.
Response
Agent credential metadata; plaintext secrets are never listed
Not authenticated
Not authorized
Resource not found
Authorization
PartnerProvisioningCredentialhttp (bearer)Manager-account provisioning credential revealed once at issuance.
curl -X GET 'https://api.nitrosend.com/v1/partner/managed_accounts/{provisioning_id}/credentials'const response = await fetch('https://api.nitrosend.com/v1/partner/managed_accounts/{provisioning_id}/credentials', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/partner/managed_accounts/{provisioning_id}/credentials')
data = response.json()[
{
"id": 0,
"account_management_grant_id": 0,
"name": "string",
"permission_set": "operator_v1",
"secret_hint": "string",
"expires_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z",
"revoked_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"brand": {
"id": 0,
"sid": "string",
"name": "string"
}
}
]{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Issue one grant- and Brand-pinned agent credential
Body
credentialobjectrequiredParameters
provisioning_idintegerrequiredpathManager-scoped provisioning row id.
Response
One-time credential result; the secret cannot be recovered
Not authenticated
Not authorized
Resource not found
Request conflicts with durable lifecycle or idempotency state
Validation failed
Authorization
PartnerProvisioningCredentialhttp (bearer)Manager-account provisioning credential revealed once at issuance.
curl -X POST 'https://api.nitrosend.com/v1/partner/managed_accounts/{provisioning_id}/credentials' \
-H 'Content-Type: application/json' \
-d '{
"credential": {
"name": "string",
"brand_sid": "string",
"expires_at": "2024-01-15T09:30:00Z"
}
}'const response = await fetch('https://api.nitrosend.com/v1/partner/managed_accounts/{provisioning_id}/credentials', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"credential": {
"name": "string",
"brand_sid": "string",
"expires_at": "2024-01-15T09:30:00Z"
}
}),
});
const data = await response.json();import requests
payload = {
"credential": {
"name": "string",
"brand_sid": "string",
"expires_at": "2024-01-15T09:30:00Z"
}
}
response = requests.post('https://api.nitrosend.com/v1/partner/managed_accounts/{provisioning_id}/credentials', json=payload)
data = response.json(){
"credential": {
"name": "string",
"brand_sid": "string",
"expires_at": "2024-01-15T09:30:00Z"
}
}{
"id": 0,
"account_management_grant_id": 0,
"name": "string",
"permission_set": "operator_v1",
"secret_hint": "string",
"expires_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z",
"revoked_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"brand": {
"id": 0,
"sid": "string",
"name": "string"
},
"secret": "string"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Revoke one agent credential immediately
Parameters
provisioning_idintegerrequiredpathManager-scoped provisioning row id.
idintegerrequiredpathResponse
Revoked credential metadata
Not authenticated
Not authorized
Resource not found
Authorization
PartnerProvisioningCredentialhttp (bearer)Manager-account provisioning credential revealed once at issuance.
curl -X DELETE 'https://api.nitrosend.com/v1/partner/managed_accounts/{provisioning_id}/credentials/{id}'const response = await fetch('https://api.nitrosend.com/v1/partner/managed_accounts/{provisioning_id}/credentials/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.nitrosend.com/v1/partner/managed_accounts/{provisioning_id}/credentials/{id}')
data = response.json(){
"id": 0,
"account_management_grant_id": 0,
"name": "string",
"permission_set": "operator_v1",
"secret_hint": "string",
"expires_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z",
"revoked_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"brand": {
"id": 0,
"sid": "string",
"name": "string"
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Billing
Subscription billing and checkout
Create a subscription
Body
plan_idintegerrequiredstripe_tokenstring | nullStripe card token for paid-plan creation.
coupon_codestring | nullCustomer-entered Stripe promotion code or coupon ID.
Response
Subscription created
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/subscription' \
-H 'Content-Type: application/json' \
-d '{
"plan_id": 0,
"stripe_token": "string",
"coupon_code": "string"
}'const response = await fetch('https://api.nitrosend.com/v1/my/subscription', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"plan_id": 0,
"stripe_token": "string",
"coupon_code": "string"
}),
});
const data = await response.json();import requests
payload = {
"plan_id": 0,
"stripe_token": "string",
"coupon_code": "string"
}
response = requests.post('https://api.nitrosend.com/v1/my/subscription', json=payload)
data = response.json(){
"plan_id": 0,
"stripe_token": "string",
"coupon_code": "string"
}{
"id": 0,
"plan_id": 0,
"plan_name": "string",
"billing_provider": "shopify",
"source_billing_provider": "shopify",
"billing_migration_required": true,
"manage_url": "https://example.com",
"spend_cap_monthly_cents": 0,
"shopify_usage_metered": true,
"status": "pending",
"interval": "month",
"currency": "string",
"subtotal_cents": 0,
"tax_cents": 0,
"total_cents": 0,
"base_price_cents": 0,
"discount_cents": 0,
"next_payment_cents": 0,
"discount_end_at": "2024-01-15T09:30:00Z",
"activated": true,
"entitlements": {
"agent_inbox": {
"enabled": true,
"max_inboxes": 0,
"inbound_messages_included": 0,
"inbound_messages_metered": true,
"inbound_message_overage_rate_cents": "string",
"max_inbound_domains": 0,
"max_apex_domains": 0,
"apex_mx": true,
"legacy_forwarding": true,
"catch_all": true,
"retention_days": 0,
"advanced_queue_controls": true
}
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Change the current subscription plan
Body
plan_idintegerrequiredcoupon_codestring | nullCustomer-entered Stripe promotion code or coupon ID.
Response
Subscription updated
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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 PUT 'https://api.nitrosend.com/v1/my/subscription/change' \
-H 'Content-Type: application/json' \
-d '{
"plan_id": 0,
"coupon_code": "string"
}'const response = await fetch('https://api.nitrosend.com/v1/my/subscription/change', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"plan_id": 0,
"coupon_code": "string"
}),
});
const data = await response.json();import requests
payload = {
"plan_id": 0,
"coupon_code": "string"
}
response = requests.put('https://api.nitrosend.com/v1/my/subscription/change', json=payload)
data = response.json(){
"plan_id": 0,
"coupon_code": "string"
}{
"id": 0,
"plan_id": 0,
"plan_name": "string",
"billing_provider": "shopify",
"source_billing_provider": "shopify",
"billing_migration_required": true,
"manage_url": "https://example.com",
"spend_cap_monthly_cents": 0,
"shopify_usage_metered": true,
"status": "pending",
"interval": "month",
"currency": "string",
"subtotal_cents": 0,
"tax_cents": 0,
"total_cents": 0,
"base_price_cents": 0,
"discount_cents": 0,
"next_payment_cents": 0,
"discount_end_at": "2024-01-15T09:30:00Z",
"activated": true,
"entitlements": {
"agent_inbox": {
"enabled": true,
"max_inboxes": 0,
"inbound_messages_included": 0,
"inbound_messages_metered": true,
"inbound_message_overage_rate_cents": "string",
"max_inbound_domains": 0,
"max_apex_domains": 0,
"apex_mx": true,
"legacy_forwarding": true,
"catch_all": true,
"retention_days": 0,
"advanced_queue_controls": true
}
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Start a subscription checkout
Creates or replays one account-scoped plan purchase through the authoritative billing provider. A Stripe-backed active subscription is changed in place rather than creating a parallel subscription. Shopify-managed accounts receive a Shopify-hosted approval URL and never receive a Stripe checkout URL.
Body
plan_idintegerrequiredidempotency_keystringOptional body form of Idempotency-Key for compatibility.
Parameters
Idempotency-KeystringheaderOptional stable retry key. The server also reuses an open same-plan checkout.
Response
Subscription changed without external approval
Provider-hosted checkout created
Billing provider is not ready for checkout
Requested plan is not available
Another checkout is pending or the idempotency key conflicts
Shopify rejected the requested billing terms
The billing provider could not be reached
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/subscription/checkout' \
-H 'Content-Type: application/json' \
-d '{
"plan_id": 0,
"idempotency_key": "string"
}'const response = await fetch('https://api.nitrosend.com/v1/my/subscription/checkout', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"plan_id": 0,
"idempotency_key": "string"
}),
});
const data = await response.json();import requests
payload = {
"plan_id": 0,
"idempotency_key": "string"
}
response = requests.post('https://api.nitrosend.com/v1/my/subscription/checkout', json=payload)
data = response.json(){
"plan_id": 0,
"idempotency_key": "string"
}{}{}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Reconcile and read a plan purchase
Reads the requested plan while approval is pending. Stripe and Shopify are read back before the local state is returned. Omit purchase_id to inspect the latest pending checkout or the current subscription.
Parameters
purchase_idintegerqueryResponse
Reconciled plan purchase status
Requested plan purchase was not found
Provider state could not be verified
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/subscription/checkout_status'const response = await fetch('https://api.nitrosend.com/v1/my/subscription/checkout_status', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/subscription/checkout_status')
data = response.json(){
"purchase_id": 0,
"subscription_id": 0,
"has_subscription": true,
"status": "string",
"activated": true,
"plan_name": "string",
"provider_status": "string",
"checkout_url": "https://example.com",
"approval": {},
"billing_provider": "string",
"billing_route": {},
"manage_url": "https://example.com",
"entitlements": {},
"next_action": "string"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Read the current prepaid funding projection and available instruments
Response
Current prepaid funding status
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/billing/funding'const response = await fetch('https://api.nitrosend.com/v1/my/billing/funding', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/billing/funding')
data = response.json(){
"state": "string",
"applies_to": "prepaid_features",
"subscription_gate": true,
"currency": "string",
"available_cents": 0,
"reserved_cents": 0,
"deficit_cents": 0,
"purchase": {
"available": true,
"state": "string",
"reason": "string",
"default_instrument": "stripe_checkout",
"instruments": [
{
"instrument": "stripe_checkout",
"provider": "stripe",
"mode": "hosted_approval",
"available": true,
"reason": "string"
}
],
"currency": "string",
"minimum_cents": 0,
"maximum_cents": 0,
"preset_cents": [
0
]
},
"pending_purchase": {
"id": 0,
"paid_action_intent_id": "string",
"provider": "stripe",
"instrument": "stripe_checkout",
"status": "requested",
"currency": "string",
"requested_cents": 1,
"requested_display": "string",
"checkout_url": "https://example.com",
"approval": {
"kind": "url",
"provider": "stripe",
"url": "https://example.com",
"target": "self"
},
"expires_at": "2024-01-15T09:30:00Z",
"credited_cents": 0,
"reversed_cents": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
}Start an add-funds purchase with an optional hosted instrument
Creates or replays one local funding purchase. Current public instruments return a provider-hosted approval URL. No request-side credential field is exposed by this endpoint.
Body
amount_centsinteger>= 1requiredInteger service value in minor currency units.
currencystringinstrumentstringstripe_checkoutshopify_one_timeOptional hosted funding instrument. Omit to use the account default.
paid_action_intent_idstring | nullOptional opaque continuation bound to this funding purchase.
Parameters
Idempotency-KeystringrequiredheaderResponse
Existing idempotent funding purchase
Funding purchase created
Idempotency key was used for different funding input
Amount or selected funding instrument is unavailable
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/billing/funding/purchases' \
-H 'Content-Type: application/json' \
-d '{
"amount_cents": 1,
"currency": "string",
"instrument": "stripe_checkout",
"paid_action_intent_id": "string"
}'const response = await fetch('https://api.nitrosend.com/v1/my/billing/funding/purchases', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"amount_cents": 1,
"currency": "string",
"instrument": "stripe_checkout",
"paid_action_intent_id": "string"
}),
});
const data = await response.json();import requests
payload = {
"amount_cents": 1,
"currency": "string",
"instrument": "stripe_checkout",
"paid_action_intent_id": "string"
}
response = requests.post('https://api.nitrosend.com/v1/my/billing/funding/purchases', json=payload)
data = response.json(){
"amount_cents": 1,
"currency": "string",
"instrument": "stripe_checkout",
"paid_action_intent_id": "string"
}{
"purchase": {
"id": 0,
"paid_action_intent_id": "string",
"provider": "stripe",
"instrument": "stripe_checkout",
"status": "requested",
"currency": "string",
"requested_cents": 1,
"requested_display": "string",
"checkout_url": "https://example.com",
"approval": {
"kind": "url",
"provider": "stripe",
"url": "https://example.com",
"target": "self"
},
"expires_at": "2024-01-15T09:30:00Z",
"credited_cents": 0,
"reversed_cents": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
},
"funding": {
"state": "string",
"applies_to": "prepaid_features",
"subscription_gate": true,
"currency": "string",
"available_cents": 0,
"reserved_cents": 0,
"deficit_cents": 0,
"purchase": {
"available": true,
"state": "string",
"reason": "string",
"default_instrument": "stripe_checkout",
"instruments": [
{
"instrument": "stripe_checkout",
"provider": "stripe",
"mode": "hosted_approval",
"available": true,
"reason": "string"
}
],
"currency": "string",
"minimum_cents": 0,
"maximum_cents": 0,
"preset_cents": [
0
]
},
"pending_purchase": {
"id": 0,
"paid_action_intent_id": "string",
"provider": "stripe",
"instrument": "stripe_checkout",
"status": "requested",
"currency": "string",
"requested_cents": 1,
"requested_display": "string",
"checkout_url": "https://example.com",
"approval": {
"kind": "url",
"provider": "stripe",
"url": "https://example.com",
"target": "self"
},
"expires_at": "2024-01-15T09:30:00Z",
"credited_cents": 0,
"reversed_cents": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
}
}{
"purchase": {
"id": 0,
"paid_action_intent_id": "string",
"provider": "stripe",
"instrument": "stripe_checkout",
"status": "requested",
"currency": "string",
"requested_cents": 1,
"requested_display": "string",
"checkout_url": "https://example.com",
"approval": {
"kind": "url",
"provider": "stripe",
"url": "https://example.com",
"target": "self"
},
"expires_at": "2024-01-15T09:30:00Z",
"credited_cents": 0,
"reversed_cents": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
},
"funding": {
"state": "string",
"applies_to": "prepaid_features",
"subscription_gate": true,
"currency": "string",
"available_cents": 0,
"reserved_cents": 0,
"deficit_cents": 0,
"purchase": {
"available": true,
"state": "string",
"reason": "string",
"default_instrument": "stripe_checkout",
"instruments": [
{
"instrument": "stripe_checkout",
"provider": "stripe",
"mode": "hosted_approval",
"available": true,
"reason": "string"
}
],
"currency": "string",
"minimum_cents": 0,
"maximum_cents": 0,
"preset_cents": [
0
]
},
"pending_purchase": {
"id": 0,
"paid_action_intent_id": "string",
"provider": "stripe",
"instrument": "stripe_checkout",
"status": "requested",
"currency": "string",
"requested_cents": 1,
"requested_display": "string",
"checkout_url": "https://example.com",
"approval": {
"kind": "url",
"provider": "stripe",
"url": "https://example.com",
"target": "self"
},
"expires_at": "2024-01-15T09:30:00Z",
"credited_cents": 0,
"reversed_cents": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Read an account-scoped funding purchase
Parameters
idstringrequiredpathLocal purchase ID or opaque Stripe Checkout Session ID
Response
Funding purchase status
Funding purchase not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/billing/funding/purchases/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/billing/funding/purchases/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/billing/funding/purchases/{id}')
data = response.json(){
"purchase": {
"id": 0,
"paid_action_intent_id": "string",
"provider": "stripe",
"instrument": "stripe_checkout",
"status": "requested",
"currency": "string",
"requested_cents": 1,
"requested_display": "string",
"checkout_url": "https://example.com",
"approval": {
"kind": "url",
"provider": "stripe",
"url": "https://example.com",
"target": "self"
},
"expires_at": "2024-01-15T09:30:00Z",
"credited_cents": 0,
"reversed_cents": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
},
"funding": {
"state": "string",
"applies_to": "prepaid_features",
"subscription_gate": true,
"currency": "string",
"available_cents": 0,
"reserved_cents": 0,
"deficit_cents": 0,
"purchase": {
"available": true,
"state": "string",
"reason": "string",
"default_instrument": "stripe_checkout",
"instruments": [
{
"instrument": "stripe_checkout",
"provider": "stripe",
"mode": "hosted_approval",
"available": true,
"reason": "string"
}
],
"currency": "string",
"minimum_cents": 0,
"maximum_cents": 0,
"preset_cents": [
0
]
},
"pending_purchase": {
"id": 0,
"paid_action_intent_id": "string",
"provider": "stripe",
"instrument": "stripe_checkout",
"status": "requested",
"currency": "string",
"requested_cents": 1,
"requested_display": "string",
"checkout_url": "https://example.com",
"approval": {
"kind": "url",
"provider": "stripe",
"url": "https://example.com",
"target": "self"
},
"expires_at": "2024-01-15T09:30:00Z",
"credited_cents": 0,
"reversed_cents": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Preview a promotion code or coupon for a subscription plan
Validates a customer-entered Stripe promotion code or coupon ID against
a paid plan and returns display totals for the checkout summary. The
final subscription create/change request must still send coupon_code;
preview data is not trusted as payment input.
Body
plan_idintegerrequiredcoupon_codestringrequiredCustomer-entered Stripe promotion code or coupon ID.
Response
Coupon preview
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/subscription/coupon_preview' \
-H 'Content-Type: application/json' \
-d '{
"plan_id": 0,
"coupon_code": "string"
}'const response = await fetch('https://api.nitrosend.com/v1/my/subscription/coupon_preview', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"plan_id": 0,
"coupon_code": "string"
}),
});
const data = await response.json();import requests
payload = {
"plan_id": 0,
"coupon_code": "string"
}
response = requests.post('https://api.nitrosend.com/v1/my/subscription/coupon_preview', json=payload)
data = response.json(){
"plan_id": 0,
"coupon_code": "string"
}{
"code": "string",
"discount_label": "string",
"discount_cents": 0,
"subtotal_cents": 0,
"tax_cents": 0,
"total_cents": 0,
"total_after_discount_cents": 0,
"currency": "string"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Create or exactly replay a resumable paid operation
Persists encrypted, operation-owned continuation state. The intent is not spend authority and never executes the operation automatically.
Body
adapter_keystringrequiredadapter_versionstringrequiredoperation_idempotency_keystringrequiredstate_payloadobjectrequiredAdapter-owned state, validated and encrypted before persistence.
Response
Exact idempotent replay
Continuation created
Operation key reused with different continuation state
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/billing/paid_action_intents' \
-H 'Content-Type: application/json' \
-d '{
"adapter_key": "string",
"adapter_version": "string",
"operation_idempotency_key": "string",
"state_payload": {}
}'const response = await fetch('https://api.nitrosend.com/v1/my/billing/paid_action_intents', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"adapter_key": "string",
"adapter_version": "string",
"operation_idempotency_key": "string",
"state_payload": {}
}),
});
const data = await response.json();import requests
payload = {
"adapter_key": "string",
"adapter_version": "string",
"operation_idempotency_key": "string",
"state_payload": {}
}
response = requests.post('https://api.nitrosend.com/v1/my/billing/paid_action_intents', json=payload)
data = response.json(){
"adapter_key": "string",
"adapter_version": "string",
"operation_idempotency_key": "string",
"state_payload": {}
}{
"id": "string",
"schema": "nitrosend.paid_action_intent.v1",
"status": "open",
"adapter": {
"key": "string",
"version": "string"
},
"operation_idempotency_key": "string",
"original_quote_fingerprint": "string",
"current_quote_fingerprint": "string",
"quote_changed": true,
"state_payload": {},
"quote": {},
"expires_at": "2024-01-15T09:30:00Z",
"consumed_at": "2024-01-15T09:30:00Z",
"cancelled_at": "2024-01-15T09:30:00Z"
}{
"id": "string",
"schema": "nitrosend.paid_action_intent.v1",
"status": "open",
"adapter": {
"key": "string",
"version": "string"
},
"operation_idempotency_key": "string",
"original_quote_fingerprint": "string",
"current_quote_fingerprint": "string",
"quote_changed": true,
"state_payload": {},
"quote": {},
"expires_at": "2024-01-15T09:30:00Z",
"consumed_at": "2024-01-15T09:30:00Z",
"cancelled_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Restore and re-quote a paid operation
Parameters
idstringrequiredpathOpaque paid-operation continuation identifier.
Response
Actor-scoped continuation with current terms
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/billing/paid_action_intents/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/billing/paid_action_intents/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/billing/paid_action_intents/{id}')
data = response.json(){
"id": "string",
"schema": "nitrosend.paid_action_intent.v1",
"status": "open",
"adapter": {
"key": "string",
"version": "string"
},
"operation_idempotency_key": "string",
"original_quote_fingerprint": "string",
"current_quote_fingerprint": "string",
"quote_changed": true,
"state_payload": {},
"quote": {},
"expires_at": "2024-01-15T09:30:00Z",
"consumed_at": "2024-01-15T09:30:00Z",
"cancelled_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Cancel and scrub a paid-operation continuation
Parameters
idstringrequiredpathOpaque paid-operation continuation identifier.
Response
Cancelled continuation
Resource not found
Terminal continuation cannot be cancelled
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/billing/paid_action_intents/{id}/cancel'const response = await fetch('https://api.nitrosend.com/v1/my/billing/paid_action_intents/{id}/cancel', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.nitrosend.com/v1/my/billing/paid_action_intents/{id}/cancel')
data = response.json(){
"id": "string",
"schema": "nitrosend.paid_action_intent.v1",
"status": "open",
"adapter": {
"key": "string",
"version": "string"
},
"operation_idempotency_key": "string",
"original_quote_fingerprint": "string",
"current_quote_fingerprint": "string",
"quote_changed": true,
"state_payload": {},
"quote": {},
"expires_at": "2024-01-15T09:30:00Z",
"consumed_at": "2024-01-15T09:30:00Z",
"cancelled_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Mark a successfully executed paid operation consumed
Parameters
idstringrequiredpathOpaque paid-operation continuation identifier.
Response
Consumed continuation
Resource not found
Continuation is not ready to consume
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/billing/paid_action_intents/{id}/consume'const response = await fetch('https://api.nitrosend.com/v1/my/billing/paid_action_intents/{id}/consume', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.nitrosend.com/v1/my/billing/paid_action_intents/{id}/consume')
data = response.json(){
"id": "string",
"schema": "nitrosend.paid_action_intent.v1",
"status": "open",
"adapter": {
"key": "string",
"version": "string"
},
"operation_idempotency_key": "string",
"original_quote_fingerprint": "string",
"current_quote_fingerprint": "string",
"quote_changed": true,
"state_payload": {},
"quote": {},
"expires_at": "2024-01-15T09:30:00Z",
"consumed_at": "2024-01-15T09:30:00Z",
"cancelled_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Delivery
Read-only plan/cohort sending allowance and pacing state
Inspect the email sending allowance and pacing
Returns a read-only projection of the persisted delivery controls for the selected Brand. This endpoint does not authorize or reserve a send; every send still passes through the canonical admission authority. Pacing describes when admitted work can dispatch and is not itself an admission decision.
Response
Current email sender-capacity and pacing projection
Not authenticated
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/delivery/status'const response = await fetch('https://api.nitrosend.com/v1/my/delivery/status', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/delivery/status')
data = response.json(){
"assessment_scope": "account_capacity",
"admission_status": "allowed",
"sending_pause": {
"sending_paused": true,
"reason": "critical_bounce_rate",
"occurred_at": "2024-01-15T09:30:00Z",
"headline": "string",
"detail": "string",
"what_to_do": [
"string"
],
"request_review": "string",
"recovery_actions": [
{
"type": "verify_list",
"label": "string",
"url": "string"
}
]
},
"commercial_capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"pacing_state": {
"status": "ready",
"policy_version": "string",
"queued_quantity": 0,
"next_dispatch_at": "2024-01-15T09:30:00Z",
"scopes": [
{
"type": "string",
"status": "ready",
"next_dispatch_at": "2024-01-15T09:30:00Z",
"minimum_interval_seconds": 0,
"feedback_epoch": 0
}
]
},
"blocking_control": "account_status",
"reason_code": "string",
"issues": [
{
"control": "account_status",
"reason_code": "sending_paused",
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}
],
"retry_at": "2024-01-15T09:30:00Z",
"observed_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Email Validation
Explicit prepaid email validation quotes and operations
Quote explicit prepaid email validation
Classifies one exact current-Brand audience, applies current cached and eligibility evidence, and returns the maximum prepaid charge. It does not hold funds, call a provider, create an operation, or mutate Contacts. Validation has no plan-included allowance.
Body
Response
Non-mutating validation quote
Bad request
Not authenticated
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/validation_operations/quote' \
-H 'Content-Type: application/json'const response = await fetch('https://api.nitrosend.com/v1/my/validation_operations/quote', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
});
const data = await response.json();import requests
response = requests.post('https://api.nitrosend.com/v1/my/validation_operations/quote', headers={'Content-Type': 'application/json'})
data = response.json(){
"status": "quoted",
"source_kind": "contact_channel",
"quote_digest": "string",
"counts": {
"candidate_count": 0,
"deduplicated_count": 0,
"cached_count": 0,
"ineligible_count": 0,
"eligible_count": 0,
"pending_count": 0,
"executing_count": 0,
"billable_count": 0,
"not_billable_count": 0,
"provider_unknown_count": 0,
"failed_count": 0
},
"pricing": {
"price_book_version": "string",
"unit_rate_cents": "string",
"maximum_charge_cents": 0,
"committed_cents": 0,
"released_cents": 0,
"currency": "string",
"quote_digest": "string",
"expires_at": "2024-01-15T09:30:00Z",
"execution_deadline_at": "2024-01-15T09:30:00Z"
},
"funding": {
"route": "direct_prepaid",
"available": true,
"reason": "string",
"usage_event_id": 0,
"state": "needs_funding",
"recovery": {}
},
"spend": {
"schema": "nitrosend.spend.v1",
"status": "ready",
"route": "direct_prepaid",
"currency": "string",
"maximum_charge_cents": 0,
"balance": {
"available_cents": 0,
"reserved_cents": 0,
"shortfall_cents": 0
},
"funding": {},
"recovery_action": {
"type": "add_funds",
"reason": "string",
"operation": "add_funds",
"url": "https://example.com",
"purchase_id": 0,
"shortfall_cents": 0,
"minimum_cents": 0,
"maximum_cents": 0,
"recommended_cents": 0,
"preset_cents": [
0
]
}
},
"mutation": false
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Start or resume explicit prepaid email validation
Creates one durable operation and holds at most the quoted amount from direct prepaid funds. Reusing the same Idempotency-Key with the same audience returns the same operation; after funding, the same request resumes a needs_funding operation. A changed audience conflicts.
Body
Parameters
Idempotency-KeystringrequiredheaderExact-request idempotency key; changed normalized input conflicts.
Response
Durable validation operation accepted or replayed
Bad request
Not authenticated
Resource not found
Request conflicts with durable lifecycle or idempotency state
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/validation_operations' \
-H 'Content-Type: application/json'const response = await fetch('https://api.nitrosend.com/v1/my/validation_operations', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
});
const data = await response.json();import requests
response = requests.post('https://api.nitrosend.com/v1/my/validation_operations', headers={'Content-Type': 'application/json'})
data = response.json(){
"operation_id": "string",
"status": "requested",
"source_kind": "contact_channel",
"item_detail": {
"status": "available",
"compacted_at": "2024-01-15T09:30:00Z",
"item_count": 0
},
"counts": {
"candidate_count": 0,
"deduplicated_count": 0,
"cached_count": 0,
"ineligible_count": 0,
"eligible_count": 0,
"pending_count": 0,
"executing_count": 0,
"billable_count": 0,
"not_billable_count": 0,
"provider_unknown_count": 0,
"failed_count": 0
},
"pricing": {
"price_book_version": "string",
"unit_rate_cents": "string",
"maximum_charge_cents": 0,
"committed_cents": 0,
"released_cents": 0,
"currency": "string",
"quote_digest": "string",
"expires_at": "2024-01-15T09:30:00Z",
"execution_deadline_at": "2024-01-15T09:30:00Z"
},
"funding": {
"route": "direct_prepaid",
"available": true,
"reason": "string",
"usage_event_id": 0,
"state": "needs_funding",
"recovery": {}
},
"spend": {
"schema": "nitrosend.spend.v1",
"status": "ready",
"route": "direct_prepaid",
"currency": "string",
"maximum_charge_cents": 0,
"balance": {
"available_cents": 0,
"reserved_cents": 0,
"shortfall_cents": 0
},
"funding": {},
"recovery_action": {
"type": "add_funds",
"reason": "string",
"operation": "add_funds",
"url": "https://example.com",
"purchase_id": 0,
"shortfall_cents": 0,
"minimum_cents": 0,
"maximum_cents": 0,
"recommended_cents": 0,
"preset_cents": [
0
]
}
},
"failure_code": "string",
"started_at": "2024-01-15T09:30:00Z",
"completed_at": "2024-01-15T09:30:00Z",
"next_action": "string"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Get an email validation operation
Parameters
idstringrequiredpathOpaque operation_id returned by the create endpoint.
Response
Current durable operation state
Not authenticated
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/validation_operations/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/validation_operations/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/validation_operations/{id}')
data = response.json(){
"operation_id": "string",
"status": "requested",
"source_kind": "contact_channel",
"item_detail": {
"status": "available",
"compacted_at": "2024-01-15T09:30:00Z",
"item_count": 0
},
"counts": {
"candidate_count": 0,
"deduplicated_count": 0,
"cached_count": 0,
"ineligible_count": 0,
"eligible_count": 0,
"pending_count": 0,
"executing_count": 0,
"billable_count": 0,
"not_billable_count": 0,
"provider_unknown_count": 0,
"failed_count": 0
},
"pricing": {
"price_book_version": "string",
"unit_rate_cents": "string",
"maximum_charge_cents": 0,
"committed_cents": 0,
"released_cents": 0,
"currency": "string",
"quote_digest": "string",
"expires_at": "2024-01-15T09:30:00Z",
"execution_deadline_at": "2024-01-15T09:30:00Z"
},
"funding": {
"route": "direct_prepaid",
"available": true,
"reason": "string",
"usage_event_id": 0,
"state": "needs_funding",
"recovery": {}
},
"spend": {
"schema": "nitrosend.spend.v1",
"status": "ready",
"route": "direct_prepaid",
"currency": "string",
"maximum_charge_cents": 0,
"balance": {
"available_cents": 0,
"reserved_cents": 0,
"shortfall_cents": 0
},
"funding": {},
"recovery_action": {
"type": "add_funds",
"reason": "string",
"operation": "add_funds",
"url": "https://example.com",
"purchase_id": 0,
"shortfall_cents": 0,
"minimum_cents": 0,
"maximum_cents": 0,
"recommended_cents": 0,
"preset_cents": [
0
]
}
},
"failure_code": "string",
"started_at": "2024-01-15T09:30:00Z",
"completed_at": "2024-01-15T09:30:00Z",
"next_action": "string"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}List per-candidate email validation results
Parameters
idstringrequiredpathOpaque operation_id returned by the create endpoint.
pageinteger1queryperinteger<= 10030queryResponse
Paginated operation items
Not authenticated
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/validation_operations/{id}/items'const response = await fetch('https://api.nitrosend.com/v1/my/validation_operations/{id}/items', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/validation_operations/{id}/items')
data = response.json()[
{
"id": 0,
"contact_channel_id": 0,
"status": "pending",
"billable": true,
"provider": "string",
"native_status": "string",
"verdict": "string",
"failure_code": "string",
"result_reference": {},
"completed_at": "2024-01-15T09:30:00Z"
}
]{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Contacts
Contact management
List contacts (paginated)
Parameters
pageinteger1querylimitinteger<= 10050querysearchstringqueryFull-text search across name, email, phone
filtersSegmentFilterExpressionqueryCanonical structured audience filters from the registry exposed by
/v1/my/flows/spec and nitro://schema. search remains a separate
full-text lookup; filters are applied through the same fail-closed
validator used for segments.
list_idintegerqueryLegacy shortcut for a contact_list in [id] filter.
tagstringqueryLegacy shortcut for a contact_tag eq tag filter. Tags are stored
as an array of strings under data.tags. For richer tag targeting,
use canonical filters.
sortstringcreated_atemails_sentunique_opensclicksopen_rateclick_ratelast_opened_atlast_clicked_atratingqueryColumn to sort by. created_at orders by the contact's creation date;
the rest are the per-contact engagement rollup fields (see
Contact.engagement). Contacts with no rollup row always sort last.
Any unrecognised value falls back to the default newest-first order.
directionstringascdescdescquerySort direction. Only applies when sort is set.
Response
Paginated contacts
A read did not finish within the request's database time limit (error_code: query_timeout). Nothing was changed; retry after the Retry-After interval. Any GET can return this.
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"flag_emoji": "string",
"data": {
"tags": [
"vip",
"newsletter"
],
"plan": "pro"
},
"subscribed_phone": true,
"subscribed_email": true,
"email": "user@example.com",
"subscribed": {
"email": true,
"phone": true
},
"verification_status": "verified",
"enrichment_status": "enriched",
"mailbox_provider": "gmail",
"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",
"engagement": {
"rating": "engaged",
"emails_sent": 0,
"unique_opens": 0,
"clicks": 0,
"open_rate": 0,
"click_rate": 0,
"last_opened_at": "2024-01-15T09:30:00Z",
"last_clicked_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"
}
]
}
]{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Create a contact
Body
first_namestringlast_namestringemailstring<email>Normalized to lowercase. If the submitted identifiers resolve cleanly to one existing contact in this brand, that contact is updated (200) instead of duplicated. If email and phone identify different contacts in this brand, the request is rejected (422). Creates/updates the 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"]}.
Merge-on-resolve behavior (create path only): when the
submitted email or phone resolves cleanly to an existing
contact, data is merged into the contact's existing data
rather than replaced. Blank incoming values are ignored;
caller-supplied non-reserved keys overwrite their
counterparts; the reserved enrichment keys apollo, pdl,
attio, hubspot, stripe, shopify, and nitro are
preserved from the stored contact;
and tags from both sides are unioned. The update endpoint
(PATCH /v1/my/contacts/{id}) replaces data wholesale
instead.
channels_attributesArray<object>Response
Existing contact updated in place. Returned when the submitted email and/or phone resolves cleanly to one existing contact in this brand.
Contact created
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"flag_emoji": "string",
"data": {
"tags": [
"vip",
"newsletter"
],
"plan": "pro"
},
"subscribed_phone": true,
"subscribed_email": true,
"email": "user@example.com",
"subscribed": {
"email": true,
"phone": true
},
"verification_status": "verified",
"enrichment_status": "enriched",
"mailbox_provider": "gmail",
"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",
"engagement": {
"rating": "engaged",
"emails_sent": 0,
"unique_opens": 0,
"clicks": 0,
"open_rate": 0,
"click_rate": 0,
"last_opened_at": "2024-01-15T09:30:00Z",
"last_clicked_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"
}
]
}{
"id": 0,
"brand_id": 0,
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"first_name": "string",
"last_name": "string",
"source": "string",
"country_code": "string",
"flag_emoji": "string",
"data": {
"tags": [
"vip",
"newsletter"
],
"plan": "pro"
},
"subscribed_phone": true,
"subscribed_email": true,
"email": "user@example.com",
"subscribed": {
"email": true,
"phone": true
},
"verification_status": "verified",
"enrichment_status": "enriched",
"mailbox_provider": "gmail",
"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",
"engagement": {
"rating": "engaged",
"emails_sent": 0,
"unique_opens": 0,
"clicks": 0,
"open_rate": 0,
"click_rate": 0,
"last_opened_at": "2024-01-15T09:30:00Z",
"last_clicked_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"
}
]
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Get a contact
Parameters
idintegerrequiredpathResponse
Contact with channels
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"flag_emoji": "string",
"data": {
"tags": [
"vip",
"newsletter"
],
"plan": "pro"
},
"subscribed_phone": true,
"subscribed_email": true,
"email": "user@example.com",
"subscribed": {
"email": true,
"phone": true
},
"verification_status": "verified",
"enrichment_status": "enriched",
"mailbox_provider": "gmail",
"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",
"engagement": {
"rating": "engaged",
"emails_sent": 0,
"unique_opens": 0,
"clicks": 0,
"open_rate": 0,
"click_rate": 0,
"last_opened_at": "2024-01-15T09:30:00Z",
"last_clicked_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"
}
]
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Delete a contact
Parameters
idintegerrequiredpathResponse
Deleted contact
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"flag_emoji": "string",
"data": {
"tags": [
"vip",
"newsletter"
],
"plan": "pro"
},
"subscribed_phone": true,
"subscribed_email": true,
"email": "user@example.com",
"subscribed": {
"email": true,
"phone": true
},
"verification_status": "verified",
"enrichment_status": "enriched",
"mailbox_provider": "gmail",
"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",
"engagement": {
"rating": "engaged",
"emails_sent": 0,
"unique_opens": 0,
"clicks": 0,
"open_rate": 0,
"click_rate": 0,
"last_opened_at": "2024-01-15T09:30:00Z",
"last_clicked_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>Changing the email to one already owned by a different contact in the brand is rejected (422).
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). Reserved enrichment namespaces include apollo,
pdl, attio, hubspot, stripe, shopify, and derived
nitro. 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)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"flag_emoji": "string",
"data": {
"tags": [
"vip",
"newsletter"
],
"plan": "pro"
},
"subscribed_phone": true,
"subscribed_email": true,
"email": "user@example.com",
"subscribed": {
"email": true,
"phone": true
},
"verification_status": "verified",
"enrichment_status": "enriched",
"mailbox_provider": "gmail",
"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",
"engagement": {
"rating": "engaged",
"emails_sent": 0,
"unique_opens": 0,
"clicks": 0,
"open_rate": 0,
"click_rate": 0,
"last_opened_at": "2024-01-15T09:30:00Z",
"last_clicked_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"
}
]
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Quote profile enrichment for one or more Contacts
Resolves already-current and same-Brand reusable profile evidence before provider work. This endpoint never calls a provider or reserves money. Profile enrichment is priced per successful outcome and has no plan-included allowance.
Body
contact_idsArray<integer>requiredResponse
Exact maximum-charge quote and work classification
Not authenticated
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/enrichment/quote' \
-H 'Content-Type: application/json' \
-d '{
"contact_ids": [
0
]
}'const response = await fetch('https://api.nitrosend.com/v1/my/contacts/enrichment/quote', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"contact_ids": [
0
]
}),
});
const data = await response.json();import requests
payload = {
"contact_ids": [
0
]
}
response = requests.post('https://api.nitrosend.com/v1/my/contacts/enrichment/quote', json=payload)
data = response.json(){
"contact_ids": [
0
]
}{
"selected_count": 0,
"already_current_count": 0,
"reusable_count": 0,
"provider_required_count": 0,
"unavailable_count": 0,
"maximum_billable_outcomes": 0,
"resource": "contact_profile_enrichment",
"unit_rate_cents": "string",
"maximum_charge_cents": 0,
"currency": "USD",
"price_book_version": "string",
"available": true,
"reason": "string",
"spend": {
"schema": "nitrosend.spend.v1",
"status": "ready",
"route": "direct_prepaid",
"currency": "string",
"maximum_charge_cents": 0,
"balance": {
"available_cents": 0,
"reserved_cents": 0,
"shortfall_cents": 0
},
"funding": {},
"recovery_action": {
"type": "add_funds",
"reason": "string",
"operation": "add_funds",
"url": "https://example.com",
"purchase_id": 0,
"shortfall_cents": 0,
"minimum_cents": 0,
"maximum_cents": 0,
"recommended_cents": 0,
"preset_cents": [
0
]
}
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Queue profile enrichment for one or more Contacts
Holds the quoted maximum, then queues bounded Contact work. Current evidence is skipped without charge. Fresh same-Brand evidence and usable provider results each commit one outcome; no-match and failures void the hold. This operation does not verify, subscribe, suppress, or qualify an email channel.
Body
contact_idsArray<integer>requiredParameters
Idempotency-KeystringrequiredheaderResponse
Exact idempotent replay
Enrichment queued
Bad request
Not authenticated
Account funding changed before the enrichment hold was created
Idempotency-Key reused with different Contact IDs
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/enrichment' \
-H 'Content-Type: application/json' \
-d '{
"contact_ids": [
0
]
}'const response = await fetch('https://api.nitrosend.com/v1/my/contacts/enrichment', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"contact_ids": [
0
]
}),
});
const data = await response.json();import requests
payload = {
"contact_ids": [
0
]
}
response = requests.post('https://api.nitrosend.com/v1/my/contacts/enrichment', json=payload)
data = response.json(){
"contact_ids": [
0
]
}{
"selected_count": 0,
"queued_count": 0,
"already_current_count": 0,
"reusable_count": 0,
"provider_required_count": 0,
"unavailable_count": 0,
"maximum_charge_cents": 0,
"currency": "USD",
"price_book_version": "string",
"idempotent_replay": true
}{
"selected_count": 0,
"queued_count": 0,
"already_current_count": 0,
"reusable_count": 0,
"provider_required_count": 0,
"unavailable_count": 0,
"maximum_charge_cents": 0,
"currency": "USD",
"price_book_version": "string",
"idempotent_replay": true
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"code": "insufficient_balance",
"message": "string",
"error": true,
"error_code": "insufficient_balance",
"currency": "string",
"required_cents": 0,
"available_cents": 0,
"reserved_cents": 0,
"shortfall_cents": 0,
"funding": {},
"recovery_action": {},
"spend": {
"schema": "nitrosend.spend.v1",
"status": "ready",
"route": "direct_prepaid",
"currency": "string",
"maximum_charge_cents": 0,
"balance": {
"available_cents": 0,
"reserved_cents": 0,
"shortfall_cents": 0
},
"funding": {},
"recovery_action": {
"type": "add_funds",
"reason": "string",
"operation": "add_funds",
"url": "https://example.com",
"purchase_id": 0,
"shortfall_cents": 0,
"minimum_cents": 0,
"maximum_cents": 0,
"recommended_cents": 0,
"preset_cents": [
0
]
}
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Unified activity timeline for a contact
Read-only, keyset-paginated feed merging the contact's lifecycle
events and email activities into one chronological stream (newest
first). Entries are normalised and whitelisted — raw rows are never
exposed. Page using the cursor returned as next_cursor.
Parameters
idintegerrequiredpathcursorstringqueryOpaque keyset cursor from a prior next_cursor.
limitinteger<= 10025queryResponse
A page of timeline entries, newest first
Not authenticated
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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}/timeline'const response = await fetch('https://api.nitrosend.com/v1/my/contacts/{id}/timeline', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/contacts/{id}/timeline')
data = response.json(){
"entries": [
{
"id": "string",
"kind": "event",
"type": "string",
"title": "string",
"occurred_at": "2024-01-15T09:30:00Z",
"meta": {}
}
],
"next_cursor": "string"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Enrichment facts for a contact
Read-only enrichment facts resolved into display rows. Facts sourced from an integration you have connected are attributed with that integration's name; facts from other sources are returned unattributed.
Parameters
idintegerrequiredpathResponse
The contact's resolved enrichment rows
Not authenticated
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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}/enrichment'const response = await fetch('https://api.nitrosend.com/v1/my/contacts/{id}/enrichment', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/contacts/{id}/enrichment')
data = response.json(){
"rows": [
{
"key": "string",
"group": "professional",
"display_value": "string",
"value_type": "string",
"confidence": 0,
"stale": true,
"synced_at": "2024-01-15T09:30:00Z",
"integration_label": "string"
}
],
"field_count": 0,
"summary": {
"field_count": 0,
"stale_count": 0,
"latest_synced_at": "2024-01-15T09:30:00Z",
"groups": {}
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}List the field catalog for this account
Returns the structured field catalog: one row per known field for this account,
with key, category, type, label, promotion state, and async fill-rate.
Fields are lazily registered the first time a key is seen (import, API write,
or enrichment). Use PATCH /v1/my/contacts/fields/:id to update promoted
or label.
Response
Field catalog rows ordered by category and label
Not authenticated
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/fields'const response = await fetch('https://api.nitrosend.com/v1/my/contacts/fields', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/contacts/fields')
data = response.json()[
{
"id": 0,
"key": "string",
"category": "contact",
"field_type": "string",
"presentation_type": "text",
"presentation_options": {},
"label": "string",
"display_label": "string",
"source_key": "string",
"source_name": "string",
"object_label": "string",
"source_field_label": "string",
"merge_tag": "string",
"promoted": true,
"fill_rate": "75.0",
"fill_rate_refreshed_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Update a field catalog row (owner/admin only)
Updates the promoted flag and/or the human-readable label for a field
catalog row. Restricted to account owners and admins. The key, category,
and field_type of a row are immutable.
Body
promotedbooleanPin this field as a default column in the contacts grid.
labelstringOverride the human-readable label for this field.
Parameters
idintegerrequiredpathResponse
Updated field catalog row
Not authenticated
Not authorized
Resource not found
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/fields/{id}' \
-H 'Content-Type: application/json' \
-d '{
"promoted": true,
"label": "string"
}'const response = await fetch('https://api.nitrosend.com/v1/my/contacts/fields/{id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"promoted": true,
"label": "string"
}),
});
const data = await response.json();import requests
payload = {
"promoted": True,
"label": "string"
}
response = requests.patch('https://api.nitrosend.com/v1/my/contacts/fields/{id}', json=payload)
data = response.json(){
"promoted": true,
"label": "string"
}{
"id": 0,
"key": "string",
"category": "contact",
"field_type": "string",
"presentation_type": "text",
"presentation_options": {},
"label": "string",
"display_label": "string",
"source_key": "string",
"source_name": "string",
"object_label": "string",
"source_field_label": "string",
"merge_tag": "string",
"promoted": true,
"fill_rate": "75.0",
"fill_rate_refreshed_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Imports
Bulk CSV import jobs
Reserve a direct-upload blob
Creates an Active Storage direct-upload reservation and returns a
signed_id, presigned upload URL, and required upload headers. For CSV
imports, send purpose: import, PUT the file bytes to
direct_upload.url, then submit the returned signed_id to
POST /v1/my/imports. For image media assets, send purpose: image
or purpose: media_asset, PUT the image bytes to direct_upload.url,
then submit the returned signed_id to POST /v1/my/images.
Body
purposestringimportimagemedia_assetSet to import for CSV contact imports, or image/media_asset for image media assets.
blobobjectrequiredResponse
Direct-upload reservation
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/direct_uploads' \
-H 'Content-Type: application/json' \
-d '{
"purpose": "import",
"blob": {
"filename": "contacts.csv",
"byte_size": 1048576,
"checksum": "string",
"content_type": "text/csv",
"metadata": {}
}
}'const response = await fetch('https://api.nitrosend.com/v1/direct_uploads', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"purpose": "import",
"blob": {
"filename": "contacts.csv",
"byte_size": 1048576,
"checksum": "string",
"content_type": "text/csv",
"metadata": {}
}
}),
});
const data = await response.json();import requests
payload = {
"purpose": "import",
"blob": {
"filename": "contacts.csv",
"byte_size": 1048576,
"checksum": "string",
"content_type": "text/csv",
"metadata": {}
}
}
response = requests.post('https://api.nitrosend.com/v1/direct_uploads', json=payload)
data = response.json(){
"purpose": "import",
"blob": {
"filename": "contacts.csv",
"byte_size": 1048576,
"checksum": "string",
"content_type": "text/csv",
"metadata": {}
}
}{
"signed_id": "string",
"filename": "string",
"byte_size": 0,
"content_type": "string",
"direct_upload": {
"url": "https://example.com",
"headers": {}
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}List import jobs
Parameters
pageinteger1querylimitinteger<= 10025queryResponse
Paginated import jobs
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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,
"warning_rows": 0,
"progress": {
"status": "pending",
"pct": 0,
"stages": [
{
"key": "string",
"label": "string",
"count": 0,
"state": "done"
}
]
},
"import_errors": [
[
0
]
],
"import_warnings": [
[
0
]
],
"columns": {},
"options": {},
"assigned_list_ids": [
0
],
"assigned_lists": [
{
"id": 0,
"name": "string"
}
],
"guardrail": {
"tier": "auto",
"status": "ok",
"standing": "probation",
"max_rows": 250000
},
"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
Enqueues an import job from an Active Storage direct-upload signed_id.
Create the blob through POST /v1/direct_uploads with purpose=import,
PUT the file to the returned direct-upload URL, then submit the returned
signed_id here. 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
signed_idstringrequiredActive Storage blob signed ID returned by /v1/direct_uploads.
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)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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: application/json' \
-d '{
"signed_id": "string",
"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': 'application/json',
},
body: JSON.stringify({
"signed_id": "string",
"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 = {
"signed_id": "string",
"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(){
"signed_id": "string",
"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,
"warning_rows": 0,
"progress": {
"status": "pending",
"pct": 0,
"stages": [
{
"key": "string",
"label": "string",
"count": 0,
"state": "done"
}
]
},
"import_errors": [
[
0
]
],
"import_warnings": [
[
0
]
],
"columns": {},
"options": {},
"assigned_list_ids": [
0
],
"assigned_lists": [
{
"id": 0,
"name": "string"
}
],
"guardrail": {
"tier": "auto",
"status": "ok",
"standing": "probation",
"max_rows": 250000
},
"started_at": "2024-01-15T09:30:00Z",
"ended_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Get import schema metadata
Parameters
resourcestringcontactsqueryOptional resource name. Omit to list all schemas.
Response
Import schema metadata
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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(){
"resource": "contacts",
"parser": "default",
"ui": {},
"required_rules": {},
"fields": [
{}
],
"guardrails": {
"standing": "trusted",
"max_rows": null,
"max_file_size_bytes": 2147483648,
"max_file_size_mb": 2048,
"max_active_imports": 10,
"create_rate_limit_per_minute": 10,
"direct_upload_rate_limit_per_minute": 30,
"write_modes": [
"real"
]
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Get import job status
Parameters
idintegerrequiredpathResponse
Import job with status, counts, and row errors
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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,
"warning_rows": 0,
"progress": {
"status": "pending",
"pct": 0,
"stages": [
{
"key": "string",
"label": "string",
"count": 0,
"state": "done"
}
]
},
"import_errors": [
[
0
]
],
"import_warnings": [
[
0
]
],
"columns": {},
"options": {},
"assigned_list_ids": [
0
],
"assigned_lists": [
{
"id": 0,
"name": "string"
}
],
"guardrail": {
"tier": "auto",
"status": "ok",
"standing": "probation",
"max_rows": 250000
},
"started_at": "2024-01-15T09:30:00Z",
"ended_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Delete an import record
Parameters
idintegerrequiredpathResponse
Deleted import
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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,
"warning_rows": 0,
"progress": {
"status": "pending",
"pct": 0,
"stages": [
{
"key": "string",
"label": "string",
"count": 0,
"state": "done"
}
]
},
"import_errors": [
[
0
]
],
"import_warnings": [
[
0
]
],
"columns": {},
"options": {},
"assigned_list_ids": [
0
],
"assigned_lists": [
{
"id": 0,
"name": "string"
}
],
"guardrail": {
"tier": "auto",
"status": "ok",
"standing": "probation",
"max_rows": 250000
},
"started_at": "2024-01-15T09:30:00Z",
"ended_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Cancel a pending or processing import
Parameters
idintegerrequiredpathResponse
Canceled import
Resource not found
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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,
"warning_rows": 0,
"progress": {
"status": "pending",
"pct": 0,
"stages": [
{
"key": "string",
"label": "string",
"count": 0,
"state": "done"
}
]
},
"import_errors": [
[
0
]
],
"import_warnings": [
[
0
]
],
"columns": {},
"options": {},
"assigned_list_ids": [
0
],
"assigned_lists": [
{
"id": 0,
"name": "string"
}
],
"guardrail": {
"tier": "auto",
"status": "ok",
"standing": "probation",
"max_rows": 250000
},
"started_at": "2024-01-15T09:30:00Z",
"ended_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Exports
Contact CSV export jobs
List export jobs
Parameters
pageinteger1querylimitinteger<= 10025queryResponse
Paginated export jobs
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/exports'const response = await fetch('https://api.nitrosend.com/v1/my/exports', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/exports')
data = response.json()[
{
"id": 0,
"resource": "contacts",
"format": "csv",
"status": "pending",
"total_rows": 0,
"rows_written": 0,
"error_message": "string",
"ready": true,
"download_path": "string",
"progress": {
"status": "pending",
"pct": 0,
"stages": [
{
"key": "string",
"label": "string",
"count": 0,
"state": "done"
}
]
},
"started_at": "2024-01-15T09:30:00Z",
"ended_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}
]Start a contact export
Enqueues an export job that builds a CSV of the brand's contacts and
attaches it to the export record. The same filters as GET /v1/my/contacts are supported (search, list_id, tag). Custom
fields stored on contacts are emitted as additional CSV columns.
Poll GET /v1/my/exports/{id} until ready is true, then download
the file from the returned download_path.
Body
resourcestringcontactscontactssearchstringFree-text filter, matching the contacts list search.
list_idintegerRestrict the export to contacts in this list.
tagstringRestrict the export to contacts with this tag.
Response
Export queued
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/exports' \
-H 'Content-Type: application/json' \
-d '{
"resource": "contacts",
"search": "string",
"list_id": 0,
"tag": "string"
}'const response = await fetch('https://api.nitrosend.com/v1/my/exports', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"resource": "contacts",
"search": "string",
"list_id": 0,
"tag": "string"
}),
});
const data = await response.json();import requests
payload = {
"resource": "contacts",
"search": "string",
"list_id": 0,
"tag": "string"
}
response = requests.post('https://api.nitrosend.com/v1/my/exports', json=payload)
data = response.json(){
"resource": "contacts",
"search": "string",
"list_id": 0,
"tag": "string"
}{
"id": 0,
"resource": "contacts",
"format": "csv",
"status": "pending",
"total_rows": 0,
"rows_written": 0,
"error_message": "string",
"ready": true,
"download_path": "string",
"progress": {
"status": "pending",
"pct": 0,
"stages": [
{
"key": "string",
"label": "string",
"count": 0,
"state": "done"
}
]
},
"started_at": "2024-01-15T09:30:00Z",
"ended_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Get an export job
Parameters
idintegerrequiredpathResponse
Export job
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/exports/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/exports/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/exports/{id}')
data = response.json(){
"id": 0,
"resource": "contacts",
"format": "csv",
"status": "pending",
"total_rows": 0,
"rows_written": 0,
"error_message": "string",
"ready": true,
"download_path": "string",
"progress": {
"status": "pending",
"pct": 0,
"stages": [
{
"key": "string",
"label": "string",
"count": 0,
"state": "done"
}
]
},
"started_at": "2024-01-15T09:30:00Z",
"ended_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Download a completed export file
Returns the CSV file once the export status is complete.
Parameters
idintegerrequiredpathResponse
CSV file
Resource not found
Export is not ready
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/exports/{id}/download'const response = await fetch('https://api.nitrosend.com/v1/my/exports/{id}/download', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/exports/{id}/download')
data = response.json()<binary>{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Lists
Contact lists
List contact lists (paginated)
Parameters
namestringqueryExact case-insensitive list name filter
pageinteger1querylimitinteger<= 10025queryResponse
Paginated contact lists
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Get a contact list
Parameters
idintegerrequiredpathResponse
Contact list
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Delete a contact list
Parameters
idintegerrequiredpathResponse
Deleted list
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Get delete warning metadata for a contact list
Parameters
idintegerrequiredpathResponse
Flows connected to this list
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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"
]
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Segments
Dynamic contact segments
List all segments (paginated)
Parameters
pageinteger1queryperinteger<= 100100queryResponse
Segments
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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()[]Create a segment
filters must contain at least one condition. Empty filters ([],
{} or a group with no conditions) would match every contact, so they
are rejected with a 422 and validation_errors.filters. To reach
every contact, target the All contacts audience instead of a segment.
Body
namestringrequiredfiltersSegmentFilterExpressionrequiredResponse
Segment created
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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"
}'const response = await fetch('https://api.nitrosend.com/v1/my/segments', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "string"
}),
});
const data = await response.json();import requests
payload = {
"name": "string"
}
response = requests.post('https://api.nitrosend.com/v1/my/segments', json=payload)
data = response.json(){
"name": "string"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Get a segment
Parameters
idintegerrequiredpathResponse
Segment
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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(){
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Delete a segment
Parameters
idintegerrequiredpathResponse
Deleted segment
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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()Update a segment
An update cannot remove every filter condition from a segment that has
conditions; that returns a 422 with validation_errors.filters.
Segments stored without conditions before this rule can still be
renamed or re-saved with empty filters.
Body
namestringfiltersSegmentFilterExpressionParameters
idintegerrequiredpathResponse
Updated segment
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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"
}'const response = await fetch('https://api.nitrosend.com/v1/my/segments/{id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "string"
}),
});
const data = await response.json();import requests
payload = {
"name": "string"
}
response = requests.patch('https://api.nitrosend.com/v1/my/segments/{id}', json=payload)
data = response.json(){
"name": "string"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Count contacts matching filters
Preview how many contacts match a set of segment filters without creating or saving a segment.
Body
filtersSegmentFilterExpressionResponse
Contact count
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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 '{}'const response = await fetch('https://api.nitrosend.com/v1/my/segments/count', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
const data = await response.json();import requests
payload = {}
response = requests.post('https://api.nitrosend.com/v1/my/segments/count', json=payload)
data = response.json(){}{
"count": 0
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Preview contacts matching filters
Preview a prospective segment without saving it. Returns a live count,
a bounded contact sample, and bounded overlap with existing segments.
Invalid filters fail closed with invalid_filter.
Body
filtersSegmentFilterExpressionResponse
Segment preview
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/preview' \
-H 'Content-Type: application/json' \
-d '{}'const response = await fetch('https://api.nitrosend.com/v1/my/segments/preview', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
const data = await response.json();import requests
payload = {}
response = requests.post('https://api.nitrosend.com/v1/my/segments/preview', json=payload)
data = response.json(){}{
"count": 0,
"sample": [
{
"id": 0,
"email": "string",
"name": "string"
}
],
"overlap": [
{
"segment_id": 0,
"name": "string",
"overlap_count": 0
}
]
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Campaigns
Email and SMS campaigns
List campaigns (paginated)
Parameters
pageinteger1querylimitinteger<= 10025queryResponse
Paginated campaigns
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"draft_revision_id": 0,
"draft_revision_digest": "string",
"draft_approval_state": "pending_review",
"active_revision_id": 0,
"active_revision_digest": "string",
"has_unpublished_changes": true,
"channel": "email",
"name": "string",
"data": {},
"scheduled_at": "2024-01-15T09:30:00Z",
"sent_count": 0,
"dashboard_url": "https://example.com",
"preview_url": "https://example.com",
"recipient_snapshot": {
"requested_recipients": 0,
"dispatched_recipients": 0,
"blocked_recipients": 0,
"requested_send_units": 0,
"dispatched_send_units": 0,
"units_per_recipient": 0,
"send_token": "string",
"started_at": "2024-01-15T09:30:00Z",
"completed_at": "2024-01-15T09:30:00Z"
},
"last_send_recipients": 0,
"delivery": {
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"campaign_send_token": "string",
"status": "sending",
"recipients": 0,
"sent": 0,
"failed": 0,
"pending": 0
},
"engagement": {
"sent": 0,
"opens": 0,
"total_opens": 0,
"open_rate": 0,
"account": {
"sent": 0,
"opens": 0,
"total_opens": 0,
"open_rate": 0
}
},
"revenue": {
"attribution_label": "Attributed revenue. Last click, 7-day window.",
"currency": "string",
"mixed_currency": true,
"attributed_revenue_cents": 0,
"delivered": 0,
"attributed_orders": 0,
"revenue_per_recipient": 0,
"conversion_rate": 0,
"attributed_aov": 0,
"message_breakdown": [
{
"message_id": 0,
"subject": "string",
"sent_at": "2024-01-15T09:30:00Z",
"currency": "string",
"mixed_currency": true,
"delivered": 0,
"attributed_orders": 0,
"attributed_revenue_cents": 0,
"revenue_per_recipient": 0,
"conversion_rate": 0,
"attributed_aov": 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
],
"exclude_segment_ids": [
0
],
"exclude_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,
"version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"variables": {},
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"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,
"version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"variables": {},
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"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)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"draft_revision_id": 0,
"draft_revision_digest": "string",
"draft_approval_state": "pending_review",
"active_revision_id": 0,
"active_revision_digest": "string",
"has_unpublished_changes": true,
"channel": "email",
"name": "string",
"data": {},
"scheduled_at": "2024-01-15T09:30:00Z",
"sent_count": 0,
"dashboard_url": "https://example.com",
"preview_url": "https://example.com",
"recipient_snapshot": {
"requested_recipients": 0,
"dispatched_recipients": 0,
"blocked_recipients": 0,
"requested_send_units": 0,
"dispatched_send_units": 0,
"units_per_recipient": 0,
"send_token": "string",
"started_at": "2024-01-15T09:30:00Z",
"completed_at": "2024-01-15T09:30:00Z"
},
"last_send_recipients": 0,
"delivery": {
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"campaign_send_token": "string",
"status": "sending",
"recipients": 0,
"sent": 0,
"failed": 0,
"pending": 0
},
"engagement": {
"sent": 0,
"opens": 0,
"total_opens": 0,
"open_rate": 0,
"account": {
"sent": 0,
"opens": 0,
"total_opens": 0,
"open_rate": 0
}
},
"revenue": {
"attribution_label": "Attributed revenue. Last click, 7-day window.",
"currency": "string",
"mixed_currency": true,
"attributed_revenue_cents": 0,
"delivered": 0,
"attributed_orders": 0,
"revenue_per_recipient": 0,
"conversion_rate": 0,
"attributed_aov": 0,
"message_breakdown": [
{
"message_id": 0,
"subject": "string",
"sent_at": "2024-01-15T09:30:00Z",
"currency": "string",
"mixed_currency": true,
"delivered": 0,
"attributed_orders": 0,
"attributed_revenue_cents": 0,
"revenue_per_recipient": 0,
"conversion_rate": 0,
"attributed_aov": 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
],
"exclude_segment_ids": [
0
],
"exclude_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,
"version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"variables": {},
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"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,
"version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"variables": {},
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Get a campaign
Parameters
idintegerrequiredpathResponse
Campaign with trigger, template, and templates
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"draft_revision_id": 0,
"draft_revision_digest": "string",
"draft_approval_state": "pending_review",
"active_revision_id": 0,
"active_revision_digest": "string",
"has_unpublished_changes": true,
"channel": "email",
"name": "string",
"data": {},
"scheduled_at": "2024-01-15T09:30:00Z",
"sent_count": 0,
"dashboard_url": "https://example.com",
"preview_url": "https://example.com",
"recipient_snapshot": {
"requested_recipients": 0,
"dispatched_recipients": 0,
"blocked_recipients": 0,
"requested_send_units": 0,
"dispatched_send_units": 0,
"units_per_recipient": 0,
"send_token": "string",
"started_at": "2024-01-15T09:30:00Z",
"completed_at": "2024-01-15T09:30:00Z"
},
"last_send_recipients": 0,
"delivery": {
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"campaign_send_token": "string",
"status": "sending",
"recipients": 0,
"sent": 0,
"failed": 0,
"pending": 0
},
"engagement": {
"sent": 0,
"opens": 0,
"total_opens": 0,
"open_rate": 0,
"account": {
"sent": 0,
"opens": 0,
"total_opens": 0,
"open_rate": 0
}
},
"revenue": {
"attribution_label": "Attributed revenue. Last click, 7-day window.",
"currency": "string",
"mixed_currency": true,
"attributed_revenue_cents": 0,
"delivered": 0,
"attributed_orders": 0,
"revenue_per_recipient": 0,
"conversion_rate": 0,
"attributed_aov": 0,
"message_breakdown": [
{
"message_id": 0,
"subject": "string",
"sent_at": "2024-01-15T09:30:00Z",
"currency": "string",
"mixed_currency": true,
"delivered": 0,
"attributed_orders": 0,
"attributed_revenue_cents": 0,
"revenue_per_recipient": 0,
"conversion_rate": 0,
"attributed_aov": 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
],
"exclude_segment_ids": [
0
],
"exclude_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,
"version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"variables": {},
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"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,
"version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"variables": {},
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Delete a campaign
Parameters
idintegerrequiredpathResponse
Deleted campaign
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"draft_revision_id": 0,
"draft_revision_digest": "string",
"draft_approval_state": "pending_review",
"active_revision_id": 0,
"active_revision_digest": "string",
"has_unpublished_changes": true,
"channel": "email",
"name": "string",
"data": {},
"scheduled_at": "2024-01-15T09:30:00Z",
"sent_count": 0,
"dashboard_url": "https://example.com",
"preview_url": "https://example.com",
"recipient_snapshot": {
"requested_recipients": 0,
"dispatched_recipients": 0,
"blocked_recipients": 0,
"requested_send_units": 0,
"dispatched_send_units": 0,
"units_per_recipient": 0,
"send_token": "string",
"started_at": "2024-01-15T09:30:00Z",
"completed_at": "2024-01-15T09:30:00Z"
},
"last_send_recipients": 0,
"delivery": {
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"campaign_send_token": "string",
"status": "sending",
"recipients": 0,
"sent": 0,
"failed": 0,
"pending": 0
},
"engagement": {
"sent": 0,
"opens": 0,
"total_opens": 0,
"open_rate": 0,
"account": {
"sent": 0,
"opens": 0,
"total_opens": 0,
"open_rate": 0
}
},
"revenue": {
"attribution_label": "Attributed revenue. Last click, 7-day window.",
"currency": "string",
"mixed_currency": true,
"attributed_revenue_cents": 0,
"delivered": 0,
"attributed_orders": 0,
"revenue_per_recipient": 0,
"conversion_rate": 0,
"attributed_aov": 0,
"message_breakdown": [
{
"message_id": 0,
"subject": "string",
"sent_at": "2024-01-15T09:30:00Z",
"currency": "string",
"mixed_currency": true,
"delivered": 0,
"attributed_orders": 0,
"attributed_revenue_cents": 0,
"revenue_per_recipient": 0,
"conversion_rate": 0,
"attributed_aov": 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
],
"exclude_segment_ids": [
0
],
"exclude_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,
"version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"variables": {},
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"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,
"version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"variables": {},
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"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
Template version conflict
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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,
"exclude_segment_ids": [
0
],
"exclude_contact_list_ids": [
0
],
"data": {}
},
"template_attributes": {
"if_version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "user@example.com",
"reply_to": "user@example.com",
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"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,
"exclude_segment_ids": [
0
],
"exclude_contact_list_ids": [
0
],
"data": {}
},
"template_attributes": {
"if_version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "user@example.com",
"reply_to": "user@example.com",
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"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,
"exclude_segment_ids": [
0
],
"exclude_contact_list_ids": [
0
],
"data": {}
},
"template_attributes": {
"if_version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "user@example.com",
"reply_to": "user@example.com",
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": True,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"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,
"exclude_segment_ids": [
0
],
"exclude_contact_list_ids": [
0
],
"data": {}
},
"template_attributes": {
"if_version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "user@example.com",
"reply_to": "user@example.com",
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
}
}
}{
"id": 0,
"account_id": 0,
"brand_id": 0,
"status": "draft",
"approval_state": "string",
"draft_revision_id": 0,
"draft_revision_digest": "string",
"draft_approval_state": "pending_review",
"active_revision_id": 0,
"active_revision_digest": "string",
"has_unpublished_changes": true,
"channel": "email",
"name": "string",
"data": {},
"scheduled_at": "2024-01-15T09:30:00Z",
"sent_count": 0,
"dashboard_url": "https://example.com",
"preview_url": "https://example.com",
"recipient_snapshot": {
"requested_recipients": 0,
"dispatched_recipients": 0,
"blocked_recipients": 0,
"requested_send_units": 0,
"dispatched_send_units": 0,
"units_per_recipient": 0,
"send_token": "string",
"started_at": "2024-01-15T09:30:00Z",
"completed_at": "2024-01-15T09:30:00Z"
},
"last_send_recipients": 0,
"delivery": {
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"campaign_send_token": "string",
"status": "sending",
"recipients": 0,
"sent": 0,
"failed": 0,
"pending": 0
},
"engagement": {
"sent": 0,
"opens": 0,
"total_opens": 0,
"open_rate": 0,
"account": {
"sent": 0,
"opens": 0,
"total_opens": 0,
"open_rate": 0
}
},
"revenue": {
"attribution_label": "Attributed revenue. Last click, 7-day window.",
"currency": "string",
"mixed_currency": true,
"attributed_revenue_cents": 0,
"delivered": 0,
"attributed_orders": 0,
"revenue_per_recipient": 0,
"conversion_rate": 0,
"attributed_aov": 0,
"message_breakdown": [
{
"message_id": 0,
"subject": "string",
"sent_at": "2024-01-15T09:30:00Z",
"currency": "string",
"mixed_currency": true,
"delivered": 0,
"attributed_orders": 0,
"attributed_revenue_cents": 0,
"revenue_per_recipient": 0,
"conversion_rate": 0,
"attributed_aov": 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
],
"exclude_segment_ids": [
0
],
"exclude_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,
"version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"variables": {},
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"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,
"version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"variables": {},
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Duplicate a campaign
Creates a new draft campaign that copies the source's audience (trigger.audience_type, contact_list_ids, segment_id, exclude_segment_ids, exclude_contact_list_ids) 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)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"draft_revision_id": 0,
"draft_revision_digest": "string",
"draft_approval_state": "pending_review",
"active_revision_id": 0,
"active_revision_digest": "string",
"has_unpublished_changes": true,
"channel": "email",
"name": "string",
"data": {},
"scheduled_at": "2024-01-15T09:30:00Z",
"sent_count": 0,
"dashboard_url": "https://example.com",
"preview_url": "https://example.com",
"recipient_snapshot": {
"requested_recipients": 0,
"dispatched_recipients": 0,
"blocked_recipients": 0,
"requested_send_units": 0,
"dispatched_send_units": 0,
"units_per_recipient": 0,
"send_token": "string",
"started_at": "2024-01-15T09:30:00Z",
"completed_at": "2024-01-15T09:30:00Z"
},
"last_send_recipients": 0,
"delivery": {
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"campaign_send_token": "string",
"status": "sending",
"recipients": 0,
"sent": 0,
"failed": 0,
"pending": 0
},
"engagement": {
"sent": 0,
"opens": 0,
"total_opens": 0,
"open_rate": 0,
"account": {
"sent": 0,
"opens": 0,
"total_opens": 0,
"open_rate": 0
}
},
"revenue": {
"attribution_label": "Attributed revenue. Last click, 7-day window.",
"currency": "string",
"mixed_currency": true,
"attributed_revenue_cents": 0,
"delivered": 0,
"attributed_orders": 0,
"revenue_per_recipient": 0,
"conversion_rate": 0,
"attributed_aov": 0,
"message_breakdown": [
{
"message_id": 0,
"subject": "string",
"sent_at": "2024-01-15T09:30:00Z",
"currency": "string",
"mixed_currency": true,
"delivered": 0,
"attributed_orders": 0,
"attributed_revenue_cents": 0,
"revenue_per_recipient": 0,
"conversion_rate": 0,
"attributed_aov": 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
],
"exclude_segment_ids": [
0
],
"exclude_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,
"version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"variables": {},
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"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,
"version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"variables": {},
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Render a campaign email to HTML
Renders the campaign's current template through the shared preview renderer.
Parameters
idintegerrequiredpathResponse
Rendered HTML
Resource not found
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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}/render'const response = await fetch('https://api.nitrosend.com/v1/my/campaigns/{id}/render', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/campaigns/{id}/render')
data = response.json(){
"html": "string"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Read saved campaign readiness and capacity guidance
Read-only structural checks and the deduplicated saved audience count. Capacity warnings are informational, not approval or admission gates. Save pending draft changes before requesting this projection.
Parameters
idintegerrequiredpathResponse
Structural readiness with optional capacity guidance
Resource not found
A read did not finish within the request's database time limit (error_code: query_timeout). Nothing was changed; retry after the Retry-After interval. Any GET can return this.
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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}/readiness'const response = await fetch('https://api.nitrosend.com/v1/my/campaigns/{id}/readiness', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/campaigns/{id}/readiness')
data = response.json(){
"ready": true,
"authority": "structural_readiness_only",
"note": "string",
"checks": [
{
"name": "string",
"passed": true,
"message": "string",
"audience_count": 0
}
],
"blocking_issues": [
"string"
],
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Get current campaign delivery progress
Polls the current campaign send using the same Campaign::SendProgress
payload exposed on the campaign serializer. Active sends return
status: "sending" with poll_after_seconds; terminal sends return
status: "completed" or status: "paused" when a deliverability guard
stopped the active send. Campaigns that have not started delivery return
status: "not_started". Polling also refreshes server-side progress:
queued reservations older than 15 minutes are marked failed before the
response is returned, so failed/pending can change on a poll even
when no provider webhook has arrived.
Parameters
idintegerrequiredpathResponse
Current campaign delivery progress
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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}/delivery'const response = await fetch('https://api.nitrosend.com/v1/my/campaigns/{id}/delivery', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/campaigns/{id}/delivery')
data = response.json(){
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"campaign_send_token": "string",
"status": "not_started",
"recipients": 0,
"sent": 0,
"failed": 0,
"pending": 0,
"terminal": true,
"poll_after_seconds": 0
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Send a test email for a campaign
Thin adapter over the same test-send service used by template tests.
Use contact_id to send directly to a contact, or
sample_contact_id to personalize explicit test recipients without
sending to that contact. The two contact parameters are mutually
exclusive.
Test emails go to the account's own people (owner, members, an active
managing account's people) and to addresses at the account's verified
domains. Up to 10 other addresses per 30 days are allowed; past that,
each refused recipient is reported in results with status: failed
and the reason in error, and the other recipients still receive the
test.
Supply one fresh Idempotency-Key for each user-initiated send and
reuse that exact key for transport retries.
Body
emailstring<email>emailsArray<string>send_test_toArray<string>contact_idintegersample_contact_idintegerContact whose projected data personalizes the test without changing the test recipient.
Parameters
idintegerrequiredpathIdempotency-KeystringrequiredheaderResponse
Test email sent
Resource not found
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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_test' \
-H 'Content-Type: application/json' \
-d '{
"email": "user@example.com",
"emails": [
"user@example.com"
],
"send_test_to": [
"user@example.com"
],
"contact_id": 0,
"sample_contact_id": 0
}'const response = await fetch('https://api.nitrosend.com/v1/my/campaigns/{id}/send_test', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"email": "user@example.com",
"emails": [
"user@example.com"
],
"send_test_to": [
"user@example.com"
],
"contact_id": 0,
"sample_contact_id": 0
}),
});
const data = await response.json();import requests
payload = {
"email": "user@example.com",
"emails": [
"user@example.com"
],
"send_test_to": [
"user@example.com"
],
"contact_id": 0,
"sample_contact_id": 0
}
response = requests.post('https://api.nitrosend.com/v1/my/campaigns/{id}/send_test', json=payload)
data = response.json(){
"email": "user@example.com",
"emails": [
"user@example.com"
],
"send_test_to": [
"user@example.com"
],
"contact_id": 0,
"sample_contact_id": 0
}{
"sent": 0,
"results": [
{
"email": "string",
"success": true,
"status": "delivered",
"code": "string",
"error": "string",
"message_id": 0
}
]
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Send a campaign
Delivers the exact persisted campaign snapshot. Save content, audience,
and other authoring changes through the campaign update endpoint first.
This endpoint rejects authoring fields rather than merging them during
delivery. Pass deliver_at (RFC 3339) to schedule; omit it to send now.
Both expected_campaign_updated_at and template_if_version are
required so a stale caller cannot send a newer draft accidentally.
Returns 422 campaign_locked if the campaign is not editable
(live, paused, completed, cancelled, archived, or scheduled within
5 minutes of send). Returns 409 duplicate_campaign_schedule or
duplicate_campaign_send when a repeat attempt would create another
schedule or overlap an active send; poll /delivery, cancel, or edit
the existing scheduled campaign instead.
Body
expected_campaign_updated_atstring<date-time>requiredExact campaign.updated_at value from the persisted draft being approved for delivery.
template_if_versionintegerrequiredExact persisted campaign template version being approved for delivery.
deliver_atstring<date-time>Future delivery time. Omit for immediate delivery.
confirm_send_to_allbooleanRequired when the persisted audience is all_contacts.
Parameters
idintegerrequiredpathResponse
Campaign sent
Template version conflict or duplicate send attempt
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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 '{
"expected_campaign_updated_at": "2024-01-15T09:30:00Z",
"template_if_version": 0,
"deliver_at": "2024-01-15T09:30:00Z",
"confirm_send_to_all": true
}'const response = await fetch('https://api.nitrosend.com/v1/my/campaigns/{id}/send', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"expected_campaign_updated_at": "2024-01-15T09:30:00Z",
"template_if_version": 0,
"deliver_at": "2024-01-15T09:30:00Z",
"confirm_send_to_all": true
}),
});
const data = await response.json();import requests
payload = {
"expected_campaign_updated_at": "2024-01-15T09:30:00Z",
"template_if_version": 0,
"deliver_at": "2024-01-15T09:30:00Z",
"confirm_send_to_all": True
}
response = requests.post('https://api.nitrosend.com/v1/my/campaigns/{id}/send', json=payload)
data = response.json(){
"expected_campaign_updated_at": "2024-01-15T09:30:00Z",
"template_if_version": 0,
"deliver_at": "2024-01-15T09:30:00Z",
"confirm_send_to_all": true
}{
"id": 0,
"account_id": 0,
"brand_id": 0,
"status": "draft",
"approval_state": "string",
"draft_revision_id": 0,
"draft_revision_digest": "string",
"draft_approval_state": "pending_review",
"active_revision_id": 0,
"active_revision_digest": "string",
"has_unpublished_changes": true,
"channel": "email",
"name": "string",
"data": {},
"scheduled_at": "2024-01-15T09:30:00Z",
"sent_count": 0,
"dashboard_url": "https://example.com",
"preview_url": "https://example.com",
"recipient_snapshot": {
"requested_recipients": 0,
"dispatched_recipients": 0,
"blocked_recipients": 0,
"requested_send_units": 0,
"dispatched_send_units": 0,
"units_per_recipient": 0,
"send_token": "string",
"started_at": "2024-01-15T09:30:00Z",
"completed_at": "2024-01-15T09:30:00Z"
},
"last_send_recipients": 0,
"delivery": {
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"campaign_send_token": "string",
"status": "sending",
"recipients": 0,
"sent": 0,
"failed": 0,
"pending": 0
},
"engagement": {
"sent": 0,
"opens": 0,
"total_opens": 0,
"open_rate": 0,
"account": {
"sent": 0,
"opens": 0,
"total_opens": 0,
"open_rate": 0
}
},
"revenue": {
"attribution_label": "Attributed revenue. Last click, 7-day window.",
"currency": "string",
"mixed_currency": true,
"attributed_revenue_cents": 0,
"delivered": 0,
"attributed_orders": 0,
"revenue_per_recipient": 0,
"conversion_rate": 0,
"attributed_aov": 0,
"message_breakdown": [
{
"message_id": 0,
"subject": "string",
"sent_at": "2024-01-15T09:30:00Z",
"currency": "string",
"mixed_currency": true,
"delivered": 0,
"attributed_orders": 0,
"attributed_revenue_cents": 0,
"revenue_per_recipient": 0,
"conversion_rate": 0,
"attributed_aov": 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
],
"exclude_segment_ids": [
0
],
"exclude_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,
"version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"variables": {},
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"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,
"version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"variables": {},
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Messages
Transactional email and SMS messages
List messages
Returns all messages by default. Use source_type to narrow to campaign, flow, transactional, or test sends.
Parameters
source_typestringallcampaignflowtransactionaltestqueryFilter by source. Omit or use 'all' for everything.
flow_idintegerqueryFilter to messages from a specific flow
campaign_idintegerqueryFilter to messages from a specific campaign
datestring<date>queryFilter to messages created on this date
channelstringemailsmsquerystatusstringqueuedsentfailedquerypageinteger1querylimitinteger<= 10025queryResponse
Paginated list of messages
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"status_reason_code": "string",
"status_reason": "string",
"status_reason_category": "content_review",
"failure_code": "string",
"failure_reason": "string",
"failure_category": "content_review",
"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.
A stable idempotency key is strongly recommended via the
Idempotency-Key header or idempotency_key body field, and becomes
mandatory on 2026-09-01. Before that cutoff, keyless requests are
accepted but deprecated: they skip duplicate protection and the
response carries Deprecation and Sunset headers. Reuse a key only
for an exact retry.
Body
channelstringemailsmsrequiredtostringrequiredRecipient email address or E.164 phone number
subjectstringEmail subject line (required for email channel)
bodystringMessage body. Required for SMS. For email this is plain text (HTML in this field is escaped) and serves as the plain-text alternative when html is set. To send HTML, use html or template_id.
htmlstringPre-rendered HTML body for email, used verbatim as the HTML part (not escaped). Use this to send your own fully-rendered HTML. Mutually exclusive with template_id (email only).
template_idintegerLoad email design from an existing template (email only)
contact_idintegerOptional contact to personalize with when rendering a template
fromstringVerified sender email for this email message. May include a display name, for example "Acme hello@example.com".
from_emailstringVerified sender email for this email message. Alias of from.
from_namestringSender display name for this email message
reply_tostringReply-to email address for this email message
headersobjectProvider headers for this email message. Structural and Nitrosend-reserved headers are rejected.
tagsobjectProvider tags for this email message. Nitrosend-reserved tag keys are rejected and system tags are always controlled by Nitrosend.
dataobjectMerge variables
mail_actionMailActionDescriptionA Mail Action Protocol 0.2 description. The canonical MailSchema core schema is authoritative; this schema restates its shape.
idempotency_keystringStable idempotency key (alternative to header). Strongly recommended; mandatory from 2026-09-01.
Parameters
Idempotency-KeystringheaderStrongly recommended; mandatory from 2026-09-01 unless idempotency_key is supplied in the body. Prevents duplicate sends on retry. The same key with the same payload returns the original message; the same key with a different payload returns 409. Before the cutoff, keyless requests succeed with Deprecation and Sunset response headers.
Response
Existing message returned for idempotency replay
Message created
Missing required idempotency key (enforced from 2026-09-01). Before the cutoff, keyless requests are accepted with Deprecation and Sunset headers.
Idempotency conflict or explicit sender selection required; no new message is retained in either case
Validation failed
Admission evidence or the shared hosted-sender root is temporarily unavailable
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"html": "string",
"template_id": 0,
"contact_id": 0,
"from": "string",
"from_email": "string",
"from_name": "string",
"reply_to": "string",
"headers": {},
"tags": {},
"data": {},
"mail_action": {
"@context": "https://mailschema.org/contexts/map-0.2.jsonld",
"@type": "MailAction",
"@id": "https://example.com",
"profile": "https://mailschema.org/profiles/map/0.2",
"type": {
"id": "https://example.com",
"version": "string",
"contractDigest": "string"
},
"describedAt": "2024-01-15T09:30:00Z",
"expiresAt": "2024-01-15T09:30:00Z",
"service": {
"id": "https://example.com",
"name": "string",
"authority": "credential",
"resource": "https://example.com",
"execution": {
"url": "https://example.com",
"resultUrlTemplate": "string",
"resultRetentionSeconds": 300
},
"humanUrl": "https://example.com"
},
"recipient": "user@example.com",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"details": {},
"operations": [
{
"id": "string",
"name": "string",
"description": "string"
}
]
},
"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",
"html": "string",
"template_id": 0,
"contact_id": 0,
"from": "string",
"from_email": "string",
"from_name": "string",
"reply_to": "string",
"headers": {},
"tags": {},
"data": {},
"mail_action": {
"@context": "https://mailschema.org/contexts/map-0.2.jsonld",
"@type": "MailAction",
"@id": "https://example.com",
"profile": "https://mailschema.org/profiles/map/0.2",
"type": {
"id": "https://example.com",
"version": "string",
"contractDigest": "string"
},
"describedAt": "2024-01-15T09:30:00Z",
"expiresAt": "2024-01-15T09:30:00Z",
"service": {
"id": "https://example.com",
"name": "string",
"authority": "credential",
"resource": "https://example.com",
"execution": {
"url": "https://example.com",
"resultUrlTemplate": "string",
"resultRetentionSeconds": 300
},
"humanUrl": "https://example.com"
},
"recipient": "user@example.com",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"details": {},
"operations": [
{
"id": "string",
"name": "string",
"description": "string"
}
]
},
"idempotency_key": "string"
}),
});
const data = await response.json();import requests
payload = {
"channel": "email",
"to": "string",
"subject": "string",
"body": "string",
"html": "string",
"template_id": 0,
"contact_id": 0,
"from": "string",
"from_email": "string",
"from_name": "string",
"reply_to": "string",
"headers": {},
"tags": {},
"data": {},
"mail_action": {
"@context": "https://mailschema.org/contexts/map-0.2.jsonld",
"@type": "MailAction",
"@id": "https://example.com",
"profile": "https://mailschema.org/profiles/map/0.2",
"type": {
"id": "https://example.com",
"version": "string",
"contractDigest": "string"
},
"describedAt": "2024-01-15T09:30:00Z",
"expiresAt": "2024-01-15T09:30:00Z",
"service": {
"id": "https://example.com",
"name": "string",
"authority": "credential",
"resource": "https://example.com",
"execution": {
"url": "https://example.com",
"resultUrlTemplate": "string",
"resultRetentionSeconds": 300
},
"humanUrl": "https://example.com"
},
"recipient": "user@example.com",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"details": {},
"operations": [
{
"id": "string",
"name": "string",
"description": "string"
}
]
},
"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",
"html": "string",
"template_id": 0,
"contact_id": 0,
"from": "string",
"from_email": "string",
"from_name": "string",
"reply_to": "string",
"headers": {},
"tags": {},
"data": {},
"mail_action": {
"@context": "https://mailschema.org/contexts/map-0.2.jsonld",
"@type": "MailAction",
"@id": "https://example.com",
"profile": "https://mailschema.org/profiles/map/0.2",
"type": {
"id": "https://example.com",
"version": "string",
"contractDigest": "string"
},
"describedAt": "2024-01-15T09:30:00Z",
"expiresAt": "2024-01-15T09:30:00Z",
"service": {
"id": "https://example.com",
"name": "string",
"authority": "credential",
"resource": "https://example.com",
"execution": {
"url": "https://example.com",
"resultUrlTemplate": "string",
"resultRetentionSeconds": 300
},
"humanUrl": "https://example.com"
},
"recipient": "user@example.com",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"details": {},
"operations": [
{
"id": "string",
"name": "string",
"description": "string"
}
]
},
"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",
"status_reason_code": "string",
"status_reason": "string",
"status_reason_category": "content_review",
"failure_code": "string",
"failure_reason": "string",
"failure_category": "content_review",
"sent_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}{
"id": 0,
"channel": "email",
"to": "string",
"subject": "string",
"status": "queued",
"provider_id": "string",
"flow_id": 0,
"source_type": "campaign",
"source_name": "string",
"status_reason_code": "string",
"status_reason": "string",
"status_reason_category": "content_review",
"failure_code": "string",
"failure_reason": "string",
"failure_category": "content_review",
"sent_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"code": 409,
"message": "string",
"error": true,
"error_code": "idempotency_conflict"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "delivery_evidence_pending",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Get a transactional message
Parameters
idintegerrequiredpathResponse
Message
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"status_reason_code": "string",
"status_reason": "string",
"status_reason_category": "content_review",
"failure_code": "string",
"failure_reason": "string",
"failure_category": "content_review",
"sent_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Render a transactional message's HTML for preview
Returns the as-composed HTML for a message — from its template (rendered design), raw html, or the escaped plain-text body — using the same renderer as the send path, for display in a sandboxed iframe. Non-email or unrenderable messages (deleted/design-less template) return a typed empty state (empty: true) rather than an error.
Parameters
idintegerrequiredpathResponse
Rendered preview, or a typed empty state.
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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}/preview'const response = await fetch('https://api.nitrosend.com/v1/my/messages/{id}/preview', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/messages/{id}/preview')
data = response.json(){
"html": "string",
"format": "template",
"empty": true,
"reason": "not_previewable"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Suppressions
Account suppression list and deliverability diagnostics
List suppressions
Returns the authenticated account's current suppression records by default, including bounded provider diagnostics when the source feedback event is available.
Parameters
idintegerqueryFilter to a specific suppression ID
emailstring<email>queryFilter to a specific suppressed email address
reasonstringhard_bouncesoft_bouncecomplaintmanualadminquerysource_providerstringqueryFilter by provider that emitted the source event
activebooleantruequeryDefaults to true. Set false to list expired suppressions.
pageinteger1querylimitinteger<= 10025queryResponse
Paginated list of suppressions
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/suppressions'const response = await fetch('https://api.nitrosend.com/v1/my/suppressions', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/suppressions')
data = response.json()[
{
"id": 0,
"email": "user@example.com",
"reason": "hard_bounce",
"scope": "account_scoped",
"active": true,
"contact_id": 0,
"source_provider": "string",
"source_event_id": "string",
"provider_diagnostic": "string",
"bounce_type": "hard",
"bounce_subtype": "string",
"complaint_feedback_type": "string",
"event_occurred_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"
}
]Webhooks
Signed delivery-event webhooks for transactional email
List webhooks
The current brand's webhook endpoints, oldest first, each with its newest delivery. Secrets are masked.
Parameters
pageinteger1querylimitinteger<= 10025queryResponse
Paginated list of webhooks
Not authenticated
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/webhooks'const response = await fetch('https://api.nitrosend.com/v1/my/webhooks', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/webhooks')
data = response.json()[
{
"id": 0,
"url": "https://example.com",
"events": [
"email.sent"
],
"enabled": true,
"status": "active",
"failing_since": "2024-01-15T09:30:00Z",
"secret": "string",
"last_delivery": {
"id": 0,
"event_type": "email.sent",
"status": "pending",
"attempts": 0,
"last_response_status": 0,
"updated_at": "2024-01-15T09:30:00Z"
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Register a webhook endpoint
Registers an HTTPS endpoint to receive the chosen events for the
brand's transactional email. The response carries the signing secret
in full; later reads mask it unless reveal=true. A brand can have at
most 10 webhooks. The URL must resolve only to public addresses.
Body
urlstring<uri>HTTPS URL that resolves only to public addresses, without credentials.
eventsArray<WebhookEventType>email.sentemail.deliveredemail.bouncedemail.complainedemail.openedemail.clickedemail.failedemail.receivedenabledbooleanResponse
Webhook created, secret revealed
Not authenticated
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/webhooks' \
-H 'Content-Type: application/json' \
-d '{
"url": "https://example.com",
"events": [
"email.sent"
],
"enabled": true
}'const response = await fetch('https://api.nitrosend.com/v1/my/webhooks', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"url": "https://example.com",
"events": [
"email.sent"
],
"enabled": true
}),
});
const data = await response.json();import requests
payload = {
"url": "https://example.com",
"events": [
"email.sent"
],
"enabled": True
}
response = requests.post('https://api.nitrosend.com/v1/my/webhooks', json=payload)
data = response.json(){
"url": "https://example.com",
"events": [
"email.sent"
],
"enabled": true
}{
"id": 0,
"url": "https://example.com",
"events": [
"email.sent"
],
"enabled": true,
"status": "active",
"failing_since": "2024-01-15T09:30:00Z",
"secret": "string",
"last_delivery": {
"id": 0,
"event_type": "email.sent",
"status": "pending",
"attempts": 0,
"last_response_status": 0,
"updated_at": "2024-01-15T09:30:00Z"
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Get a webhook
Parameters
idintegerrequiredpathrevealbooleanfalsequeryReturn the signing secret in full.
Response
Webhook
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/webhooks/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/webhooks/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/webhooks/{id}')
data = response.json(){
"id": 0,
"url": "https://example.com",
"events": [
"email.sent"
],
"enabled": true,
"status": "active",
"failing_since": "2024-01-15T09:30:00Z",
"secret": "string",
"last_delivery": {
"id": 0,
"event_type": "email.sent",
"status": "pending",
"attempts": 0,
"last_response_status": 0,
"updated_at": "2024-01-15T09:30:00Z"
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Delete a webhook and its delivery history
Parameters
idintegerrequiredpathResponse
Webhook deleted
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/webhooks/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/webhooks/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.nitrosend.com/v1/my/webhooks/{id}')
data = response.json(){
"id": 0,
"url": "https://example.com",
"events": [
"email.sent"
],
"enabled": true,
"status": "active",
"failing_since": "2024-01-15T09:30:00Z",
"secret": "string",
"last_delivery": {
"id": 0,
"event_type": "email.sent",
"status": "pending",
"attempts": 0,
"last_response_status": 0,
"updated_at": "2024-01-15T09:30:00Z"
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Update a webhook
Changes the URL, the events, or whether the webhook is on. Turning it off fails the deliveries it still owed; turning it on clears its failing state. Events that occur while it is off are not sent.
Body
urlstring<uri>HTTPS URL that resolves only to public addresses, without credentials.
eventsArray<WebhookEventType>email.sentemail.deliveredemail.bouncedemail.complainedemail.openedemail.clickedemail.failedemail.receivedenabledbooleanParameters
idintegerrequiredpathResponse
Webhook updated
Resource not found
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/webhooks/{id}' \
-H 'Content-Type: application/json' \
-d '{
"url": "https://example.com",
"events": [
"email.sent"
],
"enabled": true
}'const response = await fetch('https://api.nitrosend.com/v1/my/webhooks/{id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"url": "https://example.com",
"events": [
"email.sent"
],
"enabled": true
}),
});
const data = await response.json();import requests
payload = {
"url": "https://example.com",
"events": [
"email.sent"
],
"enabled": True
}
response = requests.patch('https://api.nitrosend.com/v1/my/webhooks/{id}', json=payload)
data = response.json(){
"url": "https://example.com",
"events": [
"email.sent"
],
"enabled": true
}{
"id": 0,
"url": "https://example.com",
"events": [
"email.sent"
],
"enabled": true,
"status": "active",
"failing_since": "2024-01-15T09:30:00Z",
"secret": "string",
"last_delivery": {
"id": 0,
"event_type": "email.sent",
"status": "pending",
"attempts": 0,
"last_response_status": 0,
"updated_at": "2024-01-15T09:30:00Z"
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Send a test event
Queues a sample event of the chosen type to this webhook through the
normal delivery path, signed and retried like a real event. Its data
carries test: true and no message id.
Body
typeWebhookEventTypeemail.sentemail.deliveredemail.bouncedemail.complainedemail.openedemail.clickedemail.failedemail.receivedParameters
idintegerrequiredpathResponse
Test event queued
Resource not found
Unknown event type, or the webhook is off
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/webhooks/{id}/test' \
-H 'Content-Type: application/json' \
-d '{
"type": "email.sent"
}'const response = await fetch('https://api.nitrosend.com/v1/my/webhooks/{id}/test', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"type": "email.sent"
}),
});
const data = await response.json();import requests
payload = {
"type": "email.sent"
}
response = requests.post('https://api.nitrosend.com/v1/my/webhooks/{id}/test', json=payload)
data = response.json(){
"type": "email.sent"
}{
"id": 0,
"event_id": "550e8400-e29b-41d4-a716-446655440000",
"event_type": "email.sent",
"status": "pending",
"attempts": 0,
"last_response_status": 0,
"last_error": "string",
"next_attempt_at": "2024-01-15T09:30:00Z",
"payload": {
"type": "email.sent",
"timestamp": "2024-01-15T09:30:00Z",
"data": {
"message_id": 0,
"to": "string",
"subject": "string",
"idempotency_key": "string",
"tags": {},
"test": true,
"sent_at": "2024-01-15T09:30:00Z",
"bounce": {
"type": "hard",
"subtype": "string"
},
"complaint": {
"feedback_type": "string"
},
"url": "string",
"failure": {
"code": "string",
"reason": "string",
"category": "string"
}
}
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}List a webhook's deliveries
The last 7 days of deliveries to this webhook, newest first.
Parameters
idintegerrequiredpathpageinteger1querylimitinteger<= 10025queryResponse
Paginated list of deliveries
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/webhooks/{id}/deliveries'const response = await fetch('https://api.nitrosend.com/v1/my/webhooks/{id}/deliveries', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/webhooks/{id}/deliveries')
data = response.json()[
{
"id": 0,
"event_id": "550e8400-e29b-41d4-a716-446655440000",
"event_type": "email.sent",
"status": "pending",
"attempts": 0,
"last_response_status": 0,
"last_error": "string",
"next_attempt_at": "2024-01-15T09:30:00Z",
"payload": {
"type": "email.sent",
"timestamp": "2024-01-15T09:30:00Z",
"data": {
"message_id": 0,
"to": "string",
"subject": "string",
"idempotency_key": "string",
"tags": {},
"test": true,
"sent_at": "2024-01-15T09:30:00Z",
"bounce": {
"type": "hard",
"subtype": "string"
},
"complaint": {
"feedback_type": "string"
},
"url": "string",
"failure": {
"code": "string",
"reason": "string",
"category": "string"
}
}
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Templates
Email templates, preview, and component schema
Ingest an image media asset
REST adapter over the same image ingest capability used by MCP. Send
exactly one source: image_data, image_url, multipart file, or a
direct-upload signed_id created with purpose image or media_asset.
The v1 media contract supports media_kind: image only.
Body
application/jsonobjectimage_datastringRaw base64 image bytes or a data URL. PNG, JPEG, or WebP only; decoded size must be under 10MB.
image_urlstring<uri>Public PNG, JPEG, or WebP URL to ingest when Nitro-hosted permanence is desired.
signed_idstringActive Storage blob signed ID returned by /v1/direct_uploads after uploading bytes with purpose image or media_asset.
filenamestringOriginal filename for image_data uploads, or optional filename override for image_url/signed_id sources.
content_typestring | nullOptional MIME type hint when image_data is raw base64 rather than a data URL.
multipart/form-dataobjectfilestring<binary>PNG, JPEG, or WebP file upload. Must be under 10MB.
filenamestringOptional filename override.
content_typestring | nullOptional MIME type override.
Response
Ingested image asset
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/images' \
-H 'Content-Type: application/json' \
-d '{
"image_data": "string",
"image_url": "https://example.com",
"signed_id": "string",
"filename": "string",
"content_type": "string"
}'const response = await fetch('https://api.nitrosend.com/v1/my/images', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"image_data": "string",
"image_url": "https://example.com",
"signed_id": "string",
"filename": "string",
"content_type": "string"
}),
});
const data = await response.json();import requests
payload = {
"image_data": "string",
"image_url": "https://example.com",
"signed_id": "string",
"filename": "string",
"content_type": "string"
}
response = requests.post('https://api.nitrosend.com/v1/my/images', json=payload)
data = response.json(){
"image_data": "string",
"image_url": "https://example.com",
"signed_id": "string",
"filename": "string",
"content_type": "string"
}{
"file": "<binary>",
"filename": "string",
"content_type": "string"
}{
"media_kind": "image",
"media_url": "https://example.com",
"image_url": "https://example.com",
"signed_id": "string",
"filename": "string",
"content_type": "string",
"byte_size": 0,
"width": 0,
"height": 0
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}List all templates (paginated)
Returns a summary view with section counts (not full design).
Parameters
pageinteger1queryperinteger<= 100100queryscopestringallstandaloneallqueryUse standalone for reusable library templates. Omit or use all to retain the complete designed-template result.
include_previewsbooleanqueryWhen set, each summary includes rendered preview_html (cached per template version)
Response
Template summaries
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"version": 0,
"preview_html": "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
Creates one standalone template. Idempotency-Key is required; an exact retry returns the original template, while reuse with changed input returns 409.
Body
namestringsubjectstringpreheaderstringgeneration_provenanceGenerationProvenanceCandidate-bound generation evidence. Save endpoints accept only
state: candidate values returned by the generation endpoint. Resource
responses may return state: accepted as read-only history.
if_versionintegerRequired optimistic concurrency token. Use the current template.version.
designEmailDesignEmail template design document
Parameters
Idempotency-KeystringrequiredheaderResponse
Exact idempotent replay of an existing template
Created template
Bad request
Idempotency-Key reused with changed input
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"if_version": 0,
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"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_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"if_version": 0,
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
}
}),
});
const data = await response.json();import requests
payload = {
"name": "string",
"subject": "string",
"preheader": "string",
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"if_version": 0,
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": True,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
}
}
response = requests.post('https://api.nitrosend.com/v1/my/templates', json=payload)
data = response.json(){
"name": "string",
"subject": "string",
"preheader": "string",
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"if_version": 0,
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
}
}{
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"variables": {},
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"variables": {},
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Get a template with full design
Parameters
idintegerrequiredpathResponse
Full template including design
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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,
"version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"variables": {},
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Delete an unused standalone template
Parameters
idintegerrequiredpathif_versionintegerrequiredqueryRequired optimistic concurrency token. Use the current template.version.
Response
Template deleted
Resource not found
Template version conflict or deletion blocked by message/flow history
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/templates/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/templates/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.nitrosend.com/v1/my/templates/{id}')
data = response.json(){
"deleted": true,
"template_id": 0
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Update a template
Body
namestringsubjectstringbodystringpreheaderstringif_versionintegerrequiredRequired optimistic concurrency token. Use the current template.version. A stale value returns 409 with current_version and expected_version.
from_namestringfrom_emailstring<email>reply_tostring<email>generation_provenanceGenerationProvenanceCandidate-bound generation evidence. Save endpoints accept only
state: candidate values returned by the generation endpoint. Resource
responses may return state: accepted as read-only history.
designEmailDesignEmail template design document
Parameters
idintegerrequiredpathResponse
Updated template
Template version conflict
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"if_version": 0,
"from_name": "string",
"from_email": "user@example.com",
"reply_to": "user@example.com",
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"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",
"if_version": 0,
"from_name": "string",
"from_email": "user@example.com",
"reply_to": "user@example.com",
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
}
}),
});
const data = await response.json();import requests
payload = {
"name": "string",
"subject": "string",
"body": "string",
"preheader": "string",
"if_version": 0,
"from_name": "string",
"from_email": "user@example.com",
"reply_to": "user@example.com",
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": True,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"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",
"if_version": 0,
"from_name": "string",
"from_email": "user@example.com",
"reply_to": "user@example.com",
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
}
}{
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"variables": {},
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Render an existing template to HTML
Renders the template through the shared preview renderer.
Parameters
idintegerrequiredpathResponse
Rendered HTML
Resource not found
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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}/render'const response = await fetch('https://api.nitrosend.com/v1/my/templates/{id}/render', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/templates/{id}/render')
data = response.json(){
"html": "string",
"accessibility": {
"valid": true,
"warnings": [
{
"level": "warning",
"rule": "image_alt_text",
"message": "string",
"suggested_fix": "string",
"count": 0,
"min_ratio": 0
}
]
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"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 sample_contact_id to personalize an
explicit test recipient without sending to the contact. contact_id
and sample_contact_id are mutually exclusive. Omit all recipient
inputs to use the brand's saved test recipients, falling back to the
account owner.
Test emails go to the account's own people (owner, members, an active
managing account's people) and to addresses at the account's verified
domains. Up to 10 other addresses per 30 days are allowed; past that,
each refused recipient is reported in results with status: failed
and the reason in error, and the other recipients still receive the
test.
Supply one fresh Idempotency-Key for each user-initiated send and
reuse that exact key for transport retries.
Body
emailstring | Array<string>emailsArray<string>send_test_toArray<string>contact_idintegersample_contact_idintegerContact whose projected data personalizes the test without changing the test recipient.
Parameters
idintegerrequiredpathIdempotency-KeystringrequiredheaderResponse
Test email sent
Resource not found
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"emails": [
"user@example.com"
],
"send_test_to": [
"user@example.com"
],
"contact_id": 0,
"sample_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",
"emails": [
"user@example.com"
],
"send_test_to": [
"user@example.com"
],
"contact_id": 0,
"sample_contact_id": 0
}),
});
const data = await response.json();import requests
payload = {
"email": "user@example.com",
"emails": [
"user@example.com"
],
"send_test_to": [
"user@example.com"
],
"contact_id": 0,
"sample_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",
"emails": [
"user@example.com"
],
"send_test_to": [
"user@example.com"
],
"contact_id": 0,
"sample_contact_id": 0
}{
"sent": 0,
"results": [
{
"email": "string",
"success": true,
"status": "delivered",
"code": "string",
"error": "string",
"message_id": 0
}
]
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Render an email design to HTML
Body
documentEmailDesignrequiredEmail template design document
Response
Rendered HTML
Bad request
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"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": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
}
}),
});
const data = await response.json();import requests
payload = {
"document": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": True,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
}
}
response = requests.post('https://api.nitrosend.com/v1/my/templates/preview', json=payload)
data = response.json(){
"document": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
}
}{
"html": "string",
"accessibility": {
"valid": true,
"warnings": [
{
"level": "warning",
"rule": "image_alt_text",
"message": "string",
"suggested_fix": "string",
"count": 0,
"min_ratio": 0
}
]
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}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)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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": {}
}
],
"style_attributes": [
{
"key": "string",
"label": "string",
"type": "color",
"theme_fallback": "string",
"description": "string",
"min": 0,
"max": 0,
"values": [
"string"
],
"target": {
"el": "section",
"attr": "string"
}
}
],
"preview_document": {
"parameter": "string",
"description": "string",
"example": {}
},
"variables": {},
"filters": [
{
"name": "string",
"syntax": "string",
"description": "string"
}
],
"theme_attributes": [
{
"key": "string",
"label": "string",
"type": "color",
"category": "color",
"slot": "string",
"surfaces": [
"string"
],
"min": 0,
"max": 0,
"values": [
"string"
],
"options": [
{
"value": "string",
"label": "string",
"description": "string"
}
],
"transform_table": {},
"column": true,
"storage": "string",
"placeholder": "string",
"value_resolver": "string",
"server_owned": true,
"description": "string"
}
]
}List the system template library
Returns the curated system template catalog. Each template ships two
faces: its original art direction (design/preview_html) and a
brand-matched variant with the palette overrides stripped so the
account's colors flow in (branded_design/branded_preview_html).
Sourced from the canonical catalog in config/email_templates/,
ordered by config/email_templates/index.yml.
Response
Library templates with original and brand-matched variants
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/library'const response = await fetch('https://api.nitrosend.com/v1/my/templates/library', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/templates/library')
data = response.json()[
{
"id": "string",
"name": "string",
"category": "string",
"tags": [
"string"
],
"description": "string",
"subject": "string",
"preheader": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"preview_html": "string",
"branded_design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"branded_preview_html": "string"
}
]AI-generate an email draft
Generate, regenerate, or refine a complete template, campaign-email, or selected flow-email draft through the same authoring spine. This never persists or sends. A flow target addresses exactly one existing email action, never the whole flow. Reusing an idempotency key with changed authoring input returns a conflict.
Body
goalstringrequiredWhat the email should accomplish
operationstringgenerateregeneraterefinerequirededit_scopestringcopydesignbothDefaults to copy for refine and both otherwise.
user_instructionstringcategorystringOptional category hint (welcome, newsletter, promotion, etc.)
tonestringOptional tone override (formal, casual, etc.)
current_draftobject | objectrequiredComplete unsaved editor state to generate or refine.
authoring_targetobject | object | objectrequiredParameters
Idempotency-KeystringrequiredheaderRetry-stable identity for this generation request.
Response
Generated email design
Invalid authoring request
Generation or template version conflict
Validation error
Rate limit exceeded
Generation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"operation": "generate",
"edit_scope": "copy",
"user_instruction": "string",
"category": "string",
"tone": "string",
"current_draft": {
"subject": "string",
"preheader": "string",
"body": "string",
"plain_text_mode": "derived",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 0,
"theme": {},
"sections": [
{}
]
}
},
"authoring_target": {
"surface": "template",
"template_id": 1,
"if_version": 1
}
}'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",
"operation": "generate",
"edit_scope": "copy",
"user_instruction": "string",
"category": "string",
"tone": "string",
"current_draft": {
"subject": "string",
"preheader": "string",
"body": "string",
"plain_text_mode": "derived",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 0,
"theme": {},
"sections": [
{}
]
}
},
"authoring_target": {
"surface": "template",
"template_id": 1,
"if_version": 1
}
}),
});
const data = await response.json();import requests
payload = {
"goal": "Welcome new subscribers and introduce the brand",
"operation": "generate",
"edit_scope": "copy",
"user_instruction": "string",
"category": "string",
"tone": "string",
"current_draft": {
"subject": "string",
"preheader": "string",
"body": "string",
"plain_text_mode": "derived",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 0,
"theme": {},
"sections": [
{}
]
}
},
"authoring_target": {
"surface": "template",
"template_id": 1,
"if_version": 1
}
}
response = requests.post('https://api.nitrosend.com/v1/my/templates/generate', json=payload)
data = response.json(){
"goal": "Welcome new subscribers and introduce the brand",
"operation": "generate",
"edit_scope": "copy",
"user_instruction": "string",
"category": "string",
"tone": "string",
"current_draft": {
"subject": "string",
"preheader": "string",
"body": "string",
"plain_text_mode": "derived",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 0,
"theme": {},
"sections": [
{}
]
}
},
"authoring_target": {
"surface": "template",
"template_id": 1,
"if_version": 1
}
}{
"design": {},
"subject": "string",
"preheader": "string",
"body": "string",
"plain_text_mode": "derived",
"category": "string",
"prompt_version": "string",
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"knowledge_used": [
"string"
]
}{
"code": "idempotency_key_required",
"error_code": "idempotency_key_required",
"message": "string",
"error": true
}{
"code": "template_version_conflict",
"error_code": "template_version_conflict",
"message": "string",
"error": true
}{
"error": true,
"code": "ai_limit_reached",
"message": "Generation limit reached."
}{
"error": true,
"code": "brand_incomplete",
"message": "Complete brand setup first."
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"error": true,
"code": "generation_failed",
"message": "Generation failed. Try again."
}Flows
Automation flows and step schema
Save an edited guest flow after sign-in
Copies an anonymous demo draft and its reviewed Brand Kit into the authenticated account. The guest token is scoped to one 24-hour demo; exact retries return the same flow. The copied flow remains a draft and does not send until separately approved and activated.
Body
tokenstringrequirednamestringgraphobjectrequiredParameters
Idempotency-KeystringrequiredheaderResponse
Claimed draft flow and target Brand
The same demo was claimed with different input or by another account
Expired demo, invalid graph, or Brand limit reached
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/flow_demo/claim' \
-H 'Content-Type: application/json' \
-d '{
"token": "string",
"name": "string",
"graph": {
"trigger": {},
"steps": [
{}
]
}
}'const response = await fetch('https://api.nitrosend.com/v1/my/flow_demo/claim', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"token": "string",
"name": "string",
"graph": {
"trigger": {},
"steps": [
{}
]
}
}),
});
const data = await response.json();import requests
payload = {
"token": "string",
"name": "string",
"graph": {
"trigger": {},
"steps": [
{}
]
}
}
response = requests.post('https://api.nitrosend.com/v1/my/flow_demo/claim', json=payload)
data = response.json(){
"token": "string",
"name": "string",
"graph": {
"trigger": {},
"steps": [
{}
]
}
}{
"flow_id": 0,
"brand_sid": "string"
}List automation flows (paginated)
Returns standalone flows only (excludes campaign-attached flows).
Parameters
pageinteger1querylimitinteger<= 10025queryResponse
Paginated flows
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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
Creates a draft flow without delivery authority. Idempotency-Key is required; an exact retry returns the original flow, while reuse with changed input returns 409. Approve or activate in a separate request.
Body
namestringrequiredtriggerFlowTriggerInputstepsArray<FlowStepInput>Parameters
Idempotency-KeystringrequiredheaderResponse
Exact idempotent replay of an existing flow
Flow created
Bad request
Idempotency-Key reused with changed input
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"trigger": {
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"exclude_segment_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",
"trigger": {
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"exclude_segment_ids": [
0
],
"data": {}
},
"steps": []
}),
});
const data = await response.json();import requests
payload = {
"name": "string",
"trigger": {
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"exclude_segment_ids": [
0
],
"data": {}
},
"steps": []
}
response = requests.post('https://api.nitrosend.com/v1/my/flows', json=payload)
data = response.json(){
"name": "string",
"trigger": {
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"exclude_segment_ids": [
0
],
"data": {}
},
"steps": []
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Get a flow
Parameters
idintegerrequiredpathResponse
Flow with full graph
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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(){
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Delete a flow
Parameters
idintegerrequiredpathResponse
Deleted flow
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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
Authoring (name, trigger, steps, generation_provenance) and
delivery control (status, approval_state) are separate requests and
must not be mixed. For graph writes, pass expected_draft_revision_id
from the latest flow read to reject stale authored changes. Flow
approval/rejection and status: live publication from a draft flow
derive the current draft when revision_id is omitted. When supplied,
revision_id asserts that the named revision is still the current
draft; a stale assertion returns 409. On an already-live flow,
status: live without revision_id is a status no-op and does not
publish pending changes. Restarting a paused flow with contacts already
in progress requires resume_mode. A plain restart is refused when the
flow has unpublished changes; supply the current draft revision to
publish those changes as part of the restart.
Body
namestringstatusstringdraftlivepausedarchivedcancelledapproval_statestringapprovedrejectedrevision_idinteger | nullOptional current-draft assertion for approval_state and status=live publication. Omission derives the current draft for approval_state and for publication from draft status. On an already-live flow, status=live without revision_id is a no-op. Supply the current draft revision to publish pending changes while restarting a paused flow.
resume_modestringnew_contacts_onlycontinue_existingRequired when restarting a paused flow with contacts in progress. new_contacts_only stops their current journeys. continue_existing restarts waits and releases next steps gradually.
expected_draft_revision_idinteger | nullExact optimistic concurrency token for authored graph changes.
updated_atstring<date-time>Optimistic concurrency check
triggerFlowTriggerInputstepsArray<FlowStepInput>generation_provenanceGenerationProvenanceCandidate-bound generation evidence. Save endpoints accept only
state: candidate values returned by the generation endpoint. Resource
responses may return state: accepted as read-only history.
Parameters
idintegerrequiredpathResponse
Updated flow
Conflict — the authored draft or requested publication revision is stale
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"approval_state": "approved",
"revision_id": 0,
"resume_mode": "new_contacts_only",
"expected_draft_revision_id": 0,
"updated_at": "2024-01-15T09:30:00Z",
"trigger": {
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"exclude_segment_ids": [
0
],
"data": {}
},
"steps": [],
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
}
}'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",
"approval_state": "approved",
"revision_id": 0,
"resume_mode": "new_contacts_only",
"expected_draft_revision_id": 0,
"updated_at": "2024-01-15T09:30:00Z",
"trigger": {
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"exclude_segment_ids": [
0
],
"data": {}
},
"steps": [],
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
}
}),
});
const data = await response.json();import requests
payload = {
"name": "string",
"status": "draft",
"approval_state": "approved",
"revision_id": 0,
"resume_mode": "new_contacts_only",
"expected_draft_revision_id": 0,
"updated_at": "2024-01-15T09:30:00Z",
"trigger": {
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"exclude_segment_ids": [
0
],
"data": {}
},
"steps": [],
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
}
}
response = requests.patch('https://api.nitrosend.com/v1/my/flows/{id}', json=payload)
data = response.json(){
"name": "string",
"status": "draft",
"approval_state": "approved",
"revision_id": 0,
"resume_mode": "new_contacts_only",
"expected_draft_revision_id": 0,
"updated_at": "2024-01-15T09:30:00Z",
"trigger": {
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"exclude_segment_ids": [
0
],
"data": {}
},
"steps": [],
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Preview the choices for restarting a paused flow
Parameters
idintegerrequiredpathResponse
Current restart impact and available choices
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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}/resume_plan'const response = await fetch('https://api.nitrosend.com/v1/my/flows/{id}/resume_plan', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/flows/{id}/resume_plan')
data = response.json(){
"flow_id": 0,
"status": "draft",
"open_journey_count": 0,
"contact_count": 0,
"waiting_journey_count": 0,
"scheduled_journey_count": 0,
"has_unpublished_changes": true,
"draft_approval_state": "pending_review",
"requires_choice": true,
"allowed_modes": [
"new_contacts_only"
],
"recommended_mode": "new_contacts_only",
"continue_release_interval_seconds": 1
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Get the flow step type schema
Returns the schema for flow step types, trigger events, and
audience filters. Flow steps and triggers are sourced from
config/flows.yml; filters are sourced from the audience filter
registry with lifecycle_flows added from the canonical lifecycle
catalog.
Response
Flow specification
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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": {}
}
],
"lifecycle_flows": [
{
"id": "string",
"key": "string",
"goal": "string",
"name": "string",
"description": "string",
"priority": 0,
"trigger": {
"event": "string"
},
"trigger_needs": "string",
"steps": [
{
"type": "string",
"duration": 0,
"subject": "string",
"preheader": "string",
"body": "string",
"design": {}
}
]
}
]
}List flow templates
Returns all available flow templates (static, global — not account-scoped).
Each entry includes lean card data and preview_sections from the first email step.
Response
List of flow templates
Not authenticated
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/flow_templates'const response = await fetch('https://api.nitrosend.com/v1/my/flow_templates', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/flow_templates')
data = response.json()[
{
"id": "string",
"type_label": "string",
"description": "string",
"category": "string",
"email_count": 0,
"step_count": 0,
"preview_sections": [
{}
]
}
]{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Get a flow template
Returns a single flow template including the full trigger and steps
graph, ready to pass directly to POST /v1/my/flows.
Parameters
idstringrequiredpathFlow template slug (e.g. welcome_series)
Response
Flow template with full graph
Not authenticated
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/flow_templates/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/flow_templates/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/flow_templates/{id}')
data = response.json(){
"id": "string",
"type_label": "string",
"description": "string",
"category": "string",
"email_count": 0,
"step_count": 0,
"preview_sections": [
{}
],
"trigger": {},
"steps": [
{}
]
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Mail Action Protocol
Authenticated MAP Content Review descriptions, execution, and result recovery
Describe Content Review for the current flow revision
Parameters
flow_idintegerrequiredpathResponse
The MAP 0.2 Content Review 0.3 description of the current immutable draft revision
Not authenticated
Resource not found
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/map/flows/{flow_id}/content-review'const response = await fetch('https://api.nitrosend.com/v1/my/map/flows/{flow_id}/content-review', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/map/flows/{flow_id}/content-review')
data = response.json(){
"@context": "https://mailschema.org/contexts/map-0.2.jsonld",
"@type": "MailAction",
"@id": "https://example.com",
"profile": "https://mailschema.org/profiles/map/0.2",
"type": {
"id": "https://example.com",
"version": "string",
"contractDigest": "string"
},
"describedAt": "2024-01-15T09:30:00Z",
"expiresAt": "2024-01-15T09:30:00Z",
"service": {
"id": "https://example.com",
"name": "string",
"authority": "credential",
"resource": "https://example.com",
"execution": {
"url": "https://example.com",
"resultUrlTemplate": "string",
"resultRetentionSeconds": 300
},
"humanUrl": "https://example.com"
},
"recipient": "user@example.com",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"details": {},
"operations": [
{
"id": "string",
"name": "string",
"description": "string"
}
]
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}List recorded Content Review requests for a flow
Parameters
flow_idintegerrequiredpathResponse
Most recent durable review requests and results
Not authenticated
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/map/flows/{flow_id}/content-reviews'const response = await fetch('https://api.nitrosend.com/v1/my/map/flows/{flow_id}/content-reviews', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/map/flows/{flow_id}/content-reviews')
data = response.json()[
{
"request_id": "string",
"revision_id": 0,
"operation": "request-changes",
"input": {},
"result": {
"kind": "MapResult",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"descriptionDigest": "string",
"type": {
"id": "https://example.com",
"version": "string",
"contractDigest": "string"
},
"operation": "request-changes",
"state": "accepted",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"recordedAt": "2024-01-15T09:30:00Z",
"resultUrl": "https://example.com",
"approvalUrl": "https://example.com",
"reason": "declined",
"output": {}
},
"recorded_at": "2024-01-15T09:30:00Z"
}
]{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Review one immutable flow revision named by a MAP description
Parameters
flow_idintegerrequiredpathrevision_idintegerrequiredpathResponse
The exact revision and its current approval state
Not authenticated
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/map/flows/{flow_id}/revisions/{revision_id}/review'const response = await fetch('https://api.nitrosend.com/v1/my/map/flows/{flow_id}/revisions/{revision_id}/review', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/map/flows/{flow_id}/revisions/{revision_id}/review')
data = response.json(){
"state": "approval-required",
"flow": {
"id": 0,
"name": "string"
},
"revision": {
"id": 0,
"digest": "string",
"approval_state": "pending_review",
"current": true,
"trigger": {
"event": "string"
},
"steps": [
{
"name": "string",
"type": "string",
"wait": 0,
"subject": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"html": "string"
}
]
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Protected resource metadata for the MAP API
OAuth 2.0 Protected Resource Metadata (RFC 9728) for the Mail Action
Protocol API. resource is the audience every MAP description names.
map_services lists the exact execution and result routes a client may
configure instead of trusting URLs from an email.
Response
Protected resource metadata
curl -X GET 'https://api.nitrosend.com/.well-known/oauth-protected-resource/v1/my/map'const response = await fetch('https://api.nitrosend.com/.well-known/oauth-protected-resource/v1/my/map', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/.well-known/oauth-protected-resource/v1/my/map')
data = response.json(){
"resource": "https://example.com",
"resource_name": "string",
"bearer_methods_supported": [
"header"
],
"map_services": [
{
"id": "https://example.com",
"profiles": [
"https://example.com"
],
"execution_url": "https://example.com",
"result_url_template": "string"
}
]
}Execute a MAP Content Review request
Parses the body as I-JSON, resolves the interaction from its identifier and compares the description digest, then authorizes the caller, checks the current flow revision and durably deduplicates requestId within the account. The credential travels only in the Authorization header. Other methods answer 405. A Content-Type other than application/json, compared case-insensitively, with at most a charset=utf-8 parameter, answers 415.
Body
A MAP 0.2 Content Review request. Its operation decides its input.
kindstringrequiredprofilestringrequiredrequestIdMailActionUuidUrnrequiredA UUID URN, as the MAP 0.2 core defines it.
interactionIdMailActionUuidUrnrequiredA UUID URN, as the MAP 0.2 core defines it.
descriptionDigeststringrequiredSHA-256 over the RFC 8785 canonical form of the description exactly as the email carried it.
typeMailActionTypeReferencerequiredkindstringrequiredprofilestringrequiredrequestIdMailActionUuidUrnrequiredA UUID URN, as the MAP 0.2 core defines it.
interactionIdMailActionUuidUrnrequiredA UUID URN, as the MAP 0.2 core defines it.
descriptionDigeststringrequiredSHA-256 over the RFC 8785 canonical form of the description exactly as the email carried it.
typeMailActionTypeReferencerequiredResponse
The review feedback or approval was recorded
The request was recorded and requires human approval
Invalid MAP or Content Review request. Malformed or non-I-JSON bodies, requests that fail the core request definition, unknown interactions and differing description digests have no MAP correlation members; invalid input is correlated and carries errors.
MAP request or result lookup without acceptable Nitrosend authentication
The authenticated principal cannot use this interaction or request identifier
Stale target, idempotency conflict, or an interaction another request already decided
Interaction and retained result expired
The Content-Type is not application/json with at most a charset=utf-8 parameter
Unsupported type or operation
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/map/actions' \
-H 'Content-Type: application/json' \
-d '{
"kind": "MapRequest",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"descriptionDigest": "string",
"type": {
"id": "https://example.com",
"version": "string",
"contractDigest": "string"
}
}'const response = await fetch('https://api.nitrosend.com/v1/my/map/actions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"kind": "MapRequest",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"descriptionDigest": "string",
"type": {
"id": "https://example.com",
"version": "string",
"contractDigest": "string"
}
}),
});
const data = await response.json();import requests
payload = {
"kind": "MapRequest",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"descriptionDigest": "string",
"type": {
"id": "https://example.com",
"version": "string",
"contractDigest": "string"
}
}
response = requests.post('https://api.nitrosend.com/v1/my/map/actions', json=payload)
data = response.json(){
"kind": "MapRequest",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"descriptionDigest": "string",
"type": {
"id": "https://example.com",
"version": "string",
"contractDigest": "string"
}
}{
"kind": "MapResult",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"descriptionDigest": "string",
"type": {
"id": "https://example.com",
"version": "string",
"contractDigest": "string"
},
"operation": "request-changes",
"state": "accepted",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"recordedAt": "2024-01-15T09:30:00Z",
"resultUrl": "https://example.com",
"approvalUrl": "https://example.com",
"reason": "declined",
"output": {}
}{
"kind": "MapResult",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"descriptionDigest": "string",
"type": {
"id": "https://example.com",
"version": "string",
"contractDigest": "string"
},
"operation": "request-changes",
"state": "accepted",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"recordedAt": "2024-01-15T09:30:00Z",
"resultUrl": "https://example.com",
"approvalUrl": "https://example.com",
"reason": "declined",
"output": {}
}{
"type": "https://example.com",
"title": "string",
"status": 400,
"detail": "string",
"instance": "https://example.com",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"code": "invalid-request",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"errors": [
{
"detail": "string",
"pointer": "string"
}
]
}{
"type": "https://example.com",
"title": "string",
"status": 400,
"detail": "string"
}{
"type": "https://example.com",
"title": "string",
"status": 400,
"detail": "string",
"instance": "https://example.com",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"code": "invalid-request",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"errors": [
{
"detail": "string",
"pointer": "string"
}
]
}{
"type": "https://example.com",
"title": "string",
"status": 400,
"detail": "string",
"instance": "https://example.com",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"code": "invalid-request",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"errors": [
{
"detail": "string",
"pointer": "string"
}
]
}{
"type": "https://example.com",
"title": "string",
"status": 400,
"detail": "string",
"instance": "https://example.com",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"code": "invalid-request",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"errors": [
{
"detail": "string",
"pointer": "string"
}
]
}{
"type": "about:blank",
"title": "string",
"status": 400
}{
"type": "https://example.com",
"title": "string",
"status": 400,
"detail": "string",
"instance": "https://example.com",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"code": "invalid-request",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"errors": [
{
"detail": "string",
"pointer": "string"
}
]
}Recover the latest authorized MAP result
Returns the latest response recorded for the request, after rechecking access and settling an approval whose deadline has passed: a result, or the correlated problem the request earned.
Parameters
request_idMailActionUuidUrnrequiredpathResponse
Latest retained result
Latest retained result, still awaiting human approval
The recorded invalid-request problem, with its input errors
MAP request or result lookup without acceptable Nitrosend authentication
Result access refused
No retained result in the authenticated scope, as a correlated result-not-found problem. A path whose identifier is not a UUID URN names no result resource and gets a plain 404.
The recorded stale-target or already-decided problem
The recorded expired-interaction problem
The recorded unsupported-type or unsupported-operation problem
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/map/results/{request_id}'const response = await fetch('https://api.nitrosend.com/v1/my/map/results/{request_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/map/results/{request_id}')
data = response.json(){
"kind": "MapResult",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"descriptionDigest": "string",
"type": {
"id": "https://example.com",
"version": "string",
"contractDigest": "string"
},
"operation": "request-changes",
"state": "accepted",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"recordedAt": "2024-01-15T09:30:00Z",
"resultUrl": "https://example.com",
"approvalUrl": "https://example.com",
"reason": "declined",
"output": {}
}{
"kind": "MapResult",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"descriptionDigest": "string",
"type": {
"id": "https://example.com",
"version": "string",
"contractDigest": "string"
},
"operation": "request-changes",
"state": "accepted",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"recordedAt": "2024-01-15T09:30:00Z",
"resultUrl": "https://example.com",
"approvalUrl": "https://example.com",
"reason": "declined",
"output": {}
}{
"type": "https://example.com",
"title": "string",
"status": 400,
"detail": "string",
"instance": "https://example.com",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"code": "invalid-request",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"errors": [
{
"detail": "string",
"pointer": "string"
}
]
}{
"type": "https://example.com",
"title": "string",
"status": 400,
"detail": "string"
}{
"type": "https://example.com",
"title": "string",
"status": 400,
"detail": "string",
"instance": "https://example.com",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"code": "invalid-request",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"errors": [
{
"detail": "string",
"pointer": "string"
}
]
}{
"type": "https://mailschema.org/problems/result-not-found",
"title": "string",
"status": 404,
"detail": "string",
"instance": "https://example.com",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"code": "result-not-found"
}{
"type": "https://example.com",
"title": "string",
"status": 400,
"detail": "string",
"instance": "https://example.com",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"code": "invalid-request",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"errors": [
{
"detail": "string",
"pointer": "string"
}
]
}{
"type": "https://example.com",
"title": "string",
"status": 400,
"detail": "string",
"instance": "https://example.com",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"code": "invalid-request",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"errors": [
{
"detail": "string",
"pointer": "string"
}
]
}{
"type": "https://example.com",
"title": "string",
"status": 400,
"detail": "string",
"instance": "https://example.com",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"code": "invalid-request",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"errors": [
{
"detail": "string",
"pointer": "string"
}
]
}Review an exact MAP Content Review approval request
Parameters
request_idMailActionUuidUrnrequiredpathResponse
The immutable flow revision and current decision state
Not authenticated
Not authorized
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/map/approvals/{request_id}'const response = await fetch('https://api.nitrosend.com/v1/my/map/approvals/{request_id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/map/approvals/{request_id}')
data = response.json(){
"request_id": "string",
"state": "approval-required",
"requested_at": "2024-01-15T09:30:00Z",
"flow": {
"id": 0,
"name": "string"
},
"revision": {
"id": 0,
"digest": "string",
"approval_state": "pending_review",
"current": true,
"trigger": {
"event": "string"
},
"steps": [
{
"name": "string",
"type": "string",
"wait": 0,
"subject": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"html": "string"
}
]
},
"result": {
"kind": "MapResult",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"descriptionDigest": "string",
"type": {
"id": "https://example.com",
"version": "string",
"contractDigest": "string"
},
"operation": "request-changes",
"state": "accepted",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"recordedAt": "2024-01-15T09:30:00Z",
"resultUrl": "https://example.com",
"approvalUrl": "https://example.com",
"reason": "declined",
"output": {}
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Approve or decline the exact flow revision in a retained MAP request
A decision takes a signed-in person's bearer credential. A browser cookie session is refused with 401, so no cross-site request can decide.
Body
decisionstringapprovedeclinerequiredParameters
request_idMailActionUuidUrnrequiredpathResponse
The retained MAP result reached its completed or failed terminal state
Bad request
Not authenticated
The caller cannot decide this request, or the service's content and sending rules refuse the approval (error_code: approval_refused). The retained result stays approval-required and can still be declined.
Resource not found
The request was not proposed for approval, so there is nothing to decide.
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/map/approvals/{request_id}' \
-H 'Content-Type: application/json' \
-d '{
"decision": "approve"
}'const response = await fetch('https://api.nitrosend.com/v1/my/map/approvals/{request_id}', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"decision": "approve"
}),
});
const data = await response.json();import requests
payload = {
"decision": "approve"
}
response = requests.post('https://api.nitrosend.com/v1/my/map/approvals/{request_id}', json=payload)
data = response.json(){
"decision": "approve"
}{
"request_id": "string",
"state": "approval-required",
"requested_at": "2024-01-15T09:30:00Z",
"flow": {
"id": 0,
"name": "string"
},
"revision": {
"id": 0,
"digest": "string",
"approval_state": "pending_review",
"current": true,
"trigger": {
"event": "string"
},
"steps": [
{
"name": "string",
"type": "string",
"wait": 0,
"subject": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"html": "string"
}
]
},
"result": {
"kind": "MapResult",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"descriptionDigest": "string",
"type": {
"id": "https://example.com",
"version": "string",
"contractDigest": "string"
},
"operation": "request-changes",
"state": "accepted",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"recordedAt": "2024-01-15T09:30:00Z",
"resultUrl": "https://example.com",
"approvalUrl": "https://example.com",
"reason": "declined",
"output": {}
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Events
Contact event tracking
List events (paginated)
Parameters
pageinteger1querylimitinteger<= 10050queryeventstringqueryFilter by event type
contact_idintegerquerycreated_afterstring<date-time>querycreated_beforestring<date-time>queryresource_uidstringqueryresource_namestringquerytestbooleanqueryResponse
Paginated events
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}List event names for filter autocomplete
Returns known platform event names plus observed event names for the current brand.
Response
Event name suggestions
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/names'const response = await fetch('https://api.nitrosend.com/v1/my/events/names', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/events/names')
data = response.json(){
"names": [
"string"
]
}Get an event
Parameters
idintegerrequiredpathResponse
Event
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Delete an event
Parameters
idintegerrequiredpathResponse
Deleted event
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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
pageinteger1queryperinteger<= 10030queryResponse
Paginated domains
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"default_from_domain": "string",
"sender_authorization_reason": "missing_sender_domain",
"integration_id": 0,
"status": "pending",
"dmarc_policy": "none",
"dmarc_recommended_policy": "none",
"dmarc_observed_policy": "none",
"dns_records": {
"sending_dns_records": [
{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}
],
"receiving_dns_records": [
{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}
]
},
"inbound_setup": {
"method": "none",
"status": "not_configured",
"mx_scope": "apex",
"inbox": {
"id": 0,
"address": "user@example.com",
"display_name": "string",
"status": "active"
},
"provider_forwarding": {
"provider": "google_workspace",
"forwarding_address": "user@example.com",
"probe_sent_at": "2024-01-15T09:30:00Z",
"verified_at": "2024-01-15T09:30:00Z"
},
"apex_mx": {
"mode": "standalone",
"preparation": {
"state": "queued",
"message": "string",
"failure_code": "string"
},
"prepared": true,
"configured": true,
"approval_required": true,
"approval_expires_at": "2024-01-15T09:30:00Z",
"legacy_provider_label": "string",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "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)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"default_from_domain": "string",
"sender_authorization_reason": "missing_sender_domain",
"integration_id": 0,
"status": "pending",
"dmarc_policy": "none",
"dmarc_recommended_policy": "none",
"dmarc_observed_policy": "none",
"dns_records": {
"sending_dns_records": [
{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}
],
"receiving_dns_records": [
{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}
]
},
"inbound_setup": {
"method": "none",
"status": "not_configured",
"mx_scope": "apex",
"inbox": {
"id": 0,
"address": "user@example.com",
"display_name": "string",
"status": "active"
},
"provider_forwarding": {
"provider": "google_workspace",
"forwarding_address": "user@example.com",
"probe_sent_at": "2024-01-15T09:30:00Z",
"verified_at": "2024-01-15T09:30:00Z"
},
"apex_mx": {
"mode": "standalone",
"preparation": {
"state": "queued",
"message": "string",
"failure_code": "string"
},
"prepared": true,
"configured": true,
"approval_required": true,
"approval_expires_at": "2024-01-15T09:30:00Z",
"legacy_provider_label": "string",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
},
"dns_health": {},
"dns_setup_status": "unchecked",
"verified_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Get a domain with DNS records and status
Parameters
idintegerrequiredpathResponse
Domain
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"default_from_domain": "string",
"sender_authorization_reason": "missing_sender_domain",
"integration_id": 0,
"status": "pending",
"dmarc_policy": "none",
"dmarc_recommended_policy": "none",
"dmarc_observed_policy": "none",
"dns_records": {
"sending_dns_records": [
{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}
],
"receiving_dns_records": [
{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}
]
},
"inbound_setup": {
"method": "none",
"status": "not_configured",
"mx_scope": "apex",
"inbox": {
"id": 0,
"address": "user@example.com",
"display_name": "string",
"status": "active"
},
"provider_forwarding": {
"provider": "google_workspace",
"forwarding_address": "user@example.com",
"probe_sent_at": "2024-01-15T09:30:00Z",
"verified_at": "2024-01-15T09:30:00Z"
},
"apex_mx": {
"mode": "standalone",
"preparation": {
"state": "queued",
"message": "string",
"failure_code": "string"
},
"prepared": true,
"configured": true,
"approval_required": true,
"approval_expires_at": "2024-01-15T09:30:00Z",
"legacy_provider_label": "string",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
},
"dns_health": {},
"dns_setup_status": "unchecked",
"verified_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Remove a sending domain
A paired domain first returns 422 with the exact counterpart impact.
Repeat with unpair=true only after the user confirms that outcome.
Parameters
idintegerrequiredpathunpairbooleanfalsequeryConfirm teardown of an identity pair after reviewing the paired-domain 422 response.
Response
Domain deleted
Domain is paired or still has dependent inboxes
Upstream service unavailable
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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(){
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"reason": "domain_paired",
"domain_id": 0,
"paired_with": "string",
"counterpart_removed": true
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}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)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"default_from_domain": "string",
"sender_authorization_reason": "missing_sender_domain",
"integration_id": 0,
"status": "pending",
"dmarc_policy": "none",
"dmarc_recommended_policy": "none",
"dmarc_observed_policy": "none",
"dns_records": {
"sending_dns_records": [
{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}
],
"receiving_dns_records": [
{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}
]
},
"inbound_setup": {
"method": "none",
"status": "not_configured",
"mx_scope": "apex",
"inbox": {
"id": 0,
"address": "user@example.com",
"display_name": "string",
"status": "active"
},
"provider_forwarding": {
"provider": "google_workspace",
"forwarding_address": "user@example.com",
"probe_sent_at": "2024-01-15T09:30:00Z",
"verified_at": "2024-01-15T09:30:00Z"
},
"apex_mx": {
"mode": "standalone",
"preparation": {
"state": "queued",
"message": "string",
"failure_code": "string"
},
"prepared": true,
"configured": true,
"approval_required": true,
"approval_expires_at": "2024-01-15T09:30:00Z",
"legacy_provider_label": "string",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "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 domain DNS setup
Returns a short-lived Entri JWT plus the DNS record payload needed to launch the Entri modal for a domain owned by the current brand. An already-verified apex may request the prepared company-inbox MX cutover only with explicit approval and an exact domain-name confirmation.
Body
apex_mx_overridebooleanfalseExplicitly include the prepared company-inbox MX cutover in this session.
apex_mx_confirmationstringExact apex domain name being approved. Required when apex_mx_override is true.
Parameters
idintegerrequiredpathResponse
Entri bootstrap payload
Resource not found
Domain setup or apex mail cutover is not ready
Rate limit exceeded
Upstream service unavailable
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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' \
-H 'Content-Type: application/json' \
-d '{
"apex_mx_override": false,
"apex_mx_confirmation": "string"
}'const response = await fetch('https://api.nitrosend.com/v1/my/domains/{id}/entri_session', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"apex_mx_override": false,
"apex_mx_confirmation": "string"
}),
});
const data = await response.json();import requests
payload = {
"apex_mx_override": False,
"apex_mx_confirmation": "string"
}
response = requests.post('https://api.nitrosend.com/v1/my/domains/{id}/entri_session', json=payload)
data = response.json(){
"apex_mx_override": false,
"apex_mx_confirmation": "string"
}{
"domain": {
"id": 0,
"brand_id": 0,
"name": "string",
"provider": "ses",
"default_from_domain": "string",
"sender_authorization_reason": "missing_sender_domain",
"integration_id": 0,
"status": "pending",
"dmarc_policy": "none",
"dmarc_recommended_policy": "none",
"dmarc_observed_policy": "none",
"dns_records": {
"sending_dns_records": [
{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}
],
"receiving_dns_records": [
{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}
]
},
"inbound_setup": {
"method": "none",
"status": "not_configured",
"mx_scope": "apex",
"inbox": {
"id": 0,
"address": "user@example.com",
"display_name": "string",
"status": "active"
},
"provider_forwarding": {
"provider": "google_workspace",
"forwarding_address": "user@example.com",
"probe_sent_at": "2024-01-15T09:30:00Z",
"verified_at": "2024-01-15T09:30:00Z"
},
"apex_mx": {
"mode": "standalone",
"preparation": {
"state": "queued",
"message": "string",
"failure_code": "string"
},
"prepared": true,
"configured": true,
"approval_required": true,
"approval_expires_at": "2024-01-15T09:30:00Z",
"legacy_provider_label": "string",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
},
"dns_health": {},
"dns_setup_status": "unchecked",
"verified_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
},
"entri": {
"application_id": "string",
"token": "string",
"prefilled_domain": "string",
"user_id": "string",
"dns_records": [
{
"type": "string",
"host": "string",
"value": "string",
"ttl": 0,
"priority": 0
}
],
"manual_dns_records": {
"sending_dns_records": [
{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}
],
"receiving_dns_records": [
{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}
]
}
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"blockers": [
"string"
]
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Configure inbound delivery for a verified domain
Selects exactly one inbound method for the current brand's verified domain. Provider forwarding keeps Google Workspace or Microsoft 365 as the primary receiver and allocates one opaque Nitrosend forwarding address. MX mode requires the domain to be ready for Nitrosend receiving; apex domains additionally require a verified forward-all route.
Body
inbound_setupobjectrequiredParameters
idintegerrequiredpathResponse
Updated domain and inbound setup state
Not authorized
Resource not found
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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 PUT 'https://api.nitrosend.com/v1/my/domains/{id}/inbound_setup' \
-H 'Content-Type: application/json' \
-d '{
"inbound_setup": {
"method": "provider_forwarding",
"provider": "google_workspace",
"local_part": "string",
"display_name": "string",
"prepare": false,
"no_existing_mail_service": false
}
}'const response = await fetch('https://api.nitrosend.com/v1/my/domains/{id}/inbound_setup', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"inbound_setup": {
"method": "provider_forwarding",
"provider": "google_workspace",
"local_part": "string",
"display_name": "string",
"prepare": false,
"no_existing_mail_service": false
}
}),
});
const data = await response.json();import requests
payload = {
"inbound_setup": {
"method": "provider_forwarding",
"provider": "google_workspace",
"local_part": "string",
"display_name": "string",
"prepare": False,
"no_existing_mail_service": False
}
}
response = requests.put('https://api.nitrosend.com/v1/my/domains/{id}/inbound_setup', json=payload)
data = response.json(){
"inbound_setup": {
"method": "provider_forwarding",
"provider": "google_workspace",
"local_part": "string",
"display_name": "string",
"prepare": false,
"no_existing_mail_service": false
}
}{
"id": 0,
"brand_id": 0,
"name": "string",
"provider": "ses",
"default_from_domain": "string",
"sender_authorization_reason": "missing_sender_domain",
"integration_id": 0,
"status": "pending",
"dmarc_policy": "none",
"dmarc_recommended_policy": "none",
"dmarc_observed_policy": "none",
"dns_records": {
"sending_dns_records": [
{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}
],
"receiving_dns_records": [
{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}
]
},
"inbound_setup": {
"method": "none",
"status": "not_configured",
"mx_scope": "apex",
"inbox": {
"id": 0,
"address": "user@example.com",
"display_name": "string",
"status": "active"
},
"provider_forwarding": {
"provider": "google_workspace",
"forwarding_address": "user@example.com",
"probe_sent_at": "2024-01-15T09:30:00Z",
"verified_at": "2024-01-15T09:30:00Z"
},
"apex_mx": {
"mode": "standalone",
"preparation": {
"state": "queued",
"message": "string",
"failure_code": "string"
},
"prepared": true,
"configured": true,
"approval_required": true,
"approval_expires_at": "2024-01-15T09:30:00Z",
"legacy_provider_label": "string",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
},
"dns_health": {},
"dns_setup_status": "unchecked",
"verified_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Verify provider forwarding for a domain inbox
Sends a challenge to the configured customer-facing inbox address. The provider-forwarded copy must return through its bound opaque Nitrosend address before the setup becomes active.
Parameters
idintegerrequiredpathResponse
Domain with refreshed forwarding probe state
Not authorized
Resource not found
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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}/inbound_setup/probe'const response = await fetch('https://api.nitrosend.com/v1/my/domains/{id}/inbound_setup/probe', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.nitrosend.com/v1/my/domains/{id}/inbound_setup/probe')
data = response.json(){
"id": 0,
"brand_id": 0,
"name": "string",
"provider": "ses",
"default_from_domain": "string",
"sender_authorization_reason": "missing_sender_domain",
"integration_id": 0,
"status": "pending",
"dmarc_policy": "none",
"dmarc_recommended_policy": "none",
"dmarc_observed_policy": "none",
"dns_records": {
"sending_dns_records": [
{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}
],
"receiving_dns_records": [
{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}
]
},
"inbound_setup": {
"method": "none",
"status": "not_configured",
"mx_scope": "apex",
"inbox": {
"id": 0,
"address": "user@example.com",
"display_name": "string",
"status": "active"
},
"provider_forwarding": {
"provider": "google_workspace",
"forwarding_address": "user@example.com",
"probe_sent_at": "2024-01-15T09:30:00Z",
"verified_at": "2024-01-15T09:30:00Z"
},
"apex_mx": {
"mode": "standalone",
"preparation": {
"state": "queued",
"message": "string",
"failure_code": "string"
},
"prepared": true,
"configured": true,
"approval_required": true,
"approval_expires_at": "2024-01-15T09:30:00Z",
"legacy_provider_label": "string",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
},
"dns_health": {},
"dns_setup_status": "unchecked",
"verified_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Integrations
BYO provider integration management
List integrations (paginated)
Parameters
categorystringemailsmscrmquerypageinteger1queryperinteger<= 10030queryResponse
Paginated integrations
Bad request
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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"
}
]{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Create or connect an email provider integration
Body
integrationMailgunIntegrationInput | SesIntegrationInput | PostmarkIntegrationInput | ResendIntegrationInput | SendgridIntegrationInputrequiredResponse
Integration created
Bad request
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Get an integration
Parameters
idintegerrequiredpathResponse
Integration
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Disconnect and delete an integration
Parameters
idintegerrequiredpathconfirmbooleanrequiredqueryMust be true to confirm the destructive action.
Response
Integration deleted
Bad request
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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(){
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}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
integrationMailgunIntegrationInput | SesIntegrationInput | PostmarkIntegrationInput | ResendIntegrationInput | SendgridIntegrationInputrequiredParameters
idintegerrequiredpathResponse
Integration updated
Bad request
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Test integration connectivity
Parameters
idintegerrequiredpathResponse
Tested integration
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Set an integration as the primary provider for its category
Parameters
idintegerrequiredpathResponse
Integration marked primary
Bad request
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Get an integration's versioned profile sync contract
Parameters
integration_idintegerrequiredpathResponse
Safe sync configuration
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/{integration_id}/sync_configuration'const response = await fetch('https://api.nitrosend.com/v1/my/integrations/{integration_id}/sync_configuration', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/integrations/{integration_id}/sync_configuration')
data = response.json(){
"integration_id": 0,
"provider": "string",
"sync_contract": {
"version": 1,
"mirror_lists": true,
"updated_at": "2024-01-15T09:30:00Z",
"objects": [
{
"object_id": "string",
"object_slug": "string",
"label": "string",
"mode": "addressable",
"enabled": true,
"field_policy": "all_supported",
"selected_fields": [
"string"
],
"excluded_fields": [
"string"
],
"relationship": {
"attribute_slug": "string",
"target_object_slug": "people"
},
"trait_mapping": {
"kind": "deal_pipeline",
"stage_attribute": "string",
"closed_stage_values": [
"string"
],
"amount_attribute": "string",
"currency_attribute": "string"
},
"managed_audience_mapping_key": "string",
"mirror_lists": true
}
]
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Validate and update an integration's profile sync contract
Body
sync_contractIntegrationSyncContractrequiredParameters
integration_idintegerrequiredpathconfirm_deselectionbooleanfalsequeryResponse
Updated safe sync configuration
Resource not found
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/{integration_id}/sync_configuration' \
-H 'Content-Type: application/json' \
-d '{
"sync_contract": {
"version": 1,
"mirror_lists": true,
"updated_at": "2024-01-15T09:30:00Z",
"objects": [
{
"object_id": "string",
"object_slug": "string",
"label": "string",
"mode": "addressable",
"enabled": true,
"field_policy": "all_supported",
"selected_fields": [
"string"
],
"excluded_fields": [
"string"
],
"relationship": {
"attribute_slug": "string",
"target_object_slug": "people"
},
"trait_mapping": {
"kind": "deal_pipeline",
"stage_attribute": "string",
"closed_stage_values": [
"string"
],
"amount_attribute": "string",
"currency_attribute": "string"
},
"managed_audience_mapping_key": "string",
"mirror_lists": true
}
]
}
}'const response = await fetch('https://api.nitrosend.com/v1/my/integrations/{integration_id}/sync_configuration', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"sync_contract": {
"version": 1,
"mirror_lists": true,
"updated_at": "2024-01-15T09:30:00Z",
"objects": [
{
"object_id": "string",
"object_slug": "string",
"label": "string",
"mode": "addressable",
"enabled": true,
"field_policy": "all_supported",
"selected_fields": [
"string"
],
"excluded_fields": [
"string"
],
"relationship": {
"attribute_slug": "string",
"target_object_slug": "people"
},
"trait_mapping": {
"kind": "deal_pipeline",
"stage_attribute": "string",
"closed_stage_values": [
"string"
],
"amount_attribute": "string",
"currency_attribute": "string"
},
"managed_audience_mapping_key": "string",
"mirror_lists": true
}
]
}
}),
});
const data = await response.json();import requests
payload = {
"sync_contract": {
"version": 1,
"mirror_lists": True,
"updated_at": "2024-01-15T09:30:00Z",
"objects": [
{
"object_id": "string",
"object_slug": "string",
"label": "string",
"mode": "addressable",
"enabled": True,
"field_policy": "all_supported",
"selected_fields": [
"string"
],
"excluded_fields": [
"string"
],
"relationship": {
"attribute_slug": "string",
"target_object_slug": "people"
},
"trait_mapping": {
"kind": "deal_pipeline",
"stage_attribute": "string",
"closed_stage_values": [
"string"
],
"amount_attribute": "string",
"currency_attribute": "string"
},
"managed_audience_mapping_key": "string",
"mirror_lists": True
}
]
}
}
response = requests.patch('https://api.nitrosend.com/v1/my/integrations/{integration_id}/sync_configuration', json=payload)
data = response.json(){
"sync_contract": {
"version": 1,
"mirror_lists": true,
"updated_at": "2024-01-15T09:30:00Z",
"objects": [
{
"object_id": "string",
"object_slug": "string",
"label": "string",
"mode": "addressable",
"enabled": true,
"field_policy": "all_supported",
"selected_fields": [
"string"
],
"excluded_fields": [
"string"
],
"relationship": {
"attribute_slug": "string",
"target_object_slug": "people"
},
"trait_mapping": {
"kind": "deal_pipeline",
"stage_attribute": "string",
"closed_stage_values": [
"string"
],
"amount_attribute": "string",
"currency_attribute": "string"
},
"managed_audience_mapping_key": "string",
"mirror_lists": true
}
]
}
}{
"integration_id": 0,
"provider": "string",
"sync_contract": {
"version": 1,
"mirror_lists": true,
"updated_at": "2024-01-15T09:30:00Z",
"objects": [
{
"object_id": "string",
"object_slug": "string",
"label": "string",
"mode": "addressable",
"enabled": true,
"field_policy": "all_supported",
"selected_fields": [
"string"
],
"excluded_fields": [
"string"
],
"relationship": {
"attribute_slug": "string",
"target_object_slug": "people"
},
"trait_mapping": {
"kind": "deal_pipeline",
"stage_attribute": "string",
"closed_stage_values": [
"string"
],
"amount_attribute": "string",
"currency_attribute": "string"
},
"managed_audience_mapping_key": "string",
"mirror_lists": true
}
]
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Discover safe provider objects and attributes for profile sync
Parameters
integration_idintegerrequiredpathResponse
Sync configuration and bounded provider discovery metadata
Resource not found
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/{integration_id}/sync_configuration/discovery'const response = await fetch('https://api.nitrosend.com/v1/my/integrations/{integration_id}/sync_configuration/discovery', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/integrations/{integration_id}/sync_configuration/discovery')
data = response.json(){
"integration_id": 0,
"provider": "string",
"sync_contract": {
"version": 1,
"mirror_lists": true,
"updated_at": "2024-01-15T09:30:00Z",
"objects": [
{
"object_id": "string",
"object_slug": "string",
"label": "string",
"mode": "addressable",
"enabled": true,
"field_policy": "all_supported",
"selected_fields": [
"string"
],
"excluded_fields": [
"string"
],
"relationship": {
"attribute_slug": "string",
"target_object_slug": "people"
},
"trait_mapping": {
"kind": "deal_pipeline",
"stage_attribute": "string",
"closed_stage_values": [
"string"
],
"amount_attribute": "string",
"currency_attribute": "string"
},
"managed_audience_mapping_key": "string",
"mirror_lists": true
}
]
},
"discovery": {
"provider": "string",
"version": 1,
"truncated": true,
"objects": [
{
"object_id": "string",
"object_slug": "string",
"singular_noun": "string",
"plural_noun": "string",
"eligible": true,
"recommended_mode": "addressable",
"ineligible_reason": "string",
"attributes_truncated": true,
"attributes": [
{
"attribute_id": "string",
"attribute_slug": "string",
"title": "string",
"type": "string",
"classification": "canonical_scalar",
"required": true,
"unique": true,
"multiselect": true,
"target_object_slugs": [
"string"
],
"options": [
"string"
]
}
],
"relationship_attributes": [
{
"attribute_id": "string",
"attribute_slug": "string",
"title": "string",
"type": "string",
"classification": "canonical_scalar",
"required": true,
"unique": true,
"multiselect": true,
"target_object_slugs": [
"string"
],
"options": [
"string"
]
}
]
}
]
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}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)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Start HubSpot OAuth connect flow
Returns a HubSpot 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)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/hubspot/connect'const response = await fetch('https://api.nitrosend.com/v1/my/integrations/hubspot/connect', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.nitrosend.com/v1/my/integrations/hubspot/connect')
data = response.json(){
"authorize_url": "https://example.com"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Start Shopify OAuth connect flow
Returns a Shopify OAuth authorize URL for the authenticated account/brand.
The request accepts a myshopify.com shop domain or shop slug. The
response URL includes a signed state payload and the API callback URI.
Body
shopifyobjectrequiredResponse
OAuth authorize URL
Not authenticated
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/shopify/connect' \
-H 'Content-Type: application/json' \
-d '{
"shopify": {
"shop": "test-shop.myshopify.com"
}
}'const response = await fetch('https://api.nitrosend.com/v1/my/integrations/shopify/connect', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"shopify": {
"shop": "test-shop.myshopify.com"
}
}),
});
const data = await response.json();import requests
payload = {
"shopify": {
"shop": "test-shop.myshopify.com"
}
}
response = requests.post('https://api.nitrosend.com/v1/my/integrations/shopify/connect', json=payload)
data = response.json(){
"shopify": {
"shop": "test-shop.myshopify.com"
}
}{
"authorize_url": "https://example.com"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Connect a merchant-owned Shopify app
Connects an API-only Shopify app owned by the same Shopify organization as its store. Nitrosend exchanges the client credentials server-side, verifies the authenticated shop and granted Admin API scopes, then stores the access token and client secret encrypted. Repeating the request for the same brand and shop verifies the new credentials before replacing the current connection. The response never includes client credentials or an access token.
Body
shopifyobjectrequiredResponse
Existing merchant-managed Shopify connection replaced
Merchant-managed Shopify connection created
Not authenticated
Missing fields, invalid credentials, missing scopes, or a shop ownership conflict
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/shopify/credentials' \
-H 'Content-Type: application/json' \
-d '{
"shopify": {
"shop": "string",
"client_id": "string",
"client_secret": "********"
}
}'const response = await fetch('https://api.nitrosend.com/v1/my/integrations/shopify/credentials', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"shopify": {
"shop": "string",
"client_id": "string",
"client_secret": "********"
}
}),
});
const data = await response.json();import requests
payload = {
"shopify": {
"shop": "string",
"client_id": "string",
"client_secret": "********"
}
}
response = requests.post('https://api.nitrosend.com/v1/my/integrations/shopify/credentials', json=payload)
data = response.json(){
"shopify": {
"shop": "string",
"client_id": "string",
"client_secret": "********"
}
}{
"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"
}{
"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"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"missing_scopes": [
"read_customers"
],
"validation_errors": {}
}Start Stripe App OAuth connect flow
Returns the Nitrosend Stripe App install link for the authenticated
account and brand. The link carries a signed state and the API callback
URI; installing the app grants Nitrosend read access to customers,
subscriptions, invoices, charges, refunds and events. Pass mode: test
for the app's test-mode install link. No keys are pasted; tokens are
refreshed server-side. Events for connected accounts arrive on
/hooks/stripe_apps, isolated from Nitrosend billing webhooks at
/hooks/stripe.
Body
stripeobjectResponse
OAuth authorize URL
Not authenticated
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/stripe/connect' \
-H 'Content-Type: application/json' \
-d '{
"stripe": {
"mode": "live"
}
}'const response = await fetch('https://api.nitrosend.com/v1/my/integrations/stripe/connect', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"stripe": {
"mode": "live"
}
}),
});
const data = await response.json();import requests
payload = {
"stripe": {
"mode": "live"
}
}
response = requests.post('https://api.nitrosend.com/v1/my/integrations/stripe/connect', json=payload)
data = response.json(){
"stripe": {
"mode": "live"
}
}{
"authorize_url": "https://example.com"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Public Stripe App install entry
The Stripe App Marketplace install URL. Sets a nonce cookie and redirects to the Stripe App install link for the requested mode. The callback provisions a Nitrosend account for a new email, or asks an existing user to sign in and connect from the integrations page.
Parameters
modestringlivetestlivequeryResponse
Redirect to the Stripe App install link
The Stripe App is not configured
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/stripe/install'const response = await fetch('https://api.nitrosend.com/integrations/stripe/install', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/integrations/stripe/install')
data = response.json()Stripe App OAuth callback endpoint
Public callback endpoint used by Stripe after the app is installed. Verifies signed state, exchanges the auth code with the mode-matched developer key, persists the integration and enqueues initial sync. A signed-in connect renders the countdown page; the public install door redirects into the app (new account) or to sign in (existing account).
Parameters
codestringquerystatestringqueryerrorstringqueryerror_descriptionstringqueryResponse
OAuth callback processed (HTML)
Install door redirect into the app or to sign in
Invalid callback request
OAuth exchange failure
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/stripe/callback'const response = await fetch('https://api.nitrosend.com/integrations/stripe/callback', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/integrations/stripe/callback')
data = response.json()stringstringstringAttio 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)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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()stringstringstringHubSpot OAuth callback endpoint
Public callback endpoint used by HubSpot after user authorization. Verifies signed state, exchanges auth code, persists the integration, and enqueues initial sync.
Parameters
codestringquerystatestringqueryerrorstringqueryerror_descriptionstringqueryResponse
OAuth callback processed (HTML)
Invalid callback request
OAuth exchange failure
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/hubspot/callback'const response = await fetch('https://api.nitrosend.com/integrations/hubspot/callback', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/integrations/hubspot/callback')
data = response.json()stringstringstringShopify OAuth callback endpoint
Public callback endpoint used by Shopify after user authorization. Verifies signed state, resolves the Shopify app from that signed state, verifies the app-specific OAuth HMAC, exchanges the auth code, persists the integration and app key, and enqueues initial sync.
Parameters
codestringquerystatestringqueryshopstringqueryhmacstringquerytimestampstringqueryerrorstringqueryerror_descriptionstringqueryResponse
OAuth callback processed (HTML)
Invalid callback request
OAuth exchange failure
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/shopify/callback'const response = await fetch('https://api.nitrosend.com/integrations/shopify/callback', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/integrations/shopify/callback')
data = response.json()stringstringstringReceive a Stripe App event for a connected account
Events from every Stripe account that installed the Nitrosend app,
delivered to the platform's connected-account webhook endpoint. The
signature is verified with the app endpoint secret (live or test),
the connection is resolved from account and livemode, and the
event is processed on that integration's execution lane. Events for
accounts that are not connected are acknowledged and dropped.
Body
Parameters
Stripe-SignaturestringrequiredheaderResponse
Verified event acknowledged
Invalid signature or unconfigured secret
Verified event could not be enqueued
curl -X POST 'https://api.nitrosend.com/hooks/stripe_apps' \
-H 'Content-Type: application/json' \
-d '{}'const response = await fetch('https://api.nitrosend.com/hooks/stripe_apps', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
const data = await response.json();import requests
payload = {}
response = requests.post('https://api.nitrosend.com/hooks/stripe_apps', json=payload)
data = response.json(){}Receive an App Store Shopify webhook
Uses the App Store app credentials when no app key is present.
Body
Parameters
X-Shopify-Hmac-Sha256stringrequiredheaderX-Shopify-Shop-DomainstringrequiredheaderX-Shopify-TopicstringrequiredheaderResponse
Verified webhook acknowledged
Invalid JSON payload
Invalid App Store HMAC
Verified webhook could not be applied
curl -X POST 'https://api.nitrosend.com/hooks/shopify/events' \
-H 'Content-Type: application/json' \
-d '{}'const response = await fetch('https://api.nitrosend.com/hooks/shopify/events', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
const data = await response.json();import requests
payload = {}
response = requests.post('https://api.nitrosend.com/hooks/shopify/events', json=payload)
data = response.json(){}Receive a merchant-managed Shopify webhook
Resolves only active merchant-managed connections from the Shopify shop header and verifies the raw request body with that connection's encrypted client secret before parsing. Unknown shops, ambiguous ownership, missing secrets, and invalid signatures return the same response. Shopify Billing API topics are never processed on this route.
Body
Parameters
X-Shopify-Hmac-Sha256stringrequiredheaderX-Shopify-Shop-DomainstringrequiredheaderX-Shopify-TopicstringrequiredheaderX-Shopify-Webhook-IdstringheaderResponse
Verified supported webhook processed or unsupported topic safely acknowledged
Verified supported webhook contained invalid JSON
Webhook could not be authenticated
Verified webhook could not be applied
curl -X POST 'https://api.nitrosend.com/hooks/shopify/merchant/events' \
-H 'Content-Type: application/json' \
-d '{}'const response = await fetch('https://api.nitrosend.com/hooks/shopify/merchant/events', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
const data = await response.json();import requests
payload = {}
response = requests.post('https://api.nitrosend.com/hooks/shopify/merchant/events', json=payload)
data = response.json(){}Receive a Shopify webhook for a named app
Body
Parameters
app_keystringcustomrequiredpathX-Shopify-Hmac-Sha256stringrequiredheaderX-Shopify-Shop-DomainstringrequiredheaderX-Shopify-TopicstringrequiredheaderResponse
Verified webhook acknowledged
Invalid JSON payload
Invalid app-specific HMAC
Verified webhook could not be applied
curl -X POST 'https://api.nitrosend.com/hooks/shopify/events/{app_key}' \
-H 'Content-Type: application/json' \
-d '{}'const response = await fetch('https://api.nitrosend.com/hooks/shopify/events/{app_key}', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
const data = await response.json();import requests
payload = {}
response = requests.post('https://api.nitrosend.com/hooks/shopify/events/{app_key}', json=payload)
data = response.json(){}Open or resume the embedded Shopify app
Verifies the Shopify App Bridge ID token in the Authorization header, exchanges it for an offline Shopify access token when installation is required, and provisions or resumes the Nitrosend account integration. Subsequent embedded requests continue to authenticate with fresh Shopify ID tokens.
Response
Embedded Shopify integration opened
Not authenticated
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/integrations/shopify/session'const response = await fetch('https://api.nitrosend.com/integrations/shopify/session', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.nitrosend.com/integrations/shopify/session')
data = response.json(){
"integration_id": 0,
"manage_url": "https://example.com",
"requires_plan": true,
"redirect_to": "string"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Reconcile Shopify App Pricing after plan management
Parameters
shopstringrequiredqueryResponse
Redirect back to the app in Shopify Admin
Invalid Shopify shop domain
curl -X GET 'https://api.nitrosend.com/integrations/shopify/billing/callback'const response = await fetch('https://api.nitrosend.com/integrations/shopify/billing/callback', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/integrations/shopify/billing/callback')
data = response.json()Brands
Brand context plus Brand Kit identity, theme, and per-brand configuration
List brands (paginated)
Parameters
pageinteger1queryperinteger<= 100100queryResponse
All brands for the account
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"radius": 0,
"spacing_density": "compact",
"font_heading": "string",
"font_body": "string",
"heading_size": 12,
"body_size": 12,
"brand_document": "string",
"company_description": "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",
"from_email_domain_status": "blank",
"effective_from_email": "user@example.com",
"effective_reply_to": "user@example.com",
"effective_sending_domain": "string",
"effective_source_email": "user@example.com",
"sender_configured": true,
"email_view_online": true,
"email_track_opens": true,
"email_track_clicks": true,
"test_email_recipients": [
"user@example.com"
],
"onboarding_state": {},
"onboarding": {
"steps": {},
"progress": {
"completed": 0,
"total": 0
}
},
"domain_verified": true,
"can_send": true,
"brand_subdomain": {
"namespace_status": "unreserved",
"status": "brand_identity_required",
"ready": true,
"selected": true,
"preparation_required": true,
"from_email": "user@example.com",
"fqdn": "string",
"apex": "string",
"local_part": "string",
"local_part_editable": true,
"fqdn_changeable": false,
"suggested_subdomain": "string"
},
"byo_routing": {
"mismatch": true,
"provider": "string",
"bypassing_domains": [
"string"
],
"message": "string"
},
"subscribed_contacts_count": 0,
"logo_url": "https://example.com",
"screenshot_url": "https://example.com",
"capabilities": {},
"sms_provisioned": true,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]Create a brand
Body
namestringInternal brand name; mirrors company_name when company_name is omitted
brand_colorstringtext_colorstringbg_colorstringradiusinteger | null[0, 64]spacing_densitystring | nullcompactnormalspaciousfont_headingstringfont_bodystringheading_sizeinteger | null[12, 48]body_sizeinteger | null[12, 20]brand_documentstring | nullcompany_descriptionstringphysical_addressstringcompany_namestringlogostringSigned blob ID or URL
email_from_namestringemail_from_emailstring<email>email_reply_tostring<email>email_view_onlinebooleanemail_track_opensbooleanInject the open-tracking pixel into this brand's emails.
email_track_clicksbooleanRewrite this brand's links for click tracking.
test_email_recipientsArray<string>linksArray<object>default_headerobjectdefault_footerobjectdefault_themeobjectResponse
Brand created
Brand limit reached or validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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 '{
"name": "string",
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"radius": 0,
"spacing_density": "compact",
"font_heading": "string",
"font_body": "string",
"heading_size": 12,
"body_size": 12,
"brand_document": "string",
"company_description": "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",
"email_view_online": true,
"email_track_opens": true,
"email_track_clicks": true,
"test_email_recipients": [
"user@example.com"
],
"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({
"name": "string",
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"radius": 0,
"spacing_density": "compact",
"font_heading": "string",
"font_body": "string",
"heading_size": 12,
"body_size": 12,
"brand_document": "string",
"company_description": "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",
"email_view_online": true,
"email_track_opens": true,
"email_track_clicks": true,
"test_email_recipients": [
"user@example.com"
],
"links": [
{
"url": "https://example.com",
"icon": "string",
"title": "string"
}
],
"default_header": {},
"default_footer": {},
"default_theme": {}
}),
});
const data = await response.json();import requests
payload = {
"name": "string",
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"radius": 0,
"spacing_density": "compact",
"font_heading": "string",
"font_body": "string",
"heading_size": 12,
"body_size": 12,
"brand_document": "string",
"company_description": "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",
"email_view_online": True,
"email_track_opens": True,
"email_track_clicks": True,
"test_email_recipients": [
"user@example.com"
],
"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(){
"name": "string",
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"radius": 0,
"spacing_density": "compact",
"font_heading": "string",
"font_body": "string",
"heading_size": 12,
"body_size": 12,
"brand_document": "string",
"company_description": "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",
"email_view_online": true,
"email_track_opens": true,
"email_track_clicks": true,
"test_email_recipients": [
"user@example.com"
],
"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",
"radius": 0,
"spacing_density": "compact",
"font_heading": "string",
"font_body": "string",
"heading_size": 12,
"body_size": 12,
"brand_document": "string",
"company_description": "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",
"from_email_domain_status": "blank",
"effective_from_email": "user@example.com",
"effective_reply_to": "user@example.com",
"effective_sending_domain": "string",
"effective_source_email": "user@example.com",
"sender_configured": true,
"email_view_online": true,
"email_track_opens": true,
"email_track_clicks": true,
"test_email_recipients": [
"user@example.com"
],
"onboarding_state": {},
"onboarding": {
"steps": {},
"progress": {
"completed": 0,
"total": 0
}
},
"domain_verified": true,
"can_send": true,
"brand_subdomain": {
"namespace_status": "unreserved",
"status": "brand_identity_required",
"ready": true,
"selected": true,
"preparation_required": true,
"from_email": "user@example.com",
"fqdn": "string",
"apex": "string",
"local_part": "string",
"local_part_editable": true,
"fqdn_changeable": false,
"suggested_subdomain": "string"
},
"byo_routing": {
"mismatch": true,
"provider": "string",
"bypassing_domains": [
"string"
],
"message": "string"
},
"subscribed_contacts_count": 0,
"logo_url": "https://example.com",
"screenshot_url": "https://example.com",
"capabilities": {},
"sms_provisioned": true,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"error": true,
"code": "brand_limit_reached",
"message": "string"
}Get a brand
Parameters
sidstringrequiredpathBrand secure identifier
Response
Brand
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"radius": 0,
"spacing_density": "compact",
"font_heading": "string",
"font_body": "string",
"heading_size": 12,
"body_size": 12,
"brand_document": "string",
"company_description": "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",
"from_email_domain_status": "blank",
"effective_from_email": "user@example.com",
"effective_reply_to": "user@example.com",
"effective_sending_domain": "string",
"effective_source_email": "user@example.com",
"sender_configured": true,
"email_view_online": true,
"email_track_opens": true,
"email_track_clicks": true,
"test_email_recipients": [
"user@example.com"
],
"onboarding_state": {},
"onboarding": {
"steps": {},
"progress": {
"completed": 0,
"total": 0
}
},
"domain_verified": true,
"can_send": true,
"brand_subdomain": {
"namespace_status": "unreserved",
"status": "brand_identity_required",
"ready": true,
"selected": true,
"preparation_required": true,
"from_email": "user@example.com",
"fqdn": "string",
"apex": "string",
"local_part": "string",
"local_part_editable": true,
"fqdn_changeable": false,
"suggested_subdomain": "string"
},
"byo_routing": {
"mismatch": true,
"provider": "string",
"bypassing_domains": [
"string"
],
"message": "string"
},
"subscribed_contacts_count": 0,
"logo_url": "https://example.com",
"screenshot_url": "https://example.com",
"capabilities": {},
"sms_provisioned": true,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Delete a brand
Parameters
sidstringrequiredpathBrand secure identifier
forcestringtruequeryMust be true to delete a brand that has queued messages or scheduled/live campaigns.
Response
Deleted brand
Brand has active sends and requires explicit force confirmation
Cannot delete the only brand
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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",
"radius": 0,
"spacing_density": "compact",
"font_heading": "string",
"font_body": "string",
"heading_size": 12,
"body_size": 12,
"brand_document": "string",
"company_description": "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",
"from_email_domain_status": "blank",
"effective_from_email": "user@example.com",
"effective_reply_to": "user@example.com",
"effective_sending_domain": "string",
"effective_source_email": "user@example.com",
"sender_configured": true,
"email_view_online": true,
"email_track_opens": true,
"email_track_clicks": true,
"test_email_recipients": [
"user@example.com"
],
"onboarding_state": {},
"onboarding": {
"steps": {},
"progress": {
"completed": 0,
"total": 0
}
},
"domain_verified": true,
"can_send": true,
"brand_subdomain": {
"namespace_status": "unreserved",
"status": "brand_identity_required",
"ready": true,
"selected": true,
"preparation_required": true,
"from_email": "user@example.com",
"fqdn": "string",
"apex": "string",
"local_part": "string",
"local_part_editable": true,
"fqdn_changeable": false,
"suggested_subdomain": "string"
},
"byo_routing": {
"mismatch": true,
"provider": "string",
"bypassing_domains": [
"string"
],
"message": "string"
},
"subscribed_contacts_count": 0,
"logo_url": "https://example.com",
"screenshot_url": "https://example.com",
"capabilities": {},
"sms_provisioned": true,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"error": true,
"code": "brand_has_active_sends",
"active_sends": {
"queued_messages": 0,
"active_campaigns": 0
},
"deletion_safety": {
"deletion_impact": {
"contacts": 0,
"campaigns": 0,
"flows": 0,
"templates": 0,
"domains": 0,
"messages": 0
},
"active_sends": {
"queued_messages": 0,
"active_campaigns": 0
},
"can_delete": true,
"requires_force": true
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Update a brand
Body
namestringInternal brand name; mirrors company_name when company_name is omitted
brand_colorstringtext_colorstringbg_colorstringradiusinteger | null[0, 64]spacing_densitystring | nullcompactnormalspaciousfont_headingstringfont_bodystringheading_sizeinteger | null[12, 48]body_sizeinteger | null[12, 20]brand_documentstring | nullcompany_descriptionstringphysical_addressstringcompany_namestringlogostringSigned blob ID or URL
email_from_namestringemail_from_emailstring<email>email_reply_tostring<email>email_view_onlinebooleanemail_track_opensbooleanInject the open-tracking pixel into this brand's emails.
email_track_clicksbooleanRewrite this brand's links for click tracking.
sender_identity_idintegerReady brand-owned email sending identity to select through the canonical sender-selection authority.
sender_local_partstringVisible From local part for the selected sending identity.
test_email_recipientsArray<string>linksArray<object>default_headerobjectdefault_footerobjectdefault_themeobjectParameters
sidstringrequiredpathBrand secure identifier
Response
Updated brand
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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 '{
"name": "string",
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"radius": 0,
"spacing_density": "compact",
"font_heading": "string",
"font_body": "string",
"heading_size": 12,
"body_size": 12,
"brand_document": "string",
"company_description": "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",
"email_view_online": true,
"email_track_opens": true,
"email_track_clicks": true,
"sender_identity_id": 0,
"sender_local_part": "string",
"test_email_recipients": [
"user@example.com"
],
"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({
"name": "string",
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"radius": 0,
"spacing_density": "compact",
"font_heading": "string",
"font_body": "string",
"heading_size": 12,
"body_size": 12,
"brand_document": "string",
"company_description": "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",
"email_view_online": true,
"email_track_opens": true,
"email_track_clicks": true,
"sender_identity_id": 0,
"sender_local_part": "string",
"test_email_recipients": [
"user@example.com"
],
"links": [
{
"url": "https://example.com",
"icon": "string",
"title": "string"
}
],
"default_header": {},
"default_footer": {},
"default_theme": {}
}),
});
const data = await response.json();import requests
payload = {
"name": "string",
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"radius": 0,
"spacing_density": "compact",
"font_heading": "string",
"font_body": "string",
"heading_size": 12,
"body_size": 12,
"brand_document": "string",
"company_description": "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",
"email_view_online": True,
"email_track_opens": True,
"email_track_clicks": True,
"sender_identity_id": 0,
"sender_local_part": "string",
"test_email_recipients": [
"user@example.com"
],
"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(){
"name": "string",
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"radius": 0,
"spacing_density": "compact",
"font_heading": "string",
"font_body": "string",
"heading_size": 12,
"body_size": 12,
"brand_document": "string",
"company_description": "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",
"email_view_online": true,
"email_track_opens": true,
"email_track_clicks": true,
"sender_identity_id": 0,
"sender_local_part": "string",
"test_email_recipients": [
"user@example.com"
],
"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",
"radius": 0,
"spacing_density": "compact",
"font_heading": "string",
"font_body": "string",
"heading_size": 12,
"body_size": 12,
"brand_document": "string",
"company_description": "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",
"from_email_domain_status": "blank",
"effective_from_email": "user@example.com",
"effective_reply_to": "user@example.com",
"effective_sending_domain": "string",
"effective_source_email": "user@example.com",
"sender_configured": true,
"email_view_online": true,
"email_track_opens": true,
"email_track_clicks": true,
"test_email_recipients": [
"user@example.com"
],
"onboarding_state": {},
"onboarding": {
"steps": {},
"progress": {
"completed": 0,
"total": 0
}
},
"domain_verified": true,
"can_send": true,
"brand_subdomain": {
"namespace_status": "unreserved",
"status": "brand_identity_required",
"ready": true,
"selected": true,
"preparation_required": true,
"from_email": "user@example.com",
"fqdn": "string",
"apex": "string",
"local_part": "string",
"local_part_editable": true,
"fqdn_changeable": false,
"suggested_subdomain": "string"
},
"byo_routing": {
"mismatch": true,
"provider": "string",
"bypassing_domains": [
"string"
],
"message": "string"
},
"subscribed_contacts_count": 0,
"logo_url": "https://example.com",
"screenshot_url": "https://example.com",
"capabilities": {},
"sms_provisioned": true,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Reserve and prepare the Nitrosend sender
Reserves the brand's Nitrosend address when the brand has none (using the optional chosen subdomain and local_part, otherwise the company-derived name) and idempotently materializes the brand-owned logical Domain and sending identity under the verified shared nitrosend.net root. The operation is database-only: it makes no DNS, Vercel, Cloudflare, or SES call and never sends or retains email. A brand that already owns a namespace gets it back unchanged; the body is ignored because an allocated name is immutable.
Body
subdomainstringChosen subdomain label under the hosted apex; validated by the same policy as company-derived names.
local_partstringLocal part for the sender address (defaults to hello).
Parameters
sidstringrequiredpathBrand secure identifier
Response
The brand-subdomain sender is ready
The account or Brand Kit is not eligible, or the chosen name was rejected. error_code is one of subdomain_taken, subdomain_unsafe, local_part_invalid, brand_identity_required, brand_identity_review_required, sender_identity_limit_reached, sender_identity_retired, brand_inactive, sending_paused, subscription_inactive, principal_email_missing.
The shared hosted-sender root is not release-ready; no identity or delivery state was written
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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}/prepare_sending' \
-H 'Content-Type: application/json' \
-d '{
"subdomain": "string",
"local_part": "string"
}'const response = await fetch('https://api.nitrosend.com/v1/my/brands/{sid}/prepare_sending', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"subdomain": "string",
"local_part": "string"
}),
});
const data = await response.json();import requests
payload = {
"subdomain": "string",
"local_part": "string"
}
response = requests.post('https://api.nitrosend.com/v1/my/brands/{sid}/prepare_sending', json=payload)
data = response.json(){
"subdomain": "string",
"local_part": "string"
}{
"status": "ready",
"brand_subdomain": {
"namespace_status": "unreserved",
"status": "brand_identity_required",
"ready": true,
"selected": true,
"preparation_required": true,
"from_email": "user@example.com",
"fqdn": "string",
"apex": "string",
"local_part": "string",
"local_part_editable": true,
"fqdn_changeable": false,
"suggested_subdomain": "string"
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Check whether a Nitrosend address can be reserved
Advisory read for choosing the brand's Nitrosend address before it is reserved. Uses the same normaliser and uniqueness check as reservation, so the returned subdomain is exactly what prepare_sending would reserve. Never writes.
Parameters
sidstringrequiredpathBrand secure identifier
subdomainstringrequiredqueryRequested subdomain label under the hosted apex
local_partstringqueryRequested local part, checked with the same policy reservation applies; omitted means the allocator's default.
Response
Availability result
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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}/hosted_sender_availability'const response = await fetch('https://api.nitrosend.com/v1/my/brands/{sid}/hosted_sender_availability', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/brands/{sid}/hosted_sender_availability')
data = response.json(){
"subdomain": "string",
"fqdn": "string",
"available": true,
"reason": "taken",
"local_part": "string",
"from_email": "string"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Get deletion safety for a brand
Returns authoritative deletion impact counts and active-send state for the confirmation UI.
Parameters
sidstringrequiredpathBrand secure identifier
Response
Brand deletion safety
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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}/deletion_safety'const response = await fetch('https://api.nitrosend.com/v1/my/brands/{sid}/deletion_safety', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/brands/{sid}/deletion_safety')
data = response.json(){
"deletion_impact": {
"contacts": 0,
"campaigns": 0,
"flows": 0,
"templates": 0,
"domains": 0,
"messages": 0
},
"active_sends": {
"queued_messages": 0,
"active_campaigns": 0
},
"can_delete": true,
"requires_force": true
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}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)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Complete a brand onboarding step
Body
stepstringbrand_kit_setupdomain_verifiedfirst_contactfirst_sendrequiredParameters
sidstringrequiredpathBrand secure identifier
Response
Updated onboarding state
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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_kit_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_kit_setup"
}),
});
const data = await response.json();import requests
payload = {
"step": "brand_kit_setup"
}
response = requests.post('https://api.nitrosend.com/v1/my/brands/{sid}/onboarding/steps', json=payload)
data = response.json(){
"step": "brand_kit_setup"
}{
"steps": {},
"progress": {
"completed": 0,
"total": 0
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Get brand setup center state
Parameters
sidstringrequiredpathBrand secure identifier
Response
Setup center state for the brand
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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_kit_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,
"established": true
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Update brand setup center state
Body
Provide one of seen, dismissed, or card.
seenbooleandismissedbooleancardstringbrand_kit_scandnsimport_subscribersconnect_agentmetadataobjectParameters
sidstringrequiredpathBrand secure identifier
Response
Updated setup center state
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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_kit_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_kit_scan",
"metadata": {}
}),
});
const data = await response.json();import requests
payload = {
"seen": True,
"dismissed": True,
"card": "brand_kit_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_kit_scan",
"metadata": {}
}{
"cards": [
{
"id": "brand_kit_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,
"established": true
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}SavedViews
Saved table presets (filters + sort + columns) per surface
List saved views visible to the current user
Returns all shared views in the current account plus the caller's own private views. Optionally filtered by surface.
Parameters
surfacestringcontactssendingactivityqueryFilter views by surface
pageinteger1querylimitinteger<= 10025queryResponse
Saved views
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/saved_views'const response = await fetch('https://api.nitrosend.com/v1/my/saved_views', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/saved_views')
data = response.json()[]Create a saved view
Creates a new saved view owned by the current user. Defaults to private visibility if not specified.
Body
surfacestringcontactssendingactivityrequirednamestringrequiredvisibilitystringprivatesharedprivatefiltersSegmentFilterExpressionlayoutSavedViewLayout | nullTable layout preset for contacts surface views. Only present when surface = contacts.
Response
Saved view created
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/saved_views' \
-H 'Content-Type: application/json' \
-d '{
"surface": "contacts",
"name": "string",
"visibility": "private",
"layout": {
"columns": [
"string"
],
"sort": {
"field": "string",
"dir": "asc"
}
}
}'const response = await fetch('https://api.nitrosend.com/v1/my/saved_views', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"surface": "contacts",
"name": "string",
"visibility": "private",
"layout": {
"columns": [
"string"
],
"sort": {
"field": "string",
"dir": "asc"
}
}
}),
});
const data = await response.json();import requests
payload = {
"surface": "contacts",
"name": "string",
"visibility": "private",
"layout": {
"columns": [
"string"
],
"sort": {
"field": "string",
"dir": "asc"
}
}
}
response = requests.post('https://api.nitrosend.com/v1/my/saved_views', json=payload)
data = response.json(){
"surface": "contacts",
"name": "string",
"visibility": "private",
"layout": {
"columns": [
"string"
],
"sort": {
"field": "string",
"dir": "asc"
}
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Delete a saved view
Deletes a saved view. Allowed only for the creator or the account owner. Other members receive 403.
Parameters
idintegerrequiredpathResponse
Deleted saved view
Not authorized
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/saved_views/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/saved_views/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.nitrosend.com/v1/my/saved_views/{id}')
data = response.json(){
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Update a saved view
Updates a saved view. Allowed only for the creator or the account owner. Other members receive 403.
Body
namestringvisibilitystringprivatesharedfiltersSegmentFilterExpressionlayoutSavedViewLayout | nullTable layout preset for contacts surface views. Only present when surface = contacts.
Parameters
idintegerrequiredpathResponse
Updated saved view
Not authorized
Resource not found
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/saved_views/{id}' \
-H 'Content-Type: application/json' \
-d '{
"name": "string",
"visibility": "private",
"layout": {
"columns": [
"string"
],
"sort": {
"field": "string",
"dir": "asc"
}
}
}'const response = await fetch('https://api.nitrosend.com/v1/my/saved_views/{id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "string",
"visibility": "private",
"layout": {
"columns": [
"string"
],
"sort": {
"field": "string",
"dir": "asc"
}
}
}),
});
const data = await response.json();import requests
payload = {
"name": "string",
"visibility": "private",
"layout": {
"columns": [
"string"
],
"sort": {
"field": "string",
"dir": "asc"
}
}
}
response = requests.patch('https://api.nitrosend.com/v1/my/saved_views/{id}', json=payload)
data = response.json(){
"name": "string",
"visibility": "private",
"layout": {
"columns": [
"string"
],
"sort": {
"field": "string",
"dir": "asc"
}
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Fork a saved view into a new private view
Clones an existing view (typically a shared view) into a new private view owned by the caller. The original is not modified.
Parameters
idintegerrequiredpathResponse
Forked saved view
Resource not found
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/saved_views/{id}/fork'const response = await fetch('https://api.nitrosend.com/v1/my/saved_views/{id}/fork', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.nitrosend.com/v1/my/saved_views/{id}/fork')
data = response.json(){
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Public
Unauthenticated public endpoints
Ingest a Shopify Web Pixel event
Browser-safe public collector for Shopify Web Pixel standard events.
Requires a dedicated wpkey_live_... collector key. Secret
nskey_live_... API keys are rejected. Pixel events are treated as
funnel telemetry; verified Shopify webhooks remain authoritative for
revenue checkout/purchase Events.
Body
event_idstringrequiredevent_namestringproduct_viewedproduct_added_to_cartproduct_removed_from_cartrequiredcustomer_idstringemailstring<email>phonestringpropertiesobjectResponse
Event accepted, ignored, or dropped
Not authenticated
Validation failed
Authorization
bearerAuthcurl -X POST 'https://api.nitrosend.com/v1/public/shopify/events' \
-H 'Content-Type: application/json' \
-d '{
"event_id": "string",
"event_name": "product_viewed",
"customer_id": "string",
"email": "user@example.com",
"phone": "string",
"properties": {}
}'const response = await fetch('https://api.nitrosend.com/v1/public/shopify/events', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"event_id": "string",
"event_name": "product_viewed",
"customer_id": "string",
"email": "user@example.com",
"phone": "string",
"properties": {}
}),
});
const data = await response.json();import requests
payload = {
"event_id": "string",
"event_name": "product_viewed",
"customer_id": "string",
"email": "user@example.com",
"phone": "string",
"properties": {}
}
response = requests.post('https://api.nitrosend.com/v1/public/shopify/events', json=payload)
data = response.json(){
"event_id": "string",
"event_name": "product_viewed",
"customer_id": "string",
"email": "user@example.com",
"phone": "string",
"properties": {}
}{
"ok": true,
"outcome": "captured",
"event_id": 0
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Read anonymous scan, brand review, or generated draft status
Parameters
X-Flow-Demo-TokenstringrequiredheaderResponse
Current demo stage and its available review or draft data
Missing or expired demo token
curl -X GET 'https://api.nitrosend.com/v1/public/flow_demo'const response = await fetch('https://api.nitrosend.com/v1/public/flow_demo', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/public/flow_demo')
data = response.json(){}Start an anonymous brand scan for a flow demo
Creates a short-lived isolated demo workspace, not a visitor account. Rate limited by IP.
Body
domainstringrequiredgoalstringrequiredResponse
Scan started
Invalid or private website URL or goal
Demo start rate limit reached
curl -X POST 'https://api.nitrosend.com/v1/public/flow_demo' \
-H 'Content-Type: application/json' \
-d '{
"domain": "string",
"goal": "string"
}'const response = await fetch('https://api.nitrosend.com/v1/public/flow_demo', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"domain": "string",
"goal": "string"
}),
});
const data = await response.json();import requests
payload = {
"domain": "string",
"goal": "string"
}
response = requests.post('https://api.nitrosend.com/v1/public/flow_demo', json=payload)
data = response.json(){
"domain": "string",
"goal": "string"
}{
"token": "string",
"status": "scanning"
}Keep selected scanned Brand Kit fields
Body
fieldsobjectrequiredinclude_logobooleanParameters
X-Flow-Demo-TokenstringrequiredheaderResponse
Reviewed brand is ready for flow generation
Scan is incomplete or selected field was not offered
curl -X POST 'https://api.nitrosend.com/v1/public/flow_demo/review' \
-H 'Content-Type: application/json' \
-d '{
"fields": {},
"include_logo": true
}'const response = await fetch('https://api.nitrosend.com/v1/public/flow_demo/review', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"fields": {},
"include_logo": true
}),
});
const data = await response.json();import requests
payload = {
"fields": {},
"include_logo": True
}
response = requests.post('https://api.nitrosend.com/v1/public/flow_demo/review', json=payload)
data = response.json(){
"fields": {},
"include_logo": true
}Generate a draft flow for the reviewed brand and goal
Reuses the metered flow composer. Retrying the same demo returns the same inactive draft.
Parameters
X-Flow-Demo-TokenstringrequiredheaderResponse
Draft flow or in-progress generation status
Brand review missing or generation failed
curl -X POST 'https://api.nitrosend.com/v1/public/flow_demo/generate'const response = await fetch('https://api.nitrosend.com/v1/public/flow_demo/generate', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.nitrosend.com/v1/public/flow_demo/generate')
data = response.json(){}Get guest-safe Flow Builder steps and triggers
Response
Flow editor schema restricted to guest-authorable actions
curl -X GET 'https://api.nitrosend.com/v1/public/flow_demo/spec'const response = await fetch('https://api.nitrosend.com/v1/public/flow_demo/spec', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/public/flow_demo/spec')
data = response.json(){}Get a canonical email template for guest editing
Returns one known system catalog template as concrete, validated editor JSON. Catalog theme markers are resolved before the response. The response contains no account-specific data and does not create a saved template.
Parameters
idstringrequiredpathResponse
Canonical catalog template
Resource not found
curl -X GET 'https://api.nitrosend.com/v1/public/templates/{id}'const response = await fetch('https://api.nitrosend.com/v1/public/templates/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/public/templates/{id}')
data = response.json(){
"id": "string",
"name": "string",
"category": "string",
"tags": [
"string"
],
"description": "string",
"subject": "string",
"preheader": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Get the email editor schema for guest editing
Returns the canonical component and theme schema used by the email editor.
Response
Email component schema
curl -X GET 'https://api.nitrosend.com/v1/public/templates/spec'const response = await fetch('https://api.nitrosend.com/v1/public/templates/spec', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/public/templates/spec')
data = response.json(){
"version": 0,
"design_guidelines": "string",
"components": [
{
"type": "string",
"description": "string",
"tips": [
"string"
],
"props": {}
}
],
"style_attributes": [
{
"key": "string",
"label": "string",
"type": "color",
"theme_fallback": "string",
"description": "string",
"min": 0,
"max": 0,
"values": [
"string"
],
"target": {
"el": "section",
"attr": "string"
}
}
],
"preview_document": {
"parameter": "string",
"description": "string",
"example": {}
},
"variables": {},
"filters": [
{
"name": "string",
"syntax": "string",
"description": "string"
}
],
"theme_attributes": [
{
"key": "string",
"label": "string",
"type": "color",
"category": "color",
"slot": "string",
"surfaces": [
"string"
],
"min": 0,
"max": 0,
"values": [
"string"
],
"options": [
{
"value": "string",
"label": "string",
"description": "string"
}
],
"transform_table": {},
"column": true,
"storage": "string",
"placeholder": "string",
"value_resolver": "string",
"server_owned": true,
"description": "string"
}
]
}Create or update a public contact (website forms)
Public signup endpoint for website forms. Authenticate with a wpkey_live_… public key. Returns { ok: true } whether the contact is new or already subscribed; this preserves idempotency and avoids leaking which emails are on the list.
Use the brand's public key (wpkey_live_…). Secret keys (nskey_live_…) are rejected on this endpoint.
Body
emailstring<email>requiredSubscriber email address.
list_idintegerrequiredID of a contact list owned by the brand whose public key is presented.
first_namestring | nullOptional first name written to the contact.
last_namestring | nullOptional last name written to the contact.
phonestring | nullOptional E.164 phone number written to the SMS channel if provided.
sourcestring | nullOptional free-text label, e.g. "footer-form" or "/pricing", recorded against the signup.
dataobject | nullOptional bag of custom contact data. Reserved keys are silently dropped.
Response
Contact accepted
Not authenticated
Not authorized
Resource not found
Validation failed
Rate limit exceeded
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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,
"first_name": "string",
"last_name": "string",
"phone": "string",
"source": "string",
"data": {}
}'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,
"first_name": "string",
"last_name": "string",
"phone": "string",
"source": "string",
"data": {}
}),
});
const data = await response.json();import requests
payload = {
"email": "user@example.com",
"list_id": 0,
"first_name": "string",
"last_name": "string",
"phone": "string",
"source": "string",
"data": {}
}
response = requests.post('https://api.nitrosend.com/v1/public/contacts', json=payload)
data = response.json(){
"email": "user@example.com",
"list_id": 0,
"first_name": "string",
"last_name": "string",
"phone": "string",
"source": "string",
"data": {}
}{
"ok": true
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}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,
"probation_recipient_cap_24h": 0,
"standard_recipient_cap_24h": 0,
"trusted_recipient_cap_24h": 0,
"entitlements": {
"agent_inbox": {
"enabled": true,
"max_inboxes": 0,
"inbound_messages_included": 0,
"inbound_messages_metered": true,
"inbound_message_overage_rate_cents": "string",
"max_inbound_domains": 0,
"max_apex_domains": 0,
"apex_mx": true,
"legacy_forwarding": true,
"catch_all": true,
"retention_days": 0,
"advanced_queue_controls": true
}
}
}
],
"stripe_publishable_key": "string"
}MCP
Model Context Protocol JSON-RPC endpoint and discovery
Probe the MCP OAuth endpoint
Unauthenticated probes receive the RFC 9728 protected-resource metadata
URL in WWW-Authenticate so OAuth clients can continue discovery.
Authenticated requests receive 405 Method Not Allowed because this
server does not offer a server-initiated event stream over GET. Use
POST /mcp for MCP Streamable HTTP requests.
Response
MCP authentication required
Authenticated GET is not supported by the MCP transport
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/mcp'const response = await fetch('https://api.nitrosend.com/mcp', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/mcp')
data = response.json(){}{}MCP JSON-RPC endpoint
JSON-RPC endpoint for the Nitrosend MCP server. Read nitro://account,
nitro://config, or call nitro_get_status for bound account identity;
there is no per-tool account override argument.
Body
Response
JSON-RPC response
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/mcp' \
-H 'Content-Type: application/json' \
-d '{}'const response = await fetch('https://api.nitrosend.com/mcp', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
const data = await response.json();import requests
payload = {}
response = requests.post('https://api.nitrosend.com/mcp', json=payload)
data = response.json(){}{}Operator
Internal production support operations; requires an admin or staff API key
List the production customer-support queue
Requires an nskey_live_... API key owned by an admin or staff user. Browser JWTs are rejected.
Parameters
statusstringquerydue_onlybooleanfalsequeryaccount_idintegerquerybrand_idintegerquerypageinteger1querylimitinteger<= 10025queryResponse
Paginated support queue
Not authenticated
Not authorized
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/operator/support_requests'const response = await fetch('https://api.nitrosend.com/v1/operator/support_requests', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/operator/support_requests')
data = response.json()[
{
"id": 0,
"account_id": 0,
"brand_id": 0,
"subject": "string",
"message": "string",
"status": "open",
"follow_up_at": "2024-01-15T09:30:00Z",
"resolved_at": "2024-01-15T09:30:00Z",
"last_replied_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Get one production support case
Parameters
idintegerrequiredpathResponse
Support request, customer account, brand, and latest reply ledger state
Not authenticated
Not authorized
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/operator/support_requests/{id}'const response = await fetch('https://api.nitrosend.com/v1/operator/support_requests/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/operator/support_requests/{id}')
data = response.json(){
"support_request": {
"id": 0,
"account_id": 0,
"brand_id": 0,
"subject": "string",
"message": "string",
"status": "open",
"follow_up_at": "2024-01-15T09:30:00Z",
"resolved_at": "2024-01-15T09:30:00Z",
"last_replied_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"support_transcript": "string",
"support_transcript_truncated": true
},
"account": {},
"brand": {},
"latest_reply": {},
"github_issue": {}
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Read bounded live diagnostics for a support case
Parameters
idintegerrequiredpathResponse
Current sending, DNS, campaign, and message evidence
Not authenticated
Not authorized
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/operator/support_requests/{id}/diagnostics'const response = await fetch('https://api.nitrosend.com/v1/operator/support_requests/{id}/diagnostics', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/operator/support_requests/{id}/diagnostics')
data = response.json(){}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Persist a versioned customer reply draft
Body
bodystringrequiredrunx_receipt_idstring | nullParameters
idintegerrequiredpathResponse
Draft persisted in the reply ledger
Bad request
Not authenticated
Not authorized
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/operator/support_requests/{id}/draft' \
-H 'Content-Type: application/json' \
-d '{
"body": "string",
"runx_receipt_id": "string"
}'const response = await fetch('https://api.nitrosend.com/v1/operator/support_requests/{id}/draft', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"body": "string",
"runx_receipt_id": "string"
}),
});
const data = await response.json();import requests
payload = {
"body": "string",
"runx_receipt_id": "string"
}
response = requests.post('https://api.nitrosend.com/v1/operator/support_requests/{id}/draft', json=payload)
data = response.json(){
"body": "string",
"runx_receipt_id": "string"
}{
"status": "drafted",
"support_request_id": 0,
"thread_record_id": 0,
"draft_version": 0,
"draft_state": "string",
"terminal_outcome": "string",
"last_replied_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Send one current versioned customer reply
Delivery is fail-closed and requires confirm: true; stale draft versions are rejected by the server ledger.
Body
thread_record_idintegerrequireddraft_versionintegerrequiredconfirmbooleanrequiredParameters
idintegerrequiredpathResponse
Reply delivered
Bad request
Not authenticated
Not authorized
Resource not found
Validation failed
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/operator/support_requests/{id}/send_reply' \
-H 'Content-Type: application/json' \
-d '{
"thread_record_id": 0,
"draft_version": 0,
"confirm": true
}'const response = await fetch('https://api.nitrosend.com/v1/operator/support_requests/{id}/send_reply', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"thread_record_id": 0,
"draft_version": 0,
"confirm": true
}),
});
const data = await response.json();import requests
payload = {
"thread_record_id": 0,
"draft_version": 0,
"confirm": True
}
response = requests.post('https://api.nitrosend.com/v1/operator/support_requests/{id}/send_reply', json=payload)
data = response.json(){
"thread_record_id": 0,
"draft_version": 0,
"confirm": true
}{
"status": "drafted",
"support_request_id": 0,
"thread_record_id": 0,
"draft_version": 0,
"draft_state": "string",
"terminal_outcome": "string",
"last_replied_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"validation_errors": {}
}Set the persistent support-case disposition
Body
statusstringopenwaitingresolvedrequiredconfirmbooleantruerequiredExplicit confirmation of the disposition mutation.
follow_up_atstring<date-time>Required only for waiting.
Parameters
idintegerrequiredpathResponse
Updated support request
Bad request
Not authenticated
Not authorized
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/operator/support_requests/{id}/disposition' \
-H 'Content-Type: application/json' \
-d '{
"status": "open",
"confirm": true,
"follow_up_at": "2024-01-15T09:30:00Z"
}'const response = await fetch('https://api.nitrosend.com/v1/operator/support_requests/{id}/disposition', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"status": "open",
"confirm": true,
"follow_up_at": "2024-01-15T09:30:00Z"
}),
});
const data = await response.json();import requests
payload = {
"status": "open",
"confirm": True,
"follow_up_at": "2024-01-15T09:30:00Z"
}
response = requests.post('https://api.nitrosend.com/v1/operator/support_requests/{id}/disposition', json=payload)
data = response.json(){
"status": "open",
"confirm": true,
"follow_up_at": "2024-01-15T09:30:00Z"
}{
"id": 0,
"account_id": 0,
"brand_id": 0,
"subject": "string",
"message": "string",
"status": "open",
"follow_up_at": "2024-01-15T09:30:00Z",
"resolved_at": "2024-01-15T09:30:00Z",
"last_replied_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Chat Sessions
List persisted chat sessions
Parameters
pageinteger1querylimitinteger<= 10025queryResponse
Paginated list of chat sessions
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/chat_sessions'const response = await fetch('https://api.nitrosend.com/v1/my/chat_sessions', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/chat_sessions')
data = response.json()[
{
"id": 0,
"account_id": 0,
"brand_id": 0,
"title": "string",
"status": "active",
"started_at": "2024-01-15T09:30:00Z",
"last_message_at": "2024-01-15T09:30:00Z",
"message_count": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]Get a persisted chat session with ordered messages
Parameters
idintegerrequiredpathResponse
Chat session
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/chat_sessions/{id}'const response = await fetch('https://api.nitrosend.com/v1/my/chat_sessions/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.nitrosend.com/v1/my/chat_sessions/{id}')
data = response.json(){
"id": 0,
"account_id": 0,
"brand_id": 0,
"title": "string",
"status": "active",
"started_at": "2024-01-15T09:30:00Z",
"last_message_at": "2024-01-15T09:30:00Z",
"message_count": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"messages": [
{
"id": 0,
"role": "user",
"content": "string",
"tool_calls": [
{
"id": "string",
"name": "string",
"input": {},
"safe": true,
"status": "pending",
"approval_token": "string"
}
],
"actions": [
{}
],
"sequence": 0,
"created_at": "2024-01-15T09:30:00Z"
}
]
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Close an active persisted chat session
Parameters
idintegerrequiredpathResponse
Closed chat session
Resource not found
Authorization
BearerAuthhttp (bearer)Authentication scheme depends on the route:
- Authenticated endpoints (
/v1/my/*) accept a server API key (nskey_live_...), a Nitrosend JWT, or a verified Shopify App Bridge ID token for an active embedded installation. API key is checked first. - Public website-form endpoints (
/v1/public/*) require a brand public key (wpkey_live_...). Secret keys (nskey_live_...) are rejected here so they can't be smuggled into browser code.
For accounts with multiple brands, 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/chat_sessions/{id}/close'const response = await fetch('https://api.nitrosend.com/v1/my/chat_sessions/{id}/close', {
method: 'PATCH',
});
const data = await response.json();import requests
response = requests.patch('https://api.nitrosend.com/v1/my/chat_sessions/{id}/close')
data = response.json(){
"id": 0,
"account_id": 0,
"brand_id": 0,
"title": "string",
"status": "active",
"started_at": "2024-01-15T09:30:00Z",
"last_message_at": "2024-01-15T09:30:00Z",
"message_count": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}Models
OperatorSupportRequest
objectidintegerrequiredaccount_idintegerrequiredbrand_idintegerrequiredsubjectstringrequiredmessagestringrequiredstatusstringopenwaitingresolvedrequiredfollow_up_atstring<date-time> | nullresolved_atstring<date-time> | nulllast_replied_atstring<date-time> | nullcreated_atstring<date-time>requiredupdated_atstring<date-time>required{
"id": 0,
"account_id": 0,
"brand_id": 0,
"subject": "string",
"message": "string",
"status": "open",
"follow_up_at": "2024-01-15T09:30:00Z",
"resolved_at": "2024-01-15T09:30:00Z",
"last_replied_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}OperatorSupportCase
objectsupport_requestOperatorSupportRequest & objectrequiredaccountobjectrequiredbrandobjectrequiredlatest_replyobject | nullgithub_issueobject | null{
"support_request": {
"id": 0,
"account_id": 0,
"brand_id": 0,
"subject": "string",
"message": "string",
"status": "open",
"follow_up_at": "2024-01-15T09:30:00Z",
"resolved_at": "2024-01-15T09:30:00Z",
"last_replied_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"support_transcript": "string",
"support_transcript_truncated": true
},
"account": {},
"brand": {},
"latest_reply": {},
"github_issue": {}
}OperatorReplyDraft
objectstatusstringdraftedsentrequiredsupport_request_idintegerrequiredthread_record_idintegerrequireddraft_versionintegerrequireddraft_statestringterminal_outcomestring | nulllast_replied_atstring<date-time> | null{
"status": "drafted",
"support_request_id": 0,
"thread_record_id": 0,
"draft_version": 0,
"draft_state": "string",
"terminal_outcome": "string",
"last_replied_at": "2024-01-15T09:30:00Z"
}TimelineEntry
objectOne normalised, whitelisted entry in a contact's unified timeline.
idstringrequiredStable composite id, e.g. "event-123".
kindstringeventactivitylifecyclerequiredtypestringrequiredEvent/activity name, e.g. checkout, opened.
titlestringrequiredHuman-readable label for the entry.
occurred_atstring<date-time>requiredmetaobjectrequiredDisplay-only extras (e.g. amount, resource_name). No internal fields.
{
"id": "string",
"kind": "event",
"type": "string",
"title": "string",
"occurred_at": "2024-01-15T09:30:00Z",
"meta": {}
}Error
objectcapacity_recoveryDeliveryCapacityRecoveryInformational recovery at 80 percent used, exhaustion, or when a campaign exceeds remaining allowance. Never denies a send or promises that payment or verification bypasses safety. Actions come from the shared backend projection; only offer verification when new valid proof can improve standing.
recovery_actionobjectContext-specific recovery action, including sending capacity or prepaid funding recovery.
codeintegerrequiredmessagestringrequirederrorbooleanrequirederror_codestring | nullOptional machine-readable error reason.
provisioning_idinteger | nullExisting provisioning row involved in a managed-account conflict.
retryablebooleanWhether retrying the same idempotent operation can succeed.
retry_atstring<date-time>Earliest recommended retry time for a retryable failure.
{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}User
objectidintegerfirst_namestring | nulllast_namestring | nullemailstring<email>mobilestring | nullcountry_codestring | nulltime_zonestring | nulladminbooleanui_login_countintegerCapped three-state dashboard-login counter: 0 = the user has never logged into the app UI, 1 = the user is inside their first UI login, 2 = returning. Advances only on real dashboard logins (never on API key, MCP, or agent-connect authentication).
created_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"mobile": "string",
"country_code": "string",
"time_zone": "string",
"admin": true,
"ui_login_count": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}Impersonator
objectidintegeremailstring<email>namestring | null{
"id": 0,
"email": "user@example.com",
"name": "string"
}ImpersonationStatus
objectimpersonatingbooleanrequiredimpersonatorImpersonator | nullrequired{
"impersonating": true,
"impersonator": {
"id": 0,
"email": "user@example.com",
"name": "string"
}
}ImpersonationExit
objectredirect_urlstring<uri>required{
"redirect_url": "https://api.nitrosend.com/adm"
}ManagedAccountLifecycleStatus
string"preparing"ManagedAccountLifecycleStatusFilter
string"preparing"ManagedAccountProvisioning
objectidintegerrequiredexternal_refstringrequiredsourcestringdashboardpartner_apirequiredstatusManagedAccountLifecycleStatuspreparingawaiting_ownerpayment_requiredactivepayment_issueendedrequiredpermission_setstringoperator_v1requiredallowed_actionsArray<string>send_invitationresend_invitationsend_payment_reminderenterreleaserequiredmanaged_accountobjectrequiredownerobjectrequiredinvitationobjectrequiredcreated_atstring<date-time>requiredupdated_atstring<date-time>required{
"id": 0,
"external_ref": "string",
"source": "dashboard",
"status": "preparing",
"permission_set": "operator_v1",
"allowed_actions": [
"send_invitation"
],
"managed_account": {
"id": 0,
"name": "string"
},
"owner": {
"email": "user@example.com"
},
"invitation": {
"expired": true,
"expires_at": "2024-01-15T09:30:00Z",
"deadline_at": "2024-01-15T09:30:00Z",
"notice_sent_at": "2024-01-15T09:30:00Z",
"claimed_at": "2024-01-15T09:30:00Z",
"reissues_remaining": 0
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}ManagedAccountProvisioningCreated
objectidintegerrequiredexternal_refstringrequiredsourcestringdashboardpartner_apirequiredstatusManagedAccountLifecycleStatuspreparingawaiting_ownerpayment_requiredactivepayment_issueendedrequiredpermission_setstringoperator_v1requiredallowed_actionsArray<string>send_invitationresend_invitationsend_payment_reminderenterreleaserequiredmanaged_accountobjectrequiredownerobjectrequiredinvitationobjectrequiredcreated_atstring<date-time>requiredupdated_atstring<date-time>requiredidempotent_replaybooleanrequired{
"id": 0,
"external_ref": "string",
"source": "dashboard",
"status": "preparing",
"permission_set": "operator_v1",
"allowed_actions": [
"send_invitation"
],
"managed_account": {
"id": 0,
"name": "string"
},
"owner": {
"email": "user@example.com"
},
"invitation": {
"expired": true,
"expires_at": "2024-01-15T09:30:00Z",
"deadline_at": "2024-01-15T09:30:00Z",
"notice_sent_at": "2024-01-15T09:30:00Z",
"claimed_at": "2024-01-15T09:30:00Z",
"reissues_remaining": 0
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"idempotent_replay": true
}DashboardManagedAccountCreateRequest
objectmanaged_accountobjectrequired{
"managed_account": {
"owner_email": "user@example.com",
"owner_first_name": "string",
"owner_last_name": "string",
"account_name": "string"
}
}PartnerManagedAccountCreateRequest
objectmanaged_accountobjectrequired{
"managed_account": {
"external_ref": "string",
"owner_email": "user@example.com",
"owner_first_name": "string",
"owner_last_name": "string",
"account_name": "string"
}
}AccountProvisioningCredential
objectidintegerrequirednamestringrequiredscopesArray<string>provisionmanagerequiredsecret_hintstringrequiredexpires_atstring<date-time>requiredlast_used_atstring<date-time> | nullrevoked_atstring<date-time> | nullcreated_atstring<date-time>required{
"id": 0,
"name": "string",
"scopes": [
"provision"
],
"secret_hint": "string",
"expires_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z",
"revoked_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}AccountProvisioningCredentialIssued
objectidintegerrequirednamestringrequiredscopesArray<string>provisionmanagerequiredsecret_hintstringrequiredexpires_atstring<date-time>requiredlast_used_atstring<date-time> | nullrevoked_atstring<date-time> | nullcreated_atstring<date-time>requiredsecretstringrequiredwrite onlyOne-time nspk_live_ credential secret.
{
"id": 0,
"name": "string",
"scopes": [
"provision"
],
"secret_hint": "string",
"expires_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z",
"revoked_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"secret": "string"
}AccountProvisioningCredentialCreateRequest
objectcredentialobjectrequired{
"credential": {
"name": "string",
"scopes": [
"provision"
],
"expires_at": "2024-01-15T09:30:00Z"
}
}AccountManagementCredential
objectidintegerrequiredaccount_management_grant_idintegerrequirednamestringrequiredpermission_setstringoperator_v1requiredsecret_hintstringrequiredexpires_atstring<date-time>requiredlast_used_atstring<date-time> | nullrevoked_atstring<date-time> | nullcreated_atstring<date-time>requiredbrandobjectrequired{
"id": 0,
"account_management_grant_id": 0,
"name": "string",
"permission_set": "operator_v1",
"secret_hint": "string",
"expires_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z",
"revoked_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"brand": {
"id": 0,
"sid": "string",
"name": "string"
}
}AccountManagementCredentialIssued
objectidintegerrequiredaccount_management_grant_idintegerrequirednamestringrequiredpermission_setstringoperator_v1requiredsecret_hintstringrequiredexpires_atstring<date-time>requiredlast_used_atstring<date-time> | nullrevoked_atstring<date-time> | nullcreated_atstring<date-time>requiredbrandobjectrequiredsecretstringrequiredwrite onlyOne-time nsmc_live_ credential secret.
{
"id": 0,
"account_management_grant_id": 0,
"name": "string",
"permission_set": "operator_v1",
"secret_hint": "string",
"expires_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z",
"revoked_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"brand": {
"id": 0,
"sid": "string",
"name": "string"
},
"secret": "string"
}AccountManagementCredentialCreateRequest
objectcredentialobjectrequired{
"credential": {
"name": "string",
"brand_sid": "string",
"expires_at": "2024-01-15T09:30:00Z"
}
}ManagedAccountClaimCompletionRequest
objectclaimobjectrequired{
"claim": {
"token": "string"
}
}ManagedAccountClaimInspection
objectmanagerobjectrequiredmanaged_accountobjectrequiredowner_emailstringrequiredMasked owner address
expires_atstring<date-time>requiredauthenticationstringrequired{
"manager": {
"name": "string"
},
"managed_account": {
"name": "string"
},
"owner_email": "string",
"expires_at": "2024-01-15T09:30:00Z",
"authentication": "login_required"
}ManagedAccountClaimCompletion
objectclaimedbooleanrequiredstatusstringpayment_requiredactivemanager_disabledrequiredmanaged_accountobjectrequired{
"claimed": true,
"status": "payment_required",
"managed_account": {
"id": 0,
"name": "string"
}
}Account
objectidintegernamestring | nullavatarstring | nullSigned blob ID
bannerstring | nullSigned blob ID
commercial_tierstringunsubscribedfreeproultraenterprisesafe_mode_enabledbooleanaccessAccountAccessbillingobjectPresent for direct access and omitted from delegated account-list projections.
teamobjectPresent for direct access and omitted from delegated account-list projections.
created_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"name": "string",
"avatar": "string",
"banner": "string",
"commercial_tier": "unsubscribed",
"safe_mode_enabled": true,
"access": {
"source": "owner",
"delegated": true,
"manager_account_id": 0,
"manager_account_name": "string",
"management_grant_id": 0,
"permission_set": "operator_v1",
"credential_type": "management"
},
"billing": {
"access_policy": "free_allowed",
"plan_name": "string",
"plan": {
"id": 0,
"name": "string",
"active": true,
"probation_recipient_cap_24h": 0,
"standard_recipient_cap_24h": 0,
"trusted_recipient_cap_24h": 0,
"entitlements": {
"agent_inbox": {
"enabled": true,
"max_inboxes": 0,
"inbound_messages_included": 0,
"inbound_messages_metered": true,
"inbound_message_overage_rate_cents": "string",
"max_inbound_domains": 0,
"max_apex_domains": 0,
"apex_mx": true,
"legacy_forwarding": true,
"catch_all": true,
"retention_days": 0,
"advanced_queue_controls": true
}
}
},
"spend_cap_monthly_cents": 0,
"comped": true,
"overage": {},
"entitlements": {
"agent_inbox": {
"enabled": true,
"max_inboxes": 0,
"inbound_messages_included": 0,
"inbound_messages_metered": true,
"inbound_message_overage_rate_cents": "string",
"max_inbound_domains": 0,
"max_apex_domains": 0,
"apex_mx": true,
"legacy_forwarding": true,
"catch_all": true,
"retention_days": 0,
"advanced_queue_controls": true
}
},
"resources": {
"email": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
},
"sms": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
},
"ai": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
}
},
"funding": {},
"provider_route": {},
"brands": {
"used": 0,
"limit": 0,
"remaining": 0,
"unlimited": true,
"can_create": true
},
"lifetime": {
"email_sent": 0,
"sms_sent": 0,
"ai_used": 0
}
},
"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"
}SendingPause
objectWhat the owner of a suspended account is told. A deliverability pause names the metric and the fix (reason, what_to_do). Any other suspension is opaque and carries no reason. Recovery actions reach the existing support channel.
sending_pausedbooleantruerequiredreasonstringcritical_bounce_ratecritical_complaint_ratePresent only for an explained deliverability pause.
occurred_atstring<date-time>requiredheadlinestringrequireddetailstringrequiredwhat_to_doArray<string>Present only for an explained deliverability pause.
request_reviewstringrequiredThe instruction an agent relays to the owner.
recovery_actionsArray<object>required{
"sending_paused": true,
"reason": "critical_bounce_rate",
"occurred_at": "2024-01-15T09:30:00Z",
"headline": "string",
"detail": "string",
"what_to_do": [
"string"
],
"request_review": "string",
"recovery_actions": [
{
"type": "verify_list",
"label": "string",
"url": "string"
}
]
}AccountResourceUsage
objectusedintegerrequiredallowanceinteger | nullrequiredremaininginteger | nullrequiredoverage_ratenumberrequiredmodestringbudgetmonthlyunlimitedrequiredbudgetinteger | nullrequiredbudget_usedintegerrequired{
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
}AccountAccess
objectsourcestringownermembershipplatform_admindelegatedmanagement_credentialapi_keyshopifyrequireddelegatedbooleanrequiredmanager_account_idintegermanager_account_namestring | nullmanagement_grant_idintegerpermission_setstringoperator_v1credential_typestringmanagement{
"source": "owner",
"delegated": true,
"manager_account_id": 0,
"manager_account_name": "string",
"management_grant_id": 0,
"permission_set": "operator_v1",
"credential_type": "management"
}AccountManagementGrant
objectidintegerrequiredstatusstringpendingactiverevokedreleasedrequiredpermission_setstringoperator_v1requiredmanager_accountobjectrequiredrequested_atstring<date-time>requiredactivated_atstring<date-time> | nullrevoked_atstring<date-time> | nullreleased_atstring<date-time> | null{
"id": 0,
"status": "pending",
"permission_set": "operator_v1",
"manager_account": {
"id": 0,
"name": "string"
},
"requested_at": "2024-01-15T09:30:00Z",
"activated_at": "2024-01-15T09:30:00Z",
"revoked_at": "2024-01-15T09:30:00Z",
"released_at": "2024-01-15T09:30:00Z"
}AccountManagementGrantCommand
objectmanagement_grant_idintegerrequiredExact grant returned by the show endpoint; prevents a stale command from targeting a replacement grant.
{
"management_grant_id": 0
}AccountTeam
objectaccountAccountmembershipsArray<AccountMembership>invitesArray<AccountInvite>accessible_accountsArray<Account>{
"account": {
"id": 0,
"name": "string",
"avatar": "string",
"banner": "string",
"commercial_tier": "unsubscribed",
"safe_mode_enabled": true,
"access": {
"source": "owner",
"delegated": true,
"manager_account_id": 0,
"manager_account_name": "string",
"management_grant_id": 0,
"permission_set": "operator_v1",
"credential_type": "management"
},
"billing": {
"access_policy": "free_allowed",
"plan_name": "string",
"plan": {
"id": 0,
"name": "string",
"active": true,
"probation_recipient_cap_24h": 0,
"standard_recipient_cap_24h": 0,
"trusted_recipient_cap_24h": 0,
"entitlements": {
"agent_inbox": {
"enabled": true,
"max_inboxes": 0,
"inbound_messages_included": 0,
"inbound_messages_metered": true,
"inbound_message_overage_rate_cents": "string",
"max_inbound_domains": 0,
"max_apex_domains": 0,
"apex_mx": true,
"legacy_forwarding": true,
"catch_all": true,
"retention_days": 0,
"advanced_queue_controls": true
}
}
},
"spend_cap_monthly_cents": 0,
"comped": true,
"overage": {},
"entitlements": {
"agent_inbox": {
"enabled": true,
"max_inboxes": 0,
"inbound_messages_included": 0,
"inbound_messages_metered": true,
"inbound_message_overage_rate_cents": "string",
"max_inbound_domains": 0,
"max_apex_domains": 0,
"apex_mx": true,
"legacy_forwarding": true,
"catch_all": true,
"retention_days": 0,
"advanced_queue_controls": true
}
},
"resources": {
"email": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
},
"sms": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
},
"ai": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
}
},
"funding": {},
"provider_route": {},
"brands": {
"used": 0,
"limit": 0,
"remaining": 0,
"unlimited": true,
"can_create": true
},
"lifetime": {
"email_sent": 0,
"sms_sent": 0,
"ai_used": 0
}
},
"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",
"commercial_tier": "unsubscribed",
"safe_mode_enabled": true,
"access": {
"source": "owner",
"delegated": true,
"manager_account_id": 0,
"manager_account_name": "string",
"management_grant_id": 0,
"permission_set": "operator_v1",
"credential_type": "management"
},
"billing": {
"access_policy": "free_allowed",
"plan_name": "string",
"plan": {
"id": 0,
"name": "string",
"active": true,
"probation_recipient_cap_24h": 0,
"standard_recipient_cap_24h": 0,
"trusted_recipient_cap_24h": 0,
"entitlements": {
"agent_inbox": {
"enabled": true,
"max_inboxes": 0,
"inbound_messages_included": 0,
"inbound_messages_metered": true,
"inbound_message_overage_rate_cents": "string",
"max_inbound_domains": 0,
"max_apex_domains": 0,
"apex_mx": true,
"legacy_forwarding": true,
"catch_all": true,
"retention_days": 0,
"advanced_queue_controls": true
}
}
},
"spend_cap_monthly_cents": 0,
"comped": true,
"overage": {},
"entitlements": {
"agent_inbox": {
"enabled": true,
"max_inboxes": 0,
"inbound_messages_included": 0,
"inbound_messages_metered": true,
"inbound_message_overage_rate_cents": "string",
"max_inbound_domains": 0,
"max_apex_domains": 0,
"apex_mx": true,
"legacy_forwarding": true,
"catch_all": true,
"retention_days": 0,
"advanced_queue_controls": true
}
},
"resources": {
"email": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
},
"sms": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
},
"ai": {
"used": 0,
"allowance": 0,
"remaining": 0,
"overage_rate": 0,
"mode": "budget",
"budget": 0,
"budget_used": 0
}
},
"funding": {},
"provider_route": {},
"brands": {
"used": 0,
"limit": 0,
"remaining": 0,
"unlimited": true,
"can_create": true
},
"lifetime": {
"email_sent": 0,
"sms_sent": 0,
"ai_used": 0
}
},
"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"
}Subscription
objectidintegerplan_idintegerplan_namestring | nullbilling_providerstring | nullshopifystripestripe_projectsvercelawssource_billing_providerstring | nullshopifystripestripe_projectsvercelawsbilling_migration_requiredbooleanmanage_urlstring<uri> | nullspend_cap_monthly_centsinteger | null>= 0Merchant-selected monthly cap for metered usage charges.
shopify_usage_meteredbooleanWhether the active Shopify plan has at least one configured usage meter.
statusstringpendingactiveinactivecanceledfree_tierintervalstringmonthyearweekdaycurrencystringsubtotal_centsintegertax_centsintegertotal_centsintegerbase_price_centsintegerdiscount_centsintegerPer-period Stripe discount in cents (0 when none).
next_payment_centsintegerAmount billed next period
discount_end_atstring<date-time> | nullWhen the discount stops (null for forever/once or no discount).
activatedbooleanentitlementsBillingEntitlements{
"id": 0,
"plan_id": 0,
"plan_name": "string",
"billing_provider": "shopify",
"source_billing_provider": "shopify",
"billing_migration_required": true,
"manage_url": "https://example.com",
"spend_cap_monthly_cents": 0,
"shopify_usage_metered": true,
"status": "pending",
"interval": "month",
"currency": "string",
"subtotal_cents": 0,
"tax_cents": 0,
"total_cents": 0,
"base_price_cents": 0,
"discount_cents": 0,
"next_payment_cents": 0,
"discount_end_at": "2024-01-15T09:30:00Z",
"activated": true,
"entitlements": {
"agent_inbox": {
"enabled": true,
"max_inboxes": 0,
"inbound_messages_included": 0,
"inbound_messages_metered": true,
"inbound_message_overage_rate_cents": "string",
"max_inbound_domains": 0,
"max_apex_domains": 0,
"apex_mx": true,
"legacy_forwarding": true,
"catch_all": true,
"retention_days": 0,
"advanced_queue_controls": true
}
}
}BillingEntitlements
objectagent_inboxAgentInboxEntitlementrequired{
"agent_inbox": {
"enabled": true,
"max_inboxes": 0,
"inbound_messages_included": 0,
"inbound_messages_metered": true,
"inbound_message_overage_rate_cents": "string",
"max_inbound_domains": 0,
"max_apex_domains": 0,
"apex_mx": true,
"legacy_forwarding": true,
"catch_all": true,
"retention_days": 0,
"advanced_queue_controls": true
}
}AgentInboxEntitlement
objectenabledbooleanrequiredmax_inboxesinteger | null>= 0requiredAccount-wide exact-inbox capacity. Null means contract-defined unlimited capacity.
inbound_messages_includedinteger | null>= 0requiredinbound_messages_meteredbooleanrequiredinbound_message_overage_rate_centsstringrequiredmax_inbound_domainsinteger | null>= 0requiredmax_apex_domainsinteger | null>= 0requiredapex_mxbooleanrequiredlegacy_forwardingbooleanrequiredcatch_allbooleanrequiredretention_daysinteger | null>= 0requiredadvanced_queue_controlsbooleanrequired{
"enabled": true,
"max_inboxes": 0,
"inbound_messages_included": 0,
"inbound_messages_metered": true,
"inbound_message_overage_rate_cents": "string",
"max_inbound_domains": 0,
"max_apex_domains": 0,
"apex_mx": true,
"legacy_forwarding": true,
"catch_all": true,
"retention_days": 0,
"advanced_queue_controls": true
}SubscriptionCreateRequest
objectplan_idintegerrequiredstripe_tokenstring | nullStripe card token for paid-plan creation.
coupon_codestring | nullCustomer-entered Stripe promotion code or coupon ID.
{
"plan_id": 0,
"stripe_token": "string",
"coupon_code": "string"
}FundingPurchaseCreateRequest
objectamount_centsinteger>= 1requiredInteger service value in minor currency units.
currencystringinstrumentstringstripe_checkoutshopify_one_timeOptional hosted funding instrument. Omit to use the account default.
paid_action_intent_idstring | nullOptional opaque continuation bound to this funding purchase.
{
"amount_cents": 1,
"currency": "string",
"instrument": "stripe_checkout",
"paid_action_intent_id": "string"
}FundingInstrument
objectinstrumentstringstripe_checkoutshopify_one_timerequiredproviderstringstripeshopifyrequiredmodestringhosted_approvalrequiredavailablebooleanrequiredreasonstring | null{
"instrument": "stripe_checkout",
"provider": "stripe",
"mode": "hosted_approval",
"available": true,
"reason": "string"
}FundingUrlApproval
objectkindstringurlrequiredproviderstringstripeshopifyrequiredurlstring<uri>requiredtargetstringselftoprequired{
"kind": "url",
"provider": "stripe",
"url": "https://example.com",
"target": "self"
}FundingChallengeApproval
objectkindstringchallengerequiredinstrumentstringrequiredprotocolstringrequiredchallengestringrequiredexpires_atstring<date-time> | null{
"kind": "challenge",
"instrument": "string",
"protocol": "string",
"challenge": "string",
"expires_at": "2024-01-15T09:30:00Z"
}FundingApproval
objectkindstringurlrequiredproviderstringstripeshopifyrequiredurlstring<uri>requiredtargetstringselftoprequiredkindstringchallengerequiredinstrumentstringrequiredprotocolstringrequiredchallengestringrequiredexpires_atstring<date-time> | null{
"kind": "url",
"provider": "stripe",
"url": "https://example.com",
"target": "self"
}FundingPurchase
objectidintegerrequiredpaid_action_intent_idstring | nullproviderstringstripeshopifyrequiredinstrumentstringstripe_checkoutshopify_one_timestripe_off_sessionrequiredstatusstringrequestedpendingcheckout_createdcreditedfailedexpiredpartially_reversedreversedrequiredcurrencystringrequiredrequested_centsinteger>= 1requiredrequested_displaystringcheckout_urlstring<uri> | nullapprovalFundingUrlApproval | FundingChallengeApproval | nullexpires_atstring<date-time> | nullcredited_centsinteger>= 0requiredreversed_centsinteger>= 0requiredcreated_atstring<date-time>requiredupdated_atstring<date-time>required{
"id": 0,
"paid_action_intent_id": "string",
"provider": "stripe",
"instrument": "stripe_checkout",
"status": "requested",
"currency": "string",
"requested_cents": 1,
"requested_display": "string",
"checkout_url": "https://example.com",
"approval": {
"kind": "url",
"provider": "stripe",
"url": "https://example.com",
"target": "self"
},
"expires_at": "2024-01-15T09:30:00Z",
"credited_cents": 0,
"reversed_cents": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}FundingPurchaseCapability
objectavailablebooleanrequiredstatestringrequiredreasonstring | nulldefault_instrumentstring | nullstripe_checkoutshopify_one_timeinstrumentsArray<FundingInstrument>requiredcurrencystringrequiredminimum_centsinteger | nullmaximum_centsinteger | nullpreset_centsArray<integer>required{
"available": true,
"state": "string",
"reason": "string",
"default_instrument": "stripe_checkout",
"instruments": [
{
"instrument": "stripe_checkout",
"provider": "stripe",
"mode": "hosted_approval",
"available": true,
"reason": "string"
}
],
"currency": "string",
"minimum_cents": 0,
"maximum_cents": 0,
"preset_cents": [
0
]
}FundingStatus
objectstatestringrequiredapplies_tostringprepaid_featuresrequiredsubscription_gatebooleanrequiredcurrencystringrequiredavailable_centsintegerrequiredreserved_centsintegerrequireddeficit_centsintegerrequiredpurchaseFundingPurchaseCapabilityrequiredpending_purchaseFundingPurchase | null{
"state": "string",
"applies_to": "prepaid_features",
"subscription_gate": true,
"currency": "string",
"available_cents": 0,
"reserved_cents": 0,
"deficit_cents": 0,
"purchase": {
"available": true,
"state": "string",
"reason": "string",
"default_instrument": "stripe_checkout",
"instruments": [
{
"instrument": "stripe_checkout",
"provider": "stripe",
"mode": "hosted_approval",
"available": true,
"reason": "string"
}
],
"currency": "string",
"minimum_cents": 0,
"maximum_cents": 0,
"preset_cents": [
0
]
},
"pending_purchase": {
"id": 0,
"paid_action_intent_id": "string",
"provider": "stripe",
"instrument": "stripe_checkout",
"status": "requested",
"currency": "string",
"requested_cents": 1,
"requested_display": "string",
"checkout_url": "https://example.com",
"approval": {
"kind": "url",
"provider": "stripe",
"url": "https://example.com",
"target": "self"
},
"expires_at": "2024-01-15T09:30:00Z",
"credited_cents": 0,
"reversed_cents": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
}FundingPurchaseResponse
objectpurchaseFundingPurchaserequiredfundingFundingStatusrequired{
"purchase": {
"id": 0,
"paid_action_intent_id": "string",
"provider": "stripe",
"instrument": "stripe_checkout",
"status": "requested",
"currency": "string",
"requested_cents": 1,
"requested_display": "string",
"checkout_url": "https://example.com",
"approval": {
"kind": "url",
"provider": "stripe",
"url": "https://example.com",
"target": "self"
},
"expires_at": "2024-01-15T09:30:00Z",
"credited_cents": 0,
"reversed_cents": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
},
"funding": {
"state": "string",
"applies_to": "prepaid_features",
"subscription_gate": true,
"currency": "string",
"available_cents": 0,
"reserved_cents": 0,
"deficit_cents": 0,
"purchase": {
"available": true,
"state": "string",
"reason": "string",
"default_instrument": "stripe_checkout",
"instruments": [
{
"instrument": "stripe_checkout",
"provider": "stripe",
"mode": "hosted_approval",
"available": true,
"reason": "string"
}
],
"currency": "string",
"minimum_cents": 0,
"maximum_cents": 0,
"preset_cents": [
0
]
},
"pending_purchase": {
"id": 0,
"paid_action_intent_id": "string",
"provider": "stripe",
"instrument": "stripe_checkout",
"status": "requested",
"currency": "string",
"requested_cents": 1,
"requested_display": "string",
"checkout_url": "https://example.com",
"approval": {
"kind": "url",
"provider": "stripe",
"url": "https://example.com",
"target": "self"
},
"expires_at": "2024-01-15T09:30:00Z",
"credited_cents": 0,
"reversed_cents": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
}
}SubscriptionChangeRequest
objectplan_idintegerrequiredcoupon_codestring | nullCustomer-entered Stripe promotion code or coupon ID.
{
"plan_id": 0,
"coupon_code": "string"
}SubscriptionCouponPreviewRequest
objectplan_idintegerrequiredcoupon_codestringrequiredCustomer-entered Stripe promotion code or coupon ID.
{
"plan_id": 0,
"coupon_code": "string"
}SubscriptionCouponPreview
objectcodestringrequireddiscount_labelstringrequireddiscount_centsintegerrequiredsubtotal_centsintegerrequiredtax_centsintegerrequiredtotal_centsintegerrequiredtotal_after_discount_centsintegerrequiredcurrencystringrequired{
"code": "string",
"discount_label": "string",
"discount_cents": 0,
"subtotal_cents": 0,
"tax_cents": 0,
"total_cents": 0,
"total_after_discount_cents": 0,
"currency": "string"
}OAuthPopupAccount
objectidintegerrequirednamestringrequiredaccessAccountAccesscan_managebooleanneeds_subscribebooleanrequired{
"id": 0,
"name": "string",
"access": {
"source": "owner",
"delegated": true,
"manager_account_id": 0,
"manager_account_name": "string",
"management_grant_id": 0,
"permission_set": "operator_v1",
"credential_type": "management"
},
"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<OAuthPopupAccount>requiredplansArray<OAuthPopupPlan>requiredstripe_publishable_keystring | null{
"accounts": [
{
"id": 0,
"name": "string",
"access": {
"source": "owner",
"delegated": true,
"manager_account_id": 0,
"manager_account_name": "string",
"management_grant_id": 0,
"permission_set": "operator_v1",
"credential_type": "management"
},
"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 | nullradiusinteger | null[0, 64]spacing_densitystring | nullcompactnormalspaciousfont_headingstring | nullfont_bodystring | nullheading_sizeinteger | null[12, 48]body_sizeinteger | null[12, 20]brand_documentstring | nullcompany_descriptionstring | 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 | nullfrom_email_domain_statusstringblankverifiedunverifiedAuthorization state of the configured visible From address.
effective_from_emailstring<email> | nullread onlyeffective_reply_tostring<email> | nullread onlyeffective_sending_domainstring | nullread onlyeffective_source_emailstring<email> | nullread onlysender_configuredbooleanread onlyemail_view_onlinebooleanDefault-off brand setting that injects a campaign view-in-browser link when a verified tracking domain is available.
email_track_opensbooleanDefault-on brand setting. When false, this brand's emails carry no open-tracking pixel and opens from mail already sent are not recorded.
email_track_clicksbooleanDefault-on brand setting. When false, this brand's links are not rewritten and clicks from mail already sent are not recorded; delivered links keep working.
test_email_recipientsArray<string>onboarding_stateobjectJSONB — keys are step names, values are completion metadata
onboardingobjectdomain_verifiedbooleancan_sendbooleanbrand_subdomainBrandSubdomain | nullbyo_routingobjectWarns when the brand has connected its own (BYO) email provider but verified sending domains still route through Nitrosend's hosted provider. Read-only; never blocks a send. mismatch is false (and message null) when all is well.
subscribed_contacts_countintegerCount of subscribed contacts in this brand, recounted in the background at most every 10 minutes while the brand is listed or fetched.
logo_urlstring<uri> | nullread onlyscreenshot_urlstring<uri> | nullread onlycapabilitiesobjectsms_provisionedbooleanread onlycreated_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"sid": "string",
"account_id": 0,
"brand_color": "string",
"text_color": "string",
"bg_color": "string",
"radius": 0,
"spacing_density": "compact",
"font_heading": "string",
"font_body": "string",
"heading_size": 12,
"body_size": 12,
"brand_document": "string",
"company_description": "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",
"from_email_domain_status": "blank",
"effective_from_email": "user@example.com",
"effective_reply_to": "user@example.com",
"effective_sending_domain": "string",
"effective_source_email": "user@example.com",
"sender_configured": true,
"email_view_online": true,
"email_track_opens": true,
"email_track_clicks": true,
"test_email_recipients": [
"user@example.com"
],
"onboarding_state": {},
"onboarding": {
"steps": {},
"progress": {
"completed": 0,
"total": 0
}
},
"domain_verified": true,
"can_send": true,
"brand_subdomain": {
"namespace_status": "unreserved",
"status": "brand_identity_required",
"ready": true,
"selected": true,
"preparation_required": true,
"from_email": "user@example.com",
"fqdn": "string",
"apex": "string",
"local_part": "string",
"local_part_editable": true,
"fqdn_changeable": false,
"suggested_subdomain": "string"
},
"byo_routing": {
"mismatch": true,
"provider": "string",
"bypassing_domains": [
"string"
],
"message": "string"
},
"subscribed_contacts_count": 0,
"logo_url": "https://example.com",
"screenshot_url": "https://example.com",
"capabilities": {},
"sms_provisioned": true,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}BrandSubdomain
objectnamespace_statusstringunreservedactivereplacement_pendingretiringretiredrequiredstatusstringbrand_identity_requiredbrand_identity_review_requirednamespace_reservation_requirednot_materializedroot_unavailablereadyunavailablerequiredreadybooleanrequiredselectedbooleanpreparation_requiredbooleanrequiredfrom_emailstring<email>fqdnstringapexstringlocal_partstringlocal_part_editablebooleanfqdn_changeablebooleansuggested_subdomainstring | nullCandidate offered while the brand has no namespace (namespace_status: unreserved): derived from the company name, or from the account owner while the Brand Kit is incomplete. Absent once a name is reserved, because an allocated name never changes, and absent when nothing safe can be derived.
{
"namespace_status": "unreserved",
"status": "brand_identity_required",
"ready": true,
"selected": true,
"preparation_required": true,
"from_email": "user@example.com",
"fqdn": "string",
"apex": "string",
"local_part": "string",
"local_part_editable": true,
"fqdn_changeable": false,
"suggested_subdomain": "string"
}BrandSubdomainPreparationResponse
objectstatusstringreadyunavailablerequiredbrand_subdomainBrandSubdomainrequired{
"status": "ready",
"brand_subdomain": {
"namespace_status": "unreserved",
"status": "brand_identity_required",
"ready": true,
"selected": true,
"preparation_required": true,
"from_email": "user@example.com",
"fqdn": "string",
"apex": "string",
"local_part": "string",
"local_part_editable": true,
"fqdn_changeable": false,
"suggested_subdomain": "string"
}
}AudienceReachFit
objectplan_idintegerrequiredslugstringrequirednamestringrequiredtier_groupstringrequireddaily_capinteger | nullRecipients per 24 hours at the account's sending standing; null when unlimited
capacityinteger | nullEmails available within the month: what remains on the current plan, the first month's allowance on a candidate; null when unlimited
days_to_reachinteger | nullDays until everyone has been reached once; null when the month cannot hold the send
coversbooleanrequiredWhether one full send to the audience fits within the month
{
"plan_id": 0,
"slug": "string",
"name": "string",
"tier_group": "string",
"daily_cap": 0,
"capacity": 0,
"days_to_reach": 0,
"covers": true
}AudienceReach
objectaudienceintegerrequiredcohortstringrequiredThe account's deliverability cohort the daily caps are read at
currentAudienceReachFit | nullThe current plan; null when the account has no subscription
recommendedAudienceReachFit | nullThe cheapest listed plan above the current one whose first month holds the send; null when the current plan covers it or no listed plan would
coveredbooleanrequiredWhether the current plan covers a full send
summarystring | nullThe one sentence every surface shows; null when covered
{
"audience": 0,
"cohort": "string",
"current": {
"plan_id": 0,
"slug": "string",
"name": "string",
"tier_group": "string",
"daily_cap": 0,
"capacity": 0,
"days_to_reach": 0,
"covers": true
},
"recommended": {
"plan_id": 0,
"slug": "string",
"name": "string",
"tier_group": "string",
"daily_cap": 0,
"capacity": 0,
"days_to_reach": 0,
"covers": true
},
"covered": true,
"summary": "string"
}HostedSenderAvailability
objectsubdomainstringrequiredThe normalised label that would be reserved (or the input when unsafe)
fqdnstring | nullavailablebooleanrequiredreasonstring | nulltakenunsafereservedlocal_part_invalidWhy the address is unavailable; null when available
local_partstring | nullThe normalised local part that would be reserved (the allocator's default when none was given), or the input when it is invalid.
from_emailstring | nullThe exact address that would be reserved; null when unavailable for a policy reason
{
"subdomain": "string",
"fqdn": "string",
"available": true,
"reason": "taken",
"local_part": "string",
"from_email": "string"
}BrandDeletionSafetyImpact
objectcontactsinteger>= 0requiredcampaignsinteger>= 0requiredflowsinteger>= 0requiredtemplatesinteger>= 0requireddomainsinteger>= 0requiredmessagesinteger>= 0required{
"contacts": 0,
"campaigns": 0,
"flows": 0,
"templates": 0,
"domains": 0,
"messages": 0
}BrandDeletionSafetyActiveSends
objectqueued_messagesinteger>= 0requiredactive_campaignsinteger>= 0requiredScheduled or live campaigns.
{
"queued_messages": 0,
"active_campaigns": 0
}BrandDeletionSafety
objectdeletion_impactBrandDeletionSafetyImpactrequiredactive_sendsBrandDeletionSafetyActiveSendsrequiredcan_deletebooleanrequiredTrue when no force confirmation is required.
requires_forcebooleanrequiredTrue when active sends require force=true to delete.
{
"deletion_impact": {
"contacts": 0,
"campaigns": 0,
"flows": 0,
"templates": 0,
"domains": 0,
"messages": 0
},
"active_sends": {
"queued_messages": 0,
"active_campaigns": 0
},
"can_delete": true,
"requires_force": true
}AffiliateCenterPayload
objectenrolledbooleanrequiredWhether the account is linked to a Rewardful affiliate.
availablebooleanrequiredWhether live affiliate data or setup is currently available.
statestring | nullactivepausedunavailablesetup_statusstring | nullpendingneeds_detailsunavailablePresent only while an entitled, unlinked account is being reconciled.
share_urlstring<uri> | nullstatsobjectearningsobject{
"enrolled": true,
"available": true,
"state": "active",
"setup_status": "pending",
"share_url": "https://example.com",
"stats": {
"visitors": 0,
"leads": 0,
"conversions": 0
},
"earnings": {
"known": true,
"total_cents": 0,
"currency": "string"
}
}SetupCenterPayload
objectcardsArray<SetupCenterCard>sectionsobjectprogressobjectEach of the four cards counts individually; total is always 4 so every client surface shows the same "N of 4".
seenbooleandismissedbooleancompletebooleanestablishedbooleanTrue when the brand is demonstrably operating: a real email send on a verified sending domain, or two or more distinct campaigns sent. Independent of complete — an established brand may still carry incomplete cards it has chosen to skip. Clients use it to retire setup nudges.
{
"cards": [
{
"id": "brand_kit_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,
"established": true
}SetupCenterCard
objectidstringbrand_kit_scandnsimport_subscribersconnect_agentcompletebooleanacknowledgedbooleanacknowledged_atstring<date-time> | null{
"id": "brand_kit_scan",
"complete": true,
"acknowledged": true,
"acknowledged_at": "2024-01-15T09:30:00Z"
}FieldCatalog
objectidintegerrequiredkeystringrequiredDot-separated field key. Typed contact columns use the bare column name
(e.g. email, first_name). JSONB data keys are prefixed with data.
(e.g. data.plan, data.apollo.title, data.hubspot.company, data.tags).
categorystringcontactcustomenrichmentengagementtagrequiredDerived from the key namespace.
contact— typed column on the contacts tabletag—data.tagsarrayenrichment— reserved enrichment namespaces such asdata.apollo.*,data.pdl.*,data.attio.*,data.hubspot.*,data.stripe.*,data.shopify.*, and deriveddata.nitro.*custom— any otherdata.*keyengagement— future engagement traits (reserved)
field_typestringstringnumberbooleandateenumrequiredInferred from the first observed value; pinned and never flipped.
presentation_typestringtextnumbercurrencypercentdatedatetimebooleanenumrequiredShared presentation contract used by fact displays and generated merge tags.
presentation_optionsobjectrequiredProvider-supplied formatting metadata such as decimal precision, currency-code field path, unit scale, or percentage multiplier.
labelstringrequiredHuman-readable label. Defaults to a humanised version of the key.
display_labelstringSource-qualified field label suitable for display.
source_keystring | nullsource_namestring | nullobject_labelstring | nullsource_field_labelstring | nullmerge_tagstring | nullReady-to-insert merge tag for a scalar custom or projected integration field. Typed fields include the deterministic presentation filter used by preview, test, and delivery rendering.
promotedbooleanrequiredWhether this field is pinned as a default column in the contacts grid.
fill_ratestring | nullPercentage of contacts that have a non-null value for this field. Computed asynchronously; may be null if the refresh job has not run yet.
fill_rate_refreshed_atstring<date-time> | nullWhen fill_rate was last computed.
created_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"key": "string",
"category": "contact",
"field_type": "string",
"presentation_type": "text",
"presentation_options": {},
"label": "string",
"display_label": "string",
"source_key": "string",
"source_name": "string",
"object_label": "string",
"source_field_label": "string",
"merge_tag": "string",
"promoted": true,
"fill_rate": "75.0",
"fill_rate_refreshed_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}DeliveryCapacity
objectsourcestringplanoperator_overridewindow_secondsintegerstatusstringknownunlimitednot_applicableunknowndegradedrequiredlimitinteger | null>= 0requiredreservedinteger | null>= 0requiredacceptedinteger | null>= 0requiredprovider_unknowninteger | null>= 0requiredremaininginteger | null>= 0required{
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
}DeliveryPacingScope
objecttypestringrequiredstatusstringreadydeferredrequirednext_dispatch_atstring<date-time>minimum_interval_secondsnumber>= 0requiredfeedback_epochinteger>= 0required{
"type": "string",
"status": "ready",
"next_dispatch_at": "2024-01-15T09:30:00Z",
"minimum_interval_seconds": 0,
"feedback_epoch": 0
}DeliveryPacingState
objectstatusstringreadydeferredrequiredpolicy_versionstringrequiredqueued_quantityinteger>= 0next_dispatch_atstring<date-time>scopesArray<DeliveryPacingScope>required{
"status": "ready",
"policy_version": "string",
"queued_quantity": 0,
"next_dispatch_at": "2024-01-15T09:30:00Z",
"scopes": [
{
"type": "string",
"status": "ready",
"next_dispatch_at": "2024-01-15T09:30:00Z",
"minimum_interval_seconds": 0,
"feedback_epoch": 0
}
]
}DeliveryStatusIssue
objectcontrolstringaccount_statusbrandsender_identitycommercial_capacityrequiredreason_codestringsending_pausedbrand_unavailablesender_not_readysending_capacity_reacheddelivery_evidence_pendingrequiredretryablebooleanrequiredretry_atstring<date-time>{
"control": "account_status",
"reason_code": "sending_paused",
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}DeliveryStatus
objectassessment_scopestringrequiredadmission_statusstringalloweddeferreddeniedrequiredsending_pauseSendingPauseWhat the owner of a suspended account is told. A deliverability pause names the metric and the fix (reason, what_to_do). Any other suspension is opaque and carries no reason. Recovery actions reach the existing support channel.
commercial_capacityDeliveryCapacityrequiredcapacity_recoveryDeliveryCapacityRecoveryInformational recovery at 80 percent used, exhaustion, or when a campaign exceeds remaining allowance. Never denies a send or promises that payment or verification bypasses safety. Actions come from the shared backend projection; only offer verification when new valid proof can improve standing.
pacing_stateDeliveryPacingStaterequiredblocking_controlstringaccount_statusbrandsender_identitycommercial_capacityreason_codestringissuesArray<DeliveryStatusIssue>requiredretry_atstring<date-time>observed_atstring<date-time>required{
"assessment_scope": "account_capacity",
"admission_status": "allowed",
"sending_pause": {
"sending_paused": true,
"reason": "critical_bounce_rate",
"occurred_at": "2024-01-15T09:30:00Z",
"headline": "string",
"detail": "string",
"what_to_do": [
"string"
],
"request_review": "string",
"recovery_actions": [
{
"type": "verify_list",
"label": "string",
"url": "string"
}
]
},
"commercial_capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"pacing_state": {
"status": "ready",
"policy_version": "string",
"queued_quantity": 0,
"next_dispatch_at": "2024-01-15T09:30:00Z",
"scopes": [
{
"type": "string",
"status": "ready",
"next_dispatch_at": "2024-01-15T09:30:00Z",
"minimum_interval_seconds": 0,
"feedback_epoch": 0
}
]
},
"blocking_control": "account_status",
"reason_code": "string",
"issues": [
{
"control": "account_status",
"reason_code": "sending_paused",
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z"
}
],
"retry_at": "2024-01-15T09:30:00Z",
"observed_at": "2024-01-15T09:30:00Z"
}DeliveryCapacityRecovery
objectInformational recovery at 80 percent used, exhaustion, or when a campaign exceeds remaining allowance. Never denies a send or promises that payment or verification bypasses safety. Actions come from the shared backend projection; only offer verification when new valid proof can improve standing.
statestringapproachingreachedcampaign_exceeds_remainingrequiredreason_codestringsending_capacity_warningsending_capacity_reachedrequiredblocking_controlstringcommercial_capacityrequiredusage_percentinteger[0, 100]requiredrequested_quantityinteger>= 0labelstringrequireddetailstringrequiredcapacityDeliveryCapacityrequiredupgrade_urlstring<uri>Shareable account-specific plan link. Authentication and billing permissions still apply.
retry_atstring<date-time>Recorded retry time, not a guarantee that delivery completes then.
recovery_actionDeliveryCapacityRecoveryActionrequiredrecovery_actionsArray<DeliveryCapacityRecoveryAction>requiredowner_actionDeliveryCapacityRecoveryActionrequired{
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
}DeliveryCapacityRecoveryAction
objecttypestringupgrade_planverify_listcontact_ownermanage_provider_billingcontact_supportrequiredlabelstringrequireddetailstringurlstring<uri>requiredrequired_rolestring{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}ValidationOperationCounts
objectcandidate_countinteger>= 0requireddeduplicated_countinteger>= 0requiredcached_countinteger>= 0requiredineligible_countinteger>= 0requiredeligible_countinteger>= 0requiredpending_countinteger>= 0executing_countinteger>= 0billable_countinteger>= 0not_billable_countinteger>= 0provider_unknown_countinteger>= 0failed_countinteger>= 0{
"candidate_count": 0,
"deduplicated_count": 0,
"cached_count": 0,
"ineligible_count": 0,
"eligible_count": 0,
"pending_count": 0,
"executing_count": 0,
"billable_count": 0,
"not_billable_count": 0,
"provider_unknown_count": 0,
"failed_count": 0
}ValidationOperationPricing
objectprice_book_versionstringrequiredunit_rate_centsstringrequiredmaximum_charge_centsinteger>= 0requiredcommitted_centsinteger>= 0released_centsinteger>= 0currencystringrequiredquote_digeststringexpires_atstring<date-time>requiredexecution_deadline_atstring<date-time> | null{
"price_book_version": "string",
"unit_rate_cents": "string",
"maximum_charge_cents": 0,
"committed_cents": 0,
"released_cents": 0,
"currency": "string",
"quote_digest": "string",
"expires_at": "2024-01-15T09:30:00Z",
"execution_deadline_at": "2024-01-15T09:30:00Z"
}ValidationOperationFunding
objectroutestringrequiredavailablebooleanrequiredreasonstringusage_event_idintegerstatestringneeds_fundingheldcommittedreleasedrecoveryobject{
"route": "direct_prepaid",
"available": true,
"reason": "string",
"usage_event_id": 0,
"state": "needs_funding",
"recovery": {}
}ValidationOperationQuote
objectstatusstringquotedneeds_fundingrequiredsource_kindstringcontact_channelcontactlistsegmentall_contactsrequiredquote_digeststringrequiredcountsValidationOperationCountsrequiredpricingValidationOperationPricingrequiredfundingValidationOperationFundingrequiredspendSpendProjectionrequiredmutationbooleanrequired{
"status": "quoted",
"source_kind": "contact_channel",
"quote_digest": "string",
"counts": {
"candidate_count": 0,
"deduplicated_count": 0,
"cached_count": 0,
"ineligible_count": 0,
"eligible_count": 0,
"pending_count": 0,
"executing_count": 0,
"billable_count": 0,
"not_billable_count": 0,
"provider_unknown_count": 0,
"failed_count": 0
},
"pricing": {
"price_book_version": "string",
"unit_rate_cents": "string",
"maximum_charge_cents": 0,
"committed_cents": 0,
"released_cents": 0,
"currency": "string",
"quote_digest": "string",
"expires_at": "2024-01-15T09:30:00Z",
"execution_deadline_at": "2024-01-15T09:30:00Z"
},
"funding": {
"route": "direct_prepaid",
"available": true,
"reason": "string",
"usage_event_id": 0,
"state": "needs_funding",
"recovery": {}
},
"spend": {
"schema": "nitrosend.spend.v1",
"status": "ready",
"route": "direct_prepaid",
"currency": "string",
"maximum_charge_cents": 0,
"balance": {
"available_cents": 0,
"reserved_cents": 0,
"shortfall_cents": 0
},
"funding": {},
"recovery_action": {
"type": "add_funds",
"reason": "string",
"operation": "add_funds",
"url": "https://example.com",
"purchase_id": 0,
"shortfall_cents": 0,
"minimum_cents": 0,
"maximum_cents": 0,
"recommended_cents": 0,
"preset_cents": [
0
]
}
},
"mutation": false
}ValidationOperation
objectoperation_idstringrequiredstatusstringrequestedquotedheldexecutingpartially_committedcommittedreleasedneeds_fundingfailedrequiredsource_kindstringcontact_channelcontactlistsegmentall_contactsrequireditem_detailobjectrequiredcountsValidationOperationCountsrequiredpricingValidationOperationPricingrequiredfundingValidationOperationFundingrequiredspendSpendProjectionrequiredfailure_codestringstarted_atstring<date-time>completed_atstring<date-time>next_actionstring{
"operation_id": "string",
"status": "requested",
"source_kind": "contact_channel",
"item_detail": {
"status": "available",
"compacted_at": "2024-01-15T09:30:00Z",
"item_count": 0
},
"counts": {
"candidate_count": 0,
"deduplicated_count": 0,
"cached_count": 0,
"ineligible_count": 0,
"eligible_count": 0,
"pending_count": 0,
"executing_count": 0,
"billable_count": 0,
"not_billable_count": 0,
"provider_unknown_count": 0,
"failed_count": 0
},
"pricing": {
"price_book_version": "string",
"unit_rate_cents": "string",
"maximum_charge_cents": 0,
"committed_cents": 0,
"released_cents": 0,
"currency": "string",
"quote_digest": "string",
"expires_at": "2024-01-15T09:30:00Z",
"execution_deadline_at": "2024-01-15T09:30:00Z"
},
"funding": {
"route": "direct_prepaid",
"available": true,
"reason": "string",
"usage_event_id": 0,
"state": "needs_funding",
"recovery": {}
},
"spend": {
"schema": "nitrosend.spend.v1",
"status": "ready",
"route": "direct_prepaid",
"currency": "string",
"maximum_charge_cents": 0,
"balance": {
"available_cents": 0,
"reserved_cents": 0,
"shortfall_cents": 0
},
"funding": {},
"recovery_action": {
"type": "add_funds",
"reason": "string",
"operation": "add_funds",
"url": "https://example.com",
"purchase_id": 0,
"shortfall_cents": 0,
"minimum_cents": 0,
"maximum_cents": 0,
"recommended_cents": 0,
"preset_cents": [
0
]
}
},
"failure_code": "string",
"started_at": "2024-01-15T09:30:00Z",
"completed_at": "2024-01-15T09:30:00Z",
"next_action": "string"
}ValidationOperationItem
objectidintegerrequiredcontact_channel_idintegerrequiredstatusstringpendingexecutingbillablenot_billableprovider_unknownfailedrequiredbillablebooleanproviderstringnative_statusstringverdictstringfailure_codestringresult_referenceobjectcompleted_atstring<date-time>{
"id": 0,
"contact_channel_id": 0,
"status": "pending",
"billable": true,
"provider": "string",
"native_status": "string",
"verdict": "string",
"failure_code": "string",
"result_reference": {},
"completed_at": "2024-01-15T09:30:00Z"
}ContactEnrichmentQuote
objectselected_countintegerrequiredalready_current_countintegerrequiredreusable_countintegerrequiredprovider_required_countintegerrequiredunavailable_countintegerrequiredmaximum_billable_outcomesintegerrequiredresourcestringcontact_profile_enrichmentunit_rate_centsstringrequiredmaximum_charge_centsintegerrequiredcurrencystringUSDrequiredprice_book_versionstringrequiredavailablebooleanrequiredreasonstring | nullspendSpendProjectionrequired{
"selected_count": 0,
"already_current_count": 0,
"reusable_count": 0,
"provider_required_count": 0,
"unavailable_count": 0,
"maximum_billable_outcomes": 0,
"resource": "contact_profile_enrichment",
"unit_rate_cents": "string",
"maximum_charge_cents": 0,
"currency": "USD",
"price_book_version": "string",
"available": true,
"reason": "string",
"spend": {
"schema": "nitrosend.spend.v1",
"status": "ready",
"route": "direct_prepaid",
"currency": "string",
"maximum_charge_cents": 0,
"balance": {
"available_cents": 0,
"reserved_cents": 0,
"shortfall_cents": 0
},
"funding": {},
"recovery_action": {
"type": "add_funds",
"reason": "string",
"operation": "add_funds",
"url": "https://example.com",
"purchase_id": 0,
"shortfall_cents": 0,
"minimum_cents": 0,
"maximum_cents": 0,
"recommended_cents": 0,
"preset_cents": [
0
]
}
}
}SpendProjection
objectschemastringrequiredstatusstringreadyneeds_fundingpayment_pendingblockedunavailablerequiredroutestringdirect_prepaidincludedpostpaidshopifyvercellegacyrequiredcurrencystringrequiredmaximum_charge_centsinteger>= 0requiredbalanceSpendBalancefundingobjectrequiredCanonical account funding projection from Billing::Funding::Presenter.
recovery_actionSpendRecoveryActionrequired{
"schema": "nitrosend.spend.v1",
"status": "ready",
"route": "direct_prepaid",
"currency": "string",
"maximum_charge_cents": 0,
"balance": {
"available_cents": 0,
"reserved_cents": 0,
"shortfall_cents": 0
},
"funding": {},
"recovery_action": {
"type": "add_funds",
"reason": "string",
"operation": "add_funds",
"url": "https://example.com",
"purchase_id": 0,
"shortfall_cents": 0,
"minimum_cents": 0,
"maximum_cents": 0,
"recommended_cents": 0,
"preset_cents": [
0
]
}
}PaidActionIntentCreate
objectadapter_keystringrequiredadapter_versionstringrequiredoperation_idempotency_keystringrequiredstate_payloadobjectrequiredAdapter-owned state, validated and encrypted before persistence.
{
"adapter_key": "string",
"adapter_version": "string",
"operation_idempotency_key": "string",
"state_payload": {}
}PaidActionIntent
objectidstringrequiredOpaque public continuation identifier.
schemastringrequiredstatusstringopenawaiting_fundingready_to_resumeconsumedcancelledexpiredrequiredadapterobjectrequiredoperation_idempotency_keystringrequiredoriginal_quote_fingerprintstringrequiredcurrent_quote_fingerprintstringquote_changedbooleanstate_payloadobjectquoteobjectexpires_atstring<date-time>requiredconsumed_atstring<date-time> | nullcancelled_atstring<date-time> | null{
"id": "string",
"schema": "nitrosend.paid_action_intent.v1",
"status": "open",
"adapter": {
"key": "string",
"version": "string"
},
"operation_idempotency_key": "string",
"original_quote_fingerprint": "string",
"current_quote_fingerprint": "string",
"quote_changed": true,
"state_payload": {},
"quote": {},
"expires_at": "2024-01-15T09:30:00Z",
"consumed_at": "2024-01-15T09:30:00Z",
"cancelled_at": "2024-01-15T09:30:00Z"
}SpendBalance
objectavailable_centsintegerrequiredreserved_centsinteger>= 0requiredshortfall_centsinteger>= 0required{
"available_cents": 0,
"reserved_cents": 0,
"shortfall_cents": 0
}SpendRecoveryAction
objecttypestringadd_fundsretry_add_fundscomplete_checkoutwait_for_paymentask_account_adminmanage_in_shopifymanage_in_marketplacecontact_supportunavailablereasonstringoperationstringadd_fundsurlstring<uri>purchase_idintegershortfall_centsinteger>= 0minimum_centsinteger>= 0maximum_centsinteger>= 0recommended_centsinteger>= 0preset_centsArray<integer>{
"type": "add_funds",
"reason": "string",
"operation": "add_funds",
"url": "https://example.com",
"purchase_id": 0,
"shortfall_cents": 0,
"minimum_cents": 0,
"maximum_cents": 0,
"recommended_cents": 0,
"preset_cents": [
0
]
}ContactEnrichmentFundingRequired
objectcodestringrequiredmessagestringrequirederrorbooleanrequirederror_codestringrequiredcurrencystringrequiredrequired_centsinteger>= 0requiredavailable_centsintegerrequiredreserved_centsinteger>= 0requiredshortfall_centsinteger>= 0requiredfundingobjectrequiredrecovery_actionobjectrequiredspendSpendProjectionrequired{
"code": "insufficient_balance",
"message": "string",
"error": true,
"error_code": "insufficient_balance",
"currency": "string",
"required_cents": 0,
"available_cents": 0,
"reserved_cents": 0,
"shortfall_cents": 0,
"funding": {},
"recovery_action": {},
"spend": {
"schema": "nitrosend.spend.v1",
"status": "ready",
"route": "direct_prepaid",
"currency": "string",
"maximum_charge_cents": 0,
"balance": {
"available_cents": 0,
"reserved_cents": 0,
"shortfall_cents": 0
},
"funding": {},
"recovery_action": {
"type": "add_funds",
"reason": "string",
"operation": "add_funds",
"url": "https://example.com",
"purchase_id": 0,
"shortfall_cents": 0,
"minimum_cents": 0,
"maximum_cents": 0,
"recommended_cents": 0,
"preset_cents": [
0
]
}
}
}ContactEnrichmentDispatch
objectselected_countintegerrequiredqueued_countintegerrequiredalready_current_countintegerrequiredreusable_countintegerrequiredprovider_required_countintegerrequiredunavailable_countintegerrequiredmaximum_charge_centsintegerrequiredcurrencystringUSDrequiredprice_book_versionstringrequiredidempotent_replaybooleanrequired{
"selected_count": 0,
"queued_count": 0,
"already_current_count": 0,
"reusable_count": 0,
"provider_required_count": 0,
"unavailable_count": 0,
"maximum_charge_cents": 0,
"currency": "USD",
"price_book_version": "string",
"idempotent_replay": true
}Contact
objectidintegerbrand_idinteger | nulluuidstring<uuid>first_namestring | nulllast_namestring | nullsourcestring | nullcountry_codestring | nullflag_emojistring | nullUnicode regional-indicator emoji pair derived from country_code (e.g. "🇦🇺"). Null when country_code is blank.
dataobjectCustom key-value data. The reserved key tags holds an array of
string labels used for segmentation and targeting. Reserved enrichment
namespaces such as apollo, pdl, attio, hubspot, stripe,
shopify, and derived nitro may appear when integrations or
enrichment jobs write source-scoped data.
subscribed_phonebooleansubscribed_emailbooleanemailstring<email> | nullConvenience value for the preferred email channel. Full channel detail remains in channels[].
subscribedobjectDenormalized subscription summary by channel family.
verification_statusstringverifiedsuppressedunverifiedenrichment_statusstringenrichednot_enrichedmailbox_providerstringgmailappleoutlookcorporateunknownDerived mailbox provider for the contact's primary email domain. Known consumer domains map to gmail, apple, or outlook; any other valid email domain maps to corporate; unknown means no email is present.
list_idsArray<integer>last_interacted_atstring<date-time> | nullcreated_atstring<date-time>updated_atstring<date-time>engagementobject | nullAggregated email engagement rollup for this contact. All fields are nil-safe: when no rollup row exists yet, rating is "never", counts are 0, rates and timestamps are null.
channelsArray<ContactChannel>{
"id": 0,
"brand_id": 0,
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"first_name": "string",
"last_name": "string",
"source": "string",
"country_code": "string",
"flag_emoji": "string",
"data": {
"tags": [
"vip",
"newsletter"
],
"plan": "pro"
},
"subscribed_phone": true,
"subscribed_email": true,
"email": "user@example.com",
"subscribed": {
"email": true,
"phone": true
},
"verification_status": "verified",
"enrichment_status": "enriched",
"mailbox_provider": "gmail",
"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",
"engagement": {
"rating": "engaged",
"emails_sent": 0,
"unique_opens": 0,
"clicks": 0,
"open_rate": 0,
"click_rate": 0,
"last_opened_at": "2024-01-15T09:30:00Z",
"last_clicked_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"
}ImageAsset
objectmedia_kindstringimagemedia_urlstring<uri>image_urlstring<uri>signed_idstringfilenamestringcontent_typestringbyte_sizeintegerwidthinteger | nullIntrinsic pixel width when detectable.
heightinteger | nullIntrinsic pixel height when detectable.
{
"media_kind": "image",
"media_url": "https://example.com",
"image_url": "https://example.com",
"signed_id": "string",
"filename": "string",
"content_type": "string",
"byte_size": 0,
"width": 0,
"height": 0
}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"
]
}DirectUploadCreateRequest
objectpurposestringimportimagemedia_assetSet to import for CSV contact imports, or image/media_asset for image media assets.
blobobjectrequired{
"purpose": "import",
"blob": {
"filename": "contacts.csv",
"byte_size": 1048576,
"checksum": "string",
"content_type": "text/csv",
"metadata": {}
}
}DirectUpload
objectsigned_idstringSubmit this value to endpoints that consume direct uploads.
filenamestringbyte_sizeintegercontent_typestring | nulldirect_uploadobject{
"signed_id": "string",
"filename": "string",
"byte_size": 0,
"content_type": "string",
"direct_upload": {
"url": "https://example.com",
"headers": {}
}
}ImportPolicy
objectImport limits for the authenticated account, derived from its deliverability standing. Clients render these values and never recompute them.
standingstringrequiredThe account standing the limits derive from.
max_rowsinteger | nullrequiredRow ceiling for one import. Null means no row ceiling for this standing.
max_file_size_bytesintegerrequiredmax_file_size_mbintegerrequiredmax_active_importsintegerrequiredcreate_rate_limit_per_minuteintegerrequireddirect_upload_rate_limit_per_minuteintegerrequiredwrite_modesArray<string>realshadowdry_runrequired{
"standing": "trusted",
"max_rows": null,
"max_file_size_bytes": 2147483648,
"max_file_size_mb": 2048,
"max_active_imports": 10,
"create_rate_limit_per_minute": 10,
"direct_upload_rate_limit_per_minute": 30,
"write_modes": [
"real"
]
}ImportSpec
objectresourcestringcontactsrequiredparserstringdefaultrequireduiobjectrequired_rulesobjectfieldsArray<object>requiredguardrailsImportPolicyrequiredImport limits for the authenticated account, derived from its deliverability standing. Clients render these values and never recompute them.
{
"resource": "contacts",
"parser": "default",
"ui": {},
"required_rules": {},
"fields": [
{}
],
"guardrails": {
"standing": "trusted",
"max_rows": null,
"max_file_size_bytes": 2147483648,
"max_file_size_mb": 2048,
"max_active_imports": 10,
"create_rate_limit_per_minute": 10,
"direct_upload_rate_limit_per_minute": 30,
"write_modes": [
"real"
]
}
}ImportGuardrail
objectHow this import stands against the account's standing row limit.
tierstringautocontact_usrequiredauto when the row count is within the standing limit; contact_us when it is above it and the import halted.
statusstringokcontact_salesrequiredClient-facing guardrail status vocabulary.
standingstringrequiredThe account standing the limit derives from.
max_rowsinteger | nullrequiredRow ceiling for the standing. Null means no row ceiling.
{
"tier": "auto",
"status": "ok",
"standing": "probation",
"max_rows": 250000
}Import
objectidintegerresourcestringcontactsparserstringdefaultstatusstringpendingprocessingfailedcanceledcompletecontact_ustotal_rowsinteger | nullsuccess_rowsinteger | nullfailed_rowsinteger | nullwarning_rowsintegerRows imported after one or more unusable optional channels were skipped.
progressobjectCanonical live-progress block (the single progress representation). pct is the only percent source; a null pct means indeterminate.
import_errorsArray<Array<integer | string>>Row-level errors as [line_number, message, source].
import_warningsArray<Array<integer | string>>Bounded row-level warning samples as [line_number, message, reason].
columnsobject | nulloptionsobject | nullassigned_list_idsArray<integer>assigned_listsArray<object>guardrailImportGuardrailHow this import stands against the account's standing row limit.
started_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,
"warning_rows": 0,
"progress": {
"status": "pending",
"pct": 0,
"stages": [
{
"key": "string",
"label": "string",
"count": 0,
"state": "done"
}
]
},
"import_errors": [
[
0
]
],
"import_warnings": [
[
0
]
],
"columns": {},
"options": {},
"assigned_list_ids": [
0
],
"assigned_lists": [
{
"id": 0,
"name": "string"
}
],
"guardrail": {
"tier": "auto",
"status": "ok",
"standing": "probation",
"max_rows": 250000
},
"started_at": "2024-01-15T09:30:00Z",
"ended_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}Export
objectidintegerresourcestringcontactsformatstringcsvstatusstringpendingprocessingcompletefailedtotal_rowsinteger | nullrows_writtenintegerRows written so far; the live numerator against total_rows.
error_messagestring | nullreadybooleanTrue once the export is complete and the file is available.
download_pathstring | nullPath to download the CSV; present only when ready is true.
progressobjectLive job-progress block, updated as the export streams. status
normalizes the job lifecycle, pct is the completion percentage
(null while the row count is still unknown), and stages is the
ordered Queued to Building to Ready funnel.
started_atstring<date-time> | nullended_atstring<date-time> | nullcreated_atstring<date-time>{
"id": 0,
"resource": "contacts",
"format": "csv",
"status": "pending",
"total_rows": 0,
"rows_written": 0,
"error_message": "string",
"ready": true,
"download_path": "string",
"progress": {
"status": "pending",
"pct": 0,
"stages": [
{
"key": "string",
"label": "string",
"count": 0,
"state": "done"
}
]
},
"started_at": "2024-01-15T09:30:00Z",
"ended_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}SavedView
objectidintegersurfacestringcontactssendingactivitynamestringvisibilitystringprivatesharedfiltersSegmentFilterExpressionlayoutSavedViewLayout | nullTable layout preset for contacts surface views. Only present when surface = contacts.
ownerbooleanTrue when the current user is the creator of this view
created_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"surface": "contacts",
"name": "string",
"visibility": "private",
"layout": {
"columns": [
"string"
],
"sort": {
"field": "string",
"dir": "asc"
}
},
"owner": true,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}SavedViewLayout
objectTable layout preset for contacts surface views. Only present when surface = contacts.
columnsArray<string>Ordered list of column keys to display
sortobject{
"columns": [
"string"
],
"sort": {
"field": "string",
"dir": "asc"
}
}Segment
objectidintegeraccount_idintegerbrand_idinteger | nullnamestringoriginstringusersystemWho owns this segment. user (default) — created and managed by the user;
system — curated by the platform (Champions, Loyal, At-Risk, Dormant, New,
Suppressed, Recently unsubscribed, Bounced).
System segments cannot be renamed or deleted via the API.
filtersSegmentFilterExpressioncached_countinteger | nullLast asynchronously refreshed contact count for this segment.
count_computed_atstring<date-time> | nullWhen cached_count was last refreshed.
created_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"account_id": 0,
"brand_id": 0,
"name": "string",
"origin": "user",
"cached_count": 0,
"count_computed_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}SegmentFilterExpression
objectRequest-side audience filter grammar. Use a flat array for ordinary
AND filters, { "operator": "and", "children": [...] } for the legacy
expression wrapper, or { "op": "and"|"or"|"not", "conditions": [...] }
for nested boolean logic. NOT groups must contain exactly one condition.
operatorstringandrequirednotbooleanfalsefalseLegacy flat-AND wrapper does not carry NOT; use BooleanSegmentFilterGroup for NOT.
childrenArray<AttributeSegmentFilter | any | any>requiredSegment filters are validated fail-closed. Unknown filter names,
globally invalid predicates, type-incompatible predicates, bad date
values, invalid enum values, and unsupported rolling-window filters
return a 422 invalid_filter error instead of silently widening an
audience.
[
{
"name": "string",
"predicate": "string"
}
]FlatAndSegmentFilterExpression
objectoperatorstringandrequirednotbooleanfalsefalseLegacy flat-AND wrapper does not carry NOT; use BooleanSegmentFilterGroup for NOT.
childrenArray<AttributeSegmentFilter | any | any>requiredSegment filters are validated fail-closed. Unknown filter names,
globally invalid predicates, type-incompatible predicates, bad date
values, invalid enum values, and unsupported rolling-window filters
return a 422 invalid_filter error instead of silently widening an
audience.
{
"operator": "and",
"not": false,
"children": [
{
"name": "string",
"predicate": "string"
}
]
}SegmentFilterNode
objectnamestringrequiredFilter name from nitro://schema: contact_first_name, contact_last_name,
contact_phone_number, contact_email, contact_country,
contact_subscribed_phone, contact_subscribed_email,
contact_created_at, contact_last_interacted_at,
contact_source, contact_tag,
contact_engagement_rating, contact_emails_sent, contact_last_opened_at,
contact_last_clicked_at, contact_unique_opens, contact_clicks,
contact_open_rate, contact_click_rate, contact_suppressed,
contact_suppression_reason, contact_bounced, contact_complained,
contact_soft_bounce_count, contact_unsubscribed_at, contact_list.
Catalogued custom and
enrichment fields are exposed as contact_data_
predicatestringrequiredRansack predicate: eq, not_eq, cont, not_cont, start, end,
gt, lt, gteq, lteq, present, blank, true, false, in, not_in,
within_days, not_within_days. Read /v1/my/flows/spec or
nitro://schema for the predicates allowed by each filter type.
valueanyrequiredFilter value — string, number, boolean, array of strings for in/not_in predicates (e.g. ["engaged","warm"] for contact_engagement_rating in), or array of list ids for contact_list.
predicatestringperformednot_performedrequiredpredicatestringcount_at_leastcount_at_mostrequired{
"name": "string",
"predicate": "string"
}BooleanSegmentFilterGroup
objectopstringandornotrequiredconditionsArray<any>requiredNested filter nodes. NOT groups must contain exactly one condition.
{
"op": "and",
"conditions": []
}SegmentFilters
arraySegment filters are validated fail-closed. Unknown filter names,
globally invalid predicates, type-incompatible predicates, bad date
values, invalid enum values, and unsupported rolling-window filters
return a 422 invalid_filter error instead of silently widening an
audience.
[
{
"name": "string",
"predicate": "string"
}
]SegmentPreview
objectcountintegerLive count of contacts matching the supplied filters.
sampleArray<object>Bounded contact sample for quick verification.
overlapArray<object>Bounded overlap with existing segments.
{
"count": 0,
"sample": [
{
"id": 0,
"email": "string",
"name": "string"
}
],
"overlap": [
{
"segment_id": 0,
"name": "string",
"overlap_count": 0
}
]
}AttributeSegmentFilter
objectnamestringrequiredFilter name from nitro://schema: contact_first_name, contact_last_name,
contact_phone_number, contact_email, contact_country,
contact_subscribed_phone, contact_subscribed_email,
contact_created_at, contact_last_interacted_at,
contact_source, contact_tag,
contact_engagement_rating, contact_emails_sent, contact_last_opened_at,
contact_last_clicked_at, contact_unique_opens, contact_clicks,
contact_open_rate, contact_click_rate, contact_suppressed,
contact_suppression_reason, contact_bounced, contact_complained,
contact_soft_bounce_count, contact_unsubscribed_at, contact_list.
Catalogued custom and
enrichment fields are exposed as contact_data_
predicatestringrequiredRansack predicate: eq, not_eq, cont, not_cont, start, end,
gt, lt, gteq, lteq, present, blank, true, false, in, not_in,
within_days, not_within_days. Read /v1/my/flows/spec or
nitro://schema for the predicates allowed by each filter type.
valueanyrequiredFilter value — string, number, boolean, array of strings for in/not_in predicates (e.g. ["engaged","warm"] for contact_engagement_rating in), or array of list ids for contact_list.
{
"name": "string",
"predicate": "string"
}EventSegmentFilter
objectpredicatestringperformednot_performedrequiredpredicatestringcount_at_leastcount_at_mostrequired{
"predicate": "performed"
}Campaign
objectidintegeraccount_idintegerbrand_idinteger | nullstatusstringdraftactivepausedcompletedapproval_statestringdraft_revision_idinteger | nulldraft_revision_digeststring | nulldraft_approval_statestring | nullpending_reviewapprovedrejectedactive_revision_idinteger | nullactive_revision_digeststring | nullhas_unpublished_changesbooleanchannelstringemailsmsnamestringdataobjectscheduled_atstring<date-time> | nullsent_countintegerdashboard_urlstring<uri> | nullCanonical dashboard URL with the /my route prefix.
preview_urlstring<uri> | nullSigned, expiring public preview URL for the current template version.
recipient_snapshotobject | nullLast send snapshot. Values are captured at send time and are not a live audience estimate.
last_send_recipientsinteger | nullAlias for the last dispatched recipient snapshot stored in data.recipients.
deliveryCampaignDeliverySummary | nullPresent while a campaign has a current send token; use /delivery to poll, refresh progress, and receive polling metadata.
engagementEngagementBucket & objectrevenueRevenueReportAttributed revenue from the orders ledger. This block is omitted when the brand has no connected Shopify or Stripe revenue source.
editablebooleanread 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>triggerFlowTriggertemplateTemplate | nulltemplatesArray<Template>{
"id": 0,
"account_id": 0,
"brand_id": 0,
"status": "draft",
"approval_state": "string",
"draft_revision_id": 0,
"draft_revision_digest": "string",
"draft_approval_state": "pending_review",
"active_revision_id": 0,
"active_revision_digest": "string",
"has_unpublished_changes": true,
"channel": "email",
"name": "string",
"data": {},
"scheduled_at": "2024-01-15T09:30:00Z",
"sent_count": 0,
"dashboard_url": "https://example.com",
"preview_url": "https://example.com",
"recipient_snapshot": {
"requested_recipients": 0,
"dispatched_recipients": 0,
"blocked_recipients": 0,
"requested_send_units": 0,
"dispatched_send_units": 0,
"units_per_recipient": 0,
"send_token": "string",
"started_at": "2024-01-15T09:30:00Z",
"completed_at": "2024-01-15T09:30:00Z"
},
"last_send_recipients": 0,
"delivery": {
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"campaign_send_token": "string",
"status": "sending",
"recipients": 0,
"sent": 0,
"failed": 0,
"pending": 0
},
"engagement": {
"sent": 0,
"opens": 0,
"total_opens": 0,
"open_rate": 0,
"account": {
"sent": 0,
"opens": 0,
"total_opens": 0,
"open_rate": 0
}
},
"revenue": {
"attribution_label": "Attributed revenue. Last click, 7-day window.",
"currency": "string",
"mixed_currency": true,
"attributed_revenue_cents": 0,
"delivered": 0,
"attributed_orders": 0,
"revenue_per_recipient": 0,
"conversion_rate": 0,
"attributed_aov": 0,
"message_breakdown": [
{
"message_id": 0,
"subject": "string",
"sent_at": "2024-01-15T09:30:00Z",
"currency": "string",
"mixed_currency": true,
"delivered": 0,
"attributed_orders": 0,
"attributed_revenue_cents": 0,
"revenue_per_recipient": 0,
"conversion_rate": 0,
"attributed_aov": 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
],
"exclude_segment_ids": [
0
],
"exclude_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,
"version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"variables": {},
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"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,
"version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"variables": {},
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}CampaignDeliverySummary
objectcapacity_recoveryDeliveryCapacityRecoveryInformational recovery at 80 percent used, exhaustion, or when a campaign exceeds remaining allowance. Never denies a send or promises that payment or verification bypasses safety. Actions come from the shared backend projection; only offer verification when new valid proof can improve standing.
campaign_send_tokenstring | nullrequiredstatusstringsendingcompletedpausedrequiredrecipientsintegerrequiredRecipient count captured for the active send.
sentintegerrequiredfailedintegerrequiredpendingintegerrequired{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"campaign_send_token": "string",
"status": "sending",
"recipients": 0,
"sent": 0,
"failed": 0,
"pending": 0
}CampaignDeliveryProgress
objectcapacity_recoveryDeliveryCapacityRecoveryInformational recovery at 80 percent used, exhaustion, or when a campaign exceeds remaining allowance. Never denies a send or promises that payment or verification bypasses safety. Actions come from the shared backend projection; only offer verification when new valid proof can improve standing.
campaign_send_tokenstring | nullrequiredstatusstringnot_startedsendingcompletedpausedrequiredrecipientsintegerrequiredRecipient count captured for the active send.
sentintegerrequiredfailedintegerrequiredpendingintegerrequiredterminalbooleanrequiredTrue when clients can stop polling.
poll_after_secondsinteger | nullrequiredSuggested polling delay for active sends.
{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"campaign_send_token": "string",
"status": "not_started",
"recipients": 0,
"sent": 0,
"failed": 0,
"pending": 0,
"terminal": true,
"poll_after_seconds": 0
}MailActionDescription
objectA Mail Action Protocol 0.2 description. The canonical MailSchema core schema is authoritative; this schema restates its shape.
@contextstringhttps://mailschema.org/contexts/map-0.2.jsonldrequired@typestringMailActionrequired@idstring<uri>requiredUUID URN identifying the interaction.
profilestringhttps://mailschema.org/profiles/map/0.2requiredtypeMailActionTypeReferencerequireddescribedAtstring<date-time>requiredexpiresAtstring<date-time>requiredserviceMailActionServicerequiredrecipientstring<email>The address a possession capability was issued to. Present exactly with possession authority.
targetMailActionTargetrequireddetailsobjectDefined by the type contract. Content Review 0.3 names the revision this one supersedes.
operationsArray<MailActionOperation>required{
"@context": "https://mailschema.org/contexts/map-0.2.jsonld",
"@type": "MailAction",
"@id": "https://example.com",
"profile": "https://mailschema.org/profiles/map/0.2",
"type": {
"id": "https://example.com",
"version": "string",
"contractDigest": "string"
},
"describedAt": "2024-01-15T09:30:00Z",
"expiresAt": "2024-01-15T09:30:00Z",
"service": {
"id": "https://example.com",
"name": "string",
"authority": "credential",
"resource": "https://example.com",
"execution": {
"url": "https://example.com",
"resultUrlTemplate": "string",
"resultRetentionSeconds": 300
},
"humanUrl": "https://example.com"
},
"recipient": "user@example.com",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"details": {},
"operations": [
{
"id": "string",
"name": "string",
"description": "string"
}
]
}MailActionTypeReference
objectidstring<uri>requiredversionstringrequiredcontractDigeststringrequired{
"id": "https://example.com",
"version": "string",
"contractDigest": "string"
}MailActionTarget
objectidstring<uri>requiredrevisionstringrequiredtitlestringdigeststringrequired{
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
}MailActionOperation
objectidstringrequirednamestringrequireddescriptionstringrequired{
"id": "string",
"name": "string",
"description": "string"
}MailActionService
objectidstring<uri>requirednamestringrequiredauthoritystringcredentialpossessionrequiredresourcestring<uri>The RFC 9728 protected resource identifier. Present exactly with credential authority.
executionobjectrequiredhumanUrlstring<uri>required{
"id": "https://example.com",
"name": "string",
"authority": "credential",
"resource": "https://example.com",
"execution": {
"url": "https://example.com",
"resultUrlTemplate": "string",
"resultRetentionSeconds": 300
},
"humanUrl": "https://example.com"
}MailActionRequest
objectA MAP 0.2 Content Review request. Its operation decides its input.
kindstringrequiredprofilestringrequiredrequestIdMailActionUuidUrnrequiredA UUID URN, as the MAP 0.2 core defines it.
interactionIdMailActionUuidUrnrequiredA UUID URN, as the MAP 0.2 core defines it.
descriptionDigeststringrequiredSHA-256 over the RFC 8785 canonical form of the description exactly as the email carried it.
typeMailActionTypeReferencerequiredkindstringrequiredprofilestringrequiredrequestIdMailActionUuidUrnrequiredA UUID URN, as the MAP 0.2 core defines it.
interactionIdMailActionUuidUrnrequiredA UUID URN, as the MAP 0.2 core defines it.
descriptionDigeststringrequiredSHA-256 over the RFC 8785 canonical form of the description exactly as the email carried it.
typeMailActionTypeReferencerequired{
"kind": "MapRequest",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"descriptionDigest": "string",
"type": {
"id": "https://example.com",
"version": "string",
"contractDigest": "string"
}
}MailActionRequestEnvelope
objectkindstringrequiredprofilestringrequiredrequestIdMailActionUuidUrnrequiredA UUID URN, as the MAP 0.2 core defines it.
interactionIdMailActionUuidUrnrequiredA UUID URN, as the MAP 0.2 core defines it.
descriptionDigeststringrequiredSHA-256 over the RFC 8785 canonical form of the description exactly as the email carried it.
typeMailActionTypeReferencerequired{
"kind": "MapRequest",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"descriptionDigest": "string",
"type": {
"id": "https://example.com",
"version": "string",
"contractDigest": "string"
}
}MailActionRequestChanges
objectkindstringrequiredprofilestringrequiredrequestIdMailActionUuidUrnrequiredA UUID URN, as the MAP 0.2 core defines it.
interactionIdMailActionUuidUrnrequiredA UUID URN, as the MAP 0.2 core defines it.
descriptionDigeststringrequiredSHA-256 over the RFC 8785 canonical form of the description exactly as the email carried it.
typeMailActionTypeReferencerequired{
"kind": "MapRequest",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"descriptionDigest": "string",
"type": {
"id": "https://example.com",
"version": "string",
"contractDigest": "string"
}
}MailActionApprove
objectkindstringrequiredprofilestringrequiredrequestIdMailActionUuidUrnrequiredA UUID URN, as the MAP 0.2 core defines it.
interactionIdMailActionUuidUrnrequiredA UUID URN, as the MAP 0.2 core defines it.
descriptionDigeststringrequiredSHA-256 over the RFC 8785 canonical form of the description exactly as the email carried it.
typeMailActionTypeReferencerequired{
"kind": "MapRequest",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"descriptionDigest": "string",
"type": {
"id": "https://example.com",
"version": "string",
"contractDigest": "string"
}
}MailActionRequestChangesInput
objectThe input of request-changes.
feedbackstringrequiredReview feedback on the revision; it must contain a character that is not a space.
{
"feedback": "string"
}MailActionApproveInput
objectThe input of approve, which is always empty.
{}MailActionResult
objectkindstringrequiredprofilestringrequiredrequestIdMailActionUuidUrnrequiredA UUID URN, as the MAP 0.2 core defines it.
interactionIdMailActionUuidUrnrequiredA UUID URN, as the MAP 0.2 core defines it.
descriptionDigeststringrequiredtypeMailActionTypeReferencerequiredoperationstringrequest-changesapproverequiredstatestringacceptedcompletedfailedpendingapproval-requiredrequiredtargetMailActionTargetrequiredrecordedAtstring<date-time>requiredresultUrlstring<uri>requiredapprovalUrlstring<uri>Present exactly when the state is approval-required. A person decides there.
reasonstringdeclinedstale-targetexpiredsupersededPresent exactly when the state is failed.
outputobjectrequiredrequest-changes: feedbackRecorded and a service-issued feedbackId. approve: decision approved when completed; empty otherwise.
{
"kind": "MapResult",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"descriptionDigest": "string",
"type": {
"id": "https://example.com",
"version": "string",
"contractDigest": "string"
},
"operation": "request-changes",
"state": "accepted",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"recordedAt": "2024-01-15T09:30:00Z",
"resultUrl": "https://example.com",
"approvalUrl": "https://example.com",
"reason": "declined",
"output": {}
}MailActionProtectedResource
objectRFC 9728 protected resource metadata with the MAP map_services parameter.
resourcestring<uri>requiredresource_namestringbearer_methods_supportedArray<string>headerrequiredmap_servicesArray<object>required{
"resource": "https://example.com",
"resource_name": "string",
"bearer_methods_supported": [
"header"
],
"map_services": [
{
"id": "https://example.com",
"profiles": [
"https://example.com"
],
"execution_url": "https://example.com",
"result_url_template": "string"
}
]
}MailActionProblem
objecttypestring<uri>requiredtitlestringrequiredstatusinteger[400, 599]requireddetailstringrequiredinstancestring<uri>requiredprofilestringrequiredrequestIdMailActionUuidUrnrequiredA UUID URN, as the MAP 0.2 core defines it.
interactionIdMailActionUuidUrnrequiredA UUID URN, as the MAP 0.2 core defines it.
codestringinvalid-requestrefusedresult-not-foundstale-targetidempotency-conflictrequest-in-progressalready-decidedexpired-interactionunsupported-typeunsupported-operationrequiredtargetMailActionTargetFor stale-target, the target the service now holds.
errorsArray<object>For invalid-request input, each problem with a JSON Pointer into the request input.
{
"type": "https://example.com",
"title": "string",
"status": 400,
"detail": "string",
"instance": "https://example.com",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"code": "invalid-request",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"errors": [
{
"detail": "string",
"pointer": "string"
}
]
}MailActionResultNotFoundProblem
objectCorrelated MAP result lookup failure. No interaction identifier is invented when no retained result exists.
typestringrequiredtitlestringrequiredstatusintegerrequireddetailstringrequiredinstancestring<uri>requiredprofilestringrequiredrequestIdMailActionUuidUrnrequiredA UUID URN, as the MAP 0.2 core defines it.
codestringrequired{
"type": "https://mailschema.org/problems/result-not-found",
"title": "string",
"status": 404,
"detail": "string",
"instance": "https://example.com",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"code": "result-not-found"
}MailActionApproval
objectrequest_idMailActionUuidUrnrequiredA UUID URN, as the MAP 0.2 core defines it.
statestringapproval-requiredcompletedfailedrequiredrequested_atstring<date-time>requiredflowobjectrequiredrevisionrevisionrequiredresultMailActionResult | MailActionProblemrequired{
"request_id": "string",
"state": "approval-required",
"requested_at": "2024-01-15T09:30:00Z",
"flow": {
"id": 0,
"name": "string"
},
"revision": {
"id": 0,
"digest": "string",
"approval_state": "pending_review",
"current": true,
"trigger": {
"event": "string"
},
"steps": [
{
"name": "string",
"type": "string",
"wait": 0,
"subject": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"html": "string"
}
]
},
"result": {
"kind": "MapResult",
"profile": "https://mailschema.org/profiles/map/0.2",
"requestId": "string",
"interactionId": "string",
"descriptionDigest": "string",
"type": {
"id": "https://example.com",
"version": "string",
"contractDigest": "string"
},
"operation": "request-changes",
"state": "accepted",
"target": {
"id": "https://example.com",
"revision": "string",
"title": "string",
"digest": "string"
},
"recordedAt": "2024-01-15T09:30:00Z",
"resultUrl": "https://example.com",
"approvalUrl": "https://example.com",
"reason": "declined",
"output": {}
}
}MailActionRevisionReview
objectstatestringapproval-requiredcompletedfailedrequiredflowobjectrequiredrevisionrevisionrequired{
"state": "approval-required",
"flow": {
"id": 0,
"name": "string"
},
"revision": {
"id": 0,
"digest": "string",
"approval_state": "pending_review",
"current": true,
"trigger": {
"event": "string"
},
"steps": [
{
"name": "string",
"type": "string",
"wait": 0,
"subject": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"html": "string"
}
]
}
}HttpProblem
objectPlain RFC 9457 Problem Details for an HTTP answer that is not about a MAP request, made before the body or credential is read.
typestringabout:blankrequiredtitlestringrequiredstatusinteger[400, 599]required{
"type": "about:blank",
"title": "string",
"status": 400
}Message
objectidintegerchannelstringemailsmstostringsubjectstring | nullstatusstringqueuedsentfailedprovider_idstring | nullflow_idinteger | nullSource flow ID (null for transactional)
source_typestring | nullcampaignflowtestcampaign, flow, test, or null (transactional)
source_namestring | nullName of source campaign or flow
status_reason_codestring | nullStable machine-readable reason for a queued or failed message status.
status_reasonstring | nullHuman-readable explanation for a queued or failed message status.
status_reason_categorystring | nullcontent_reviewaccountinternalrecipientproviderrate_limitdeliveryBroad category for status_reason.
failure_codestring | nullStable machine-readable failure reason; present only when status is failed.
failure_reasonstring | nullHuman-readable failure explanation; present only when status is failed.
failure_categorystring | nullcontent_reviewaccountinternalrecipientproviderdeliveryBroad category for failure_reason; present only when status is failed.
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",
"status_reason_code": "string",
"status_reason": "string",
"status_reason_category": "content_review",
"failure_code": "string",
"failure_reason": "string",
"failure_category": "content_review",
"sent_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}Suppression
objectAccount suppression row with bounded source-event diagnostics.
idintegeremailstring<email>reasonstringhard_bouncesoft_bouncecomplaintmanualadminscopestringaccount_scopedactivebooleancontact_idinteger | nullsource_providerstring | nullsource_event_idstring | nullprovider_diagnosticstring | nullBounded diagnostic text extracted from the provider feedback event, when retained.
bounce_typestring | nullhardsoftbounce_subtypestring | nullcomplaint_feedback_typestring | nullevent_occurred_atstring<date-time> | nullexpires_atstring<date-time> | nullcreated_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"email": "user@example.com",
"reason": "hard_bounce",
"scope": "account_scoped",
"active": true,
"contact_id": 0,
"source_provider": "string",
"source_event_id": "string",
"provider_diagnostic": "string",
"bounce_type": "hard",
"bounce_subtype": "string",
"complaint_feedback_type": "string",
"event_occurred_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"
}WebhookEventType
string"email.sent"Webhook
objectidintegerurlstring<uri>eventsArray<WebhookEventType>email.sentemail.deliveredemail.bouncedemail.complainedemail.openedemail.clickedemail.failedemail.receivedenabledbooleanstatusstringactivefailingdisabledfailing while deliveries fail; an endpoint failing for 3 days is turned off.
failing_sincestring<date-time> | nullsecretstringStandard Webhooks signing secret (whsec_...). Masked unless revealed.
last_deliveryobject | nullcreated_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"url": "https://example.com",
"events": [
"email.sent"
],
"enabled": true,
"status": "active",
"failing_since": "2024-01-15T09:30:00Z",
"secret": "string",
"last_delivery": {
"id": 0,
"event_type": "email.sent",
"status": "pending",
"attempts": 0,
"last_response_status": 0,
"updated_at": "2024-01-15T09:30:00Z"
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}WebhookWriteRequest
objecturlstring<uri>HTTPS URL that resolves only to public addresses, without credentials.
eventsArray<WebhookEventType>email.sentemail.deliveredemail.bouncedemail.complainedemail.openedemail.clickedemail.failedemail.receivedenabledboolean{
"url": "https://example.com",
"events": [
"email.sent"
],
"enabled": true
}WebhookDelivery
objectidintegerevent_idstring<uuid>Sent as webhook-id (evt_<event_id>), stable across retries.
event_typeWebhookEventTypeemail.sentemail.deliveredemail.bouncedemail.complainedemail.openedemail.clickedemail.failedemail.receivedstatusstringpendingdeliveredfailedattemptsintegerlast_response_statusinteger | nulllast_errorstring | nullnext_attempt_atstring<date-time>payloadWebhookEventPayloadcreated_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"event_id": "550e8400-e29b-41d4-a716-446655440000",
"event_type": "email.sent",
"status": "pending",
"attempts": 0,
"last_response_status": 0,
"last_error": "string",
"next_attempt_at": "2024-01-15T09:30:00Z",
"payload": {
"type": "email.sent",
"timestamp": "2024-01-15T09:30:00Z",
"data": {
"message_id": 0,
"to": "string",
"subject": "string",
"idempotency_key": "string",
"tags": {},
"test": true,
"sent_at": "2024-01-15T09:30:00Z",
"bounce": {
"type": "hard",
"subtype": "string"
},
"complaint": {
"feedback_type": "string"
},
"url": "string",
"failure": {
"code": "string",
"reason": "string",
"category": "string"
}
}
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}WebhookEventPayload
objecttypeWebhookEventTypeemail.sentemail.deliveredemail.bouncedemail.complainedemail.openedemail.clickedemail.failedemail.receivedrequiredtimestampstring<date-time>requireddataobjectrequired{
"type": "email.sent",
"timestamp": "2024-01-15T09:30:00Z",
"data": {
"message_id": 0,
"to": "string",
"subject": "string",
"idempotency_key": "string",
"tags": {},
"test": true,
"sent_at": "2024-01-15T09:30:00Z",
"bounce": {
"type": "hard",
"subtype": "string"
},
"complaint": {
"feedback_type": "string"
},
"url": "string",
"failure": {
"code": "string",
"reason": "string",
"category": "string"
}
}
}WebhookReceivedEventPayload
objecttypestringemail.receivedrequiredtimestampstring<date-time>requiredWhen the message arrived.
dataobjectrequired{
"type": "email.received",
"timestamp": "2024-01-15T09:30:00Z",
"data": {
"message_id": 0,
"idempotency_key": "string",
"tags": {},
"from": "string",
"to": "string",
"subject": "string",
"text": "string",
"html": "string",
"truncated": true,
"auto_submitted": true,
"attachments": [
{
"id": 0,
"filename": "string",
"content_type": "string",
"size": 0,
"scanned": true
}
],
"conversation_id": 0,
"conversation_message_id": 0,
"test": true
}
}ChatMessage
objectidintegerrolestringuserassistanttoolsystemcontentstringCredential-shaped values are redacted before display.
tool_callsArray<object>actionsArray<object>sequenceintegercreated_atstring<date-time>{
"id": 0,
"role": "user",
"content": "string",
"tool_calls": [
{
"id": "string",
"name": "string",
"input": {},
"safe": true,
"status": "pending",
"approval_token": "string"
}
],
"actions": [
{}
],
"sequence": 0,
"created_at": "2024-01-15T09:30:00Z"
}ChatSession
objectidintegeraccount_idintegerbrand_idintegertitlestringstatusstringactiveclosedfailedstarted_atstring<date-time>last_message_atstring<date-time>message_countintegercreated_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"account_id": 0,
"brand_id": 0,
"title": "string",
"status": "active",
"started_at": "2024-01-15T09:30:00Z",
"last_message_at": "2024-01-15T09:30:00Z",
"message_count": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}ChatSessionDetail
objectidintegeraccount_idintegerbrand_idintegertitlestringstatusstringactiveclosedfailedstarted_atstring<date-time>last_message_atstring<date-time>message_countintegercreated_atstring<date-time>updated_atstring<date-time>messagesArray<ChatMessage>{
"id": 0,
"account_id": 0,
"brand_id": 0,
"title": "string",
"status": "active",
"started_at": "2024-01-15T09:30:00Z",
"last_message_at": "2024-01-15T09:30:00Z",
"message_count": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"messages": [
{
"id": 0,
"role": "user",
"content": "string",
"tool_calls": [
{
"id": "string",
"name": "string",
"input": {},
"safe": true,
"status": "pending",
"approval_token": "string"
}
],
"actions": [
{}
],
"sequence": 0,
"created_at": "2024-01-15T09:30:00Z"
}
]
}Template
objectidintegernamestring | nullflow_idinteger | nullaction_idinteger | nullversionintegersubjectstring | nullbodystring | nullpreheaderstring | nullfrom_namestring | nullfrom_emailstring | nullreply_tostring | nulldesignEmailDesign | nullvariablesobjectgeneration_provenanceGenerationProvenanceCandidate-bound generation evidence. Save endpoints accept only
state: candidate values returned by the generation endpoint. Resource
responses may return state: accepted as read-only history.
created_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"name": "string",
"flow_id": 0,
"action_id": 0,
"version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"variables": {},
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}GenerationProvenance
objectCandidate-bound generation evidence. Save endpoints accept only
state: candidate values returned by the generation endpoint. Resource
responses may return state: accepted as read-only history.
statestringcandidateacceptedrequiredevent_idintegerrequiredcandidate_locatorstringgenerated_slice_digeststringacceptance_idintegersaved_authored_digeststringedit_relationstringidenticaledited{
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
}EmailLibraryTemplate
objectidstringnamestringcategorystringtagsArray<string>descriptionstringsubjectstringSuggested subject line
preheaderstringSuggested preheader
designEmailDesignEmail template design document
preview_htmlstring | nullbranded_designEmailDesignSame layout with palette overrides stripped so brand colors apply
branded_preview_htmlstring | null{
"id": "string",
"name": "string",
"category": "string",
"tags": [
"string"
],
"description": "string",
"subject": "string",
"preheader": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"preview_html": "string",
"branded_design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"branded_preview_html": "string"
}PublicEmailCatalogTemplate
objectidstringrequirednamestringrequiredcategorystringrequiredtagsArray<string>requireddescriptionstringrequiredsubjectstringrequiredpreheaderstringrequireddesignEmailDesignrequiredEmail template design document
{
"id": "string",
"name": "string",
"category": "string",
"tags": [
"string"
],
"description": "string",
"subject": "string",
"preheader": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
}
}TemplateSummary
objectidintegernamestring | nullversionintegerpreview_htmlstring | nullRendered preview, present only with ?include_previews=1
subjectstring | nullpreheaderstring | nullflow_idinteger | nullsection_countintegersection_typesArray<string>created_atstring<date-time>updated_atstring<date-time>{
"id": 0,
"name": "string",
"version": 0,
"preview_html": "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 | nullstatusstringdraftlivepausedarchivedcancelledapproval_statestringnamestringgoalstring | nulltriggerFlowTriggerOutputTrigger as returned by Flow::Format.dump
stepsArray<FlowStepOutput>sent_countintegerengagementEngagementBucket & objectrevenueRevenueReportAttributed revenue from the orders ledger. This block is omitted when the brand has no connected Shopify or Stripe revenue source.
draft_revision_idinteger | nulldraft_revision_digeststring | nulldraft_approval_statestring | nullpending_reviewapprovedrejectedactive_revision_idinteger | nullactive_revision_digeststring | nullhas_unpublished_changesbooleancreated_atstring<date-time>updated_atstring<date-time>templatesArray<Template>{
"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,
"exclude_segment_ids": [
0
],
"data": {}
},
"steps": [],
"sent_count": 0,
"engagement": {
"sent": 0,
"opens": 0,
"total_opens": 0,
"open_rate": 0,
"account": {
"sent": 0,
"opens": 0,
"total_opens": 0,
"open_rate": 0
}
},
"revenue": {
"attribution_label": "Attributed revenue. Last click, 7-day window.",
"currency": "string",
"mixed_currency": true,
"attributed_revenue_cents": 0,
"delivered": 0,
"attributed_orders": 0,
"revenue_per_recipient": 0,
"conversion_rate": 0,
"attributed_aov": 0,
"message_breakdown": [
{
"message_id": 0,
"subject": "string",
"sent_at": "2024-01-15T09:30:00Z",
"currency": "string",
"mixed_currency": true,
"delivered": 0,
"attributed_orders": 0,
"attributed_revenue_cents": 0,
"revenue_per_recipient": 0,
"conversion_rate": 0,
"attributed_aov": 0
}
]
},
"draft_revision_id": 0,
"draft_revision_digest": "string",
"draft_approval_state": "pending_review",
"active_revision_id": 0,
"active_revision_digest": "string",
"has_unpublished_changes": true,
"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,
"version": 0,
"subject": "string",
"body": "string",
"preheader": "string",
"from_name": "string",
"from_email": "string",
"reply_to": "string",
"design": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"variables": {},
"generation_provenance": {
"state": "candidate",
"event_id": 0,
"candidate_locator": "string",
"generated_slice_digest": "string",
"acceptance_id": 0,
"saved_authored_digest": "string",
"edit_relation": "identical"
},
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]
}FlowResumePlan
objectflow_idintegerrequiredstatusstringdraftlivepausedarchivedcancelledrequiredopen_journey_countinteger>= 0requiredcontact_countinteger>= 0requiredwaiting_journey_countinteger>= 0requiredscheduled_journey_countinteger>= 0requiredhas_unpublished_changesbooleanrequireddraft_approval_statestring | nullpending_reviewapprovedrejectedrequires_choicebooleanrequiredallowed_modesArray<string>new_contacts_onlycontinue_existingrequiredrecommended_modestringnew_contacts_onlyrequiredcontinue_release_interval_secondsinteger>= 1required{
"flow_id": 0,
"status": "draft",
"open_journey_count": 0,
"contact_count": 0,
"waiting_journey_count": 0,
"scheduled_journey_count": 0,
"has_unpublished_changes": true,
"draft_approval_state": "pending_review",
"requires_choice": true,
"allowed_modes": [
"new_contacts_only"
],
"recommended_mode": "new_contacts_only",
"continue_release_interval_seconds": 1
}FlowTemplate
objectLean flow template card for index listings.
idstringTemplate slug (e.g. welcome_series)
type_labelstringdescriptionstringcategorystringemail_countintegerstep_countintegerpreview_sectionsArray<object>Section objects from the first email step's design, for template previews.
{
"id": "string",
"type_label": "string",
"description": "string",
"category": "string",
"email_count": 0,
"step_count": 0,
"preview_sections": [
{}
]
}FlowTemplateDetail
objectLean flow template card for index listings.
idstringTemplate slug (e.g. welcome_series)
type_labelstringdescriptionstringcategorystringemail_countintegerstep_countintegerpreview_sectionsArray<object>Section objects from the first email step's design, for template previews.
Full flow template including the graph, ready for POST /v1/my/flows.
triggerobjectTrigger definition (pass as-is to POST /v1/my/flows trigger param)
stepsArray<object>Step definitions (pass as-is to POST /v1/my/flows steps param)
{
"id": "string",
"type_label": "string",
"description": "string",
"category": "string",
"email_count": 0,
"step_count": 0,
"preview_sections": [
{}
],
"trigger": {},
"steps": [
{}
]
}EngagementBucket
objectA (sent, opens, total_opens, open_rate) block. Used both for the resource itself
and, nested as account, for the brand-level lifetime baseline.
sentintegerrequiredTotal emails sent in this bucket.
opensintegerrequiredUnique human open events recorded in this bucket.
total_opensintegerrequiredAll human open events including repeat opens by the same recipient, so
total_opens >= opens. Falls back to opens when only unique-open data exists.
open_ratenumber<float> | nullrequiredOpens divided by sent, rounded to 4 decimal places. Null when sent is below
the meaningful threshold for this bucket — zero for resource buckets, or below
Report::Engagement::ACCOUNT_BASELINE_MIN_SENT for the account bucket.
{
"sent": 0,
"opens": 0,
"total_opens": 0,
"open_rate": 0
}Engagement
objectA (sent, opens, total_opens, open_rate) block. Used both for the resource itself
and, nested as account, for the brand-level lifetime baseline.
sentintegerrequiredTotal emails sent in this bucket.
opensintegerrequiredUnique human open events recorded in this bucket.
total_opensintegerrequiredAll human open events including repeat opens by the same recipient, so
total_opens >= opens. Falls back to opens when only unique-open data exists.
open_ratenumber<float> | nullrequiredOpens divided by sent, rounded to 4 decimal places. Null when sent is below
the meaningful threshold for this bucket — zero for resource buckets, or below
Report::Engagement::ACCOUNT_BASELINE_MIN_SENT for the account bucket.
accountEngagementBucketrequiredA (sent, opens, total_opens, open_rate) block. Used both for the resource itself
and, nested as account, for the brand-level lifetime baseline.
{
"sent": 0,
"opens": 0,
"total_opens": 0,
"open_rate": 0,
"account": {
"sent": 0,
"opens": 0,
"total_opens": 0,
"open_rate": 0
}
}RevenueMessageBreakdown
objectmessage_idintegersubjectstring | nullsent_atstring<date-time> | nullcurrencystring | nullDominant attributed order currency for this message row.
mixed_currencybooleanTrue when attributed orders included more than one currency before dominant-currency filtering.
deliveredintegerattributed_ordersintegerattributed_revenue_centsintegerNet attributed revenue in cents from the orders ledger.
revenue_per_recipientnumber<float> | nullconversion_ratenumber<float> | nullattributed_aovnumber<float> | null{
"message_id": 0,
"subject": "string",
"sent_at": "2024-01-15T09:30:00Z",
"currency": "string",
"mixed_currency": true,
"delivered": 0,
"attributed_orders": 0,
"attributed_revenue_cents": 0,
"revenue_per_recipient": 0,
"conversion_rate": 0,
"attributed_aov": 0
}RevenueReport
objectAttributed revenue from the orders ledger. This block is omitted when the brand has no connected Shopify or Stripe revenue source.
attribution_labelstringcurrencystring | nullDominant attributed order currency used for revenue math. Null when no attributed orders carry a currency.
mixed_currencybooleanTrue when attributed orders included more than one currency before dominant-currency filtering.
attributed_revenue_centsintegerNet attributed revenue in cents from the orders ledger.
deliveredintegerattributed_ordersintegerrevenue_per_recipientnumber<float> | nullNet attributed revenue in major currency units divided by delivered recipients.
conversion_ratenumber<float> | nullAttributed paid orders divided by delivered recipients.
attributed_aovnumber<float> | nullNet attributed revenue in major currency units divided by attributed paid orders.
message_breakdownArray<RevenueMessageBreakdown>{
"attribution_label": "Attributed revenue. Last click, 7-day window.",
"currency": "string",
"mixed_currency": true,
"attributed_revenue_cents": 0,
"delivered": 0,
"attributed_orders": 0,
"revenue_per_recipient": 0,
"conversion_rate": 0,
"attributed_aov": 0,
"message_breakdown": [
{
"message_id": 0,
"subject": "string",
"sent_at": "2024-01-15T09:30:00Z",
"currency": "string",
"mixed_currency": true,
"delivered": 0,
"attributed_orders": 0,
"attributed_revenue_cents": 0,
"revenue_per_recipient": 0,
"conversion_rate": 0,
"attributed_aov": 0
}
]
}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
exclude_segment_idsArray<integer>Segment IDs whose matching contacts are excluded from the recipient set
exclude_contact_list_idsArray<integer>Contact list IDs whose members are excluded from the recipient set
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
],
"exclude_segment_ids": [
0
],
"exclude_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
exclude_segment_idsArray<integer>Segment IDs whose matching contacts are excluded from the recipient set; pass [] to clear
dataobject{
"event": "string",
"audience_type": "lists",
"segment_id": 0,
"contact_list_id": 0,
"contact_list_ids": [
0
],
"exclude_segment_ids": [
0
],
"data": {}
}FlowTriggerOutput
objectTrigger as returned by Flow::Format.dump
eventstringsegment_idinteger | nullcontact_list_idinteger | nullexclude_segment_idsArray<integer>Segment IDs whose matching contacts are excluded from the recipient set
dataobject | null{
"event": "string",
"segment_id": 0,
"contact_list_id": 0,
"exclude_segment_ids": [
0
],
"data": {}
}FlowStepInput
objecttypestringemailsmswaitsplitemit_eventrequiredsubjectstringEmail step: subject line
bodystringSMS body or email plain text
preheaderstringEmail step: preheader
from_namestringfrom_emailstringreply_tostringdesignEmailDesignEmail template design document
durationintegerWait step: seconds
filtersSegmentFilterExpressionyesArray<FlowStepInput>Split step: yes branch
noArray<FlowStepInput>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": {
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
},
"duration": 0,
"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<FlowStepOutput>noArray<FlowStepOutput>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 | nullnamestringproviderstringsesdefault_from_domainstringDomain Nitrosend will use for visible From addresses when this sending domain is selected.
sender_authorization_reasonstringmissing_sender_domainexact_inboxshared_domain_requires_exact_inboxshared_domain_not_verifiedplatform_domainsender_domain_not_authorizedsending_domainunaligned_apex_supportedauthor_identity_not_verifiedauthor_domain_unalignedauthor_domainsender_domain_mismatchMachine-readable reason the default visible From domain is or is not authorized.
integration_idinteger | nullstatusstringpendingverifieddmarc_policystringnonequarantinerejectEffective observed DMARC policy persisted by Nitrosend; defaults to none until observed.
dmarc_recommended_policystringnonequarantinerejectNitrosend's recommended DMARC policy rung.
dmarc_observed_policystring | nullnonequarantinerejectLast live DMARC policy observed by Nitrosend.
dns_recordsDomainDnsRecords | nullinbound_setupDomainInboundSetup | nulldns_healthobject | nulldns_setup_statusstringuncheckedincompletereadyverifiedverified_atstring<date-time> | nullcreated_atstring<date-time>{
"id": 0,
"brand_id": 0,
"name": "string",
"provider": "ses",
"default_from_domain": "string",
"sender_authorization_reason": "missing_sender_domain",
"integration_id": 0,
"status": "pending",
"dmarc_policy": "none",
"dmarc_recommended_policy": "none",
"dmarc_observed_policy": "none",
"dns_records": {
"sending_dns_records": [
{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}
],
"receiving_dns_records": [
{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}
]
},
"inbound_setup": {
"method": "none",
"status": "not_configured",
"mx_scope": "apex",
"inbox": {
"id": 0,
"address": "user@example.com",
"display_name": "string",
"status": "active"
},
"provider_forwarding": {
"provider": "google_workspace",
"forwarding_address": "user@example.com",
"probe_sent_at": "2024-01-15T09:30:00Z",
"verified_at": "2024-01-15T09:30:00Z"
},
"apex_mx": {
"mode": "standalone",
"preparation": {
"state": "queued",
"message": "string",
"failure_code": "string"
},
"prepared": true,
"configured": true,
"approval_required": true,
"approval_expires_at": "2024-01-15T09:30:00Z",
"legacy_provider_label": "string",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
},
"dns_health": {},
"dns_setup_status": "unchecked",
"verified_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
}EntriSessionResponse
objectdomainDomainrequiredentriobjectrequired{
"domain": {
"id": 0,
"brand_id": 0,
"name": "string",
"provider": "ses",
"default_from_domain": "string",
"sender_authorization_reason": "missing_sender_domain",
"integration_id": 0,
"status": "pending",
"dmarc_policy": "none",
"dmarc_recommended_policy": "none",
"dmarc_observed_policy": "none",
"dns_records": {
"sending_dns_records": [
{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}
],
"receiving_dns_records": [
{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}
]
},
"inbound_setup": {
"method": "none",
"status": "not_configured",
"mx_scope": "apex",
"inbox": {
"id": 0,
"address": "user@example.com",
"display_name": "string",
"status": "active"
},
"provider_forwarding": {
"provider": "google_workspace",
"forwarding_address": "user@example.com",
"probe_sent_at": "2024-01-15T09:30:00Z",
"verified_at": "2024-01-15T09:30:00Z"
},
"apex_mx": {
"mode": "standalone",
"preparation": {
"state": "queued",
"message": "string",
"failure_code": "string"
},
"prepared": true,
"configured": true,
"approval_required": true,
"approval_expires_at": "2024-01-15T09:30:00Z",
"legacy_provider_label": "string",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
},
"dns_health": {},
"dns_setup_status": "unchecked",
"verified_at": "2024-01-15T09:30:00Z",
"created_at": "2024-01-15T09:30:00Z"
},
"entri": {
"application_id": "string",
"token": "string",
"prefilled_domain": "string",
"user_id": "string",
"dns_records": [
{
"type": "string",
"host": "string",
"value": "string",
"ttl": 0,
"priority": 0
}
],
"manual_dns_records": {
"sending_dns_records": [
{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}
],
"receiving_dns_records": [
{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}
]
}
}
}EntriSessionRequest
objectapex_mx_overridebooleanfalseExplicitly include the prepared company-inbox MX cutover in this session.
apex_mx_confirmationstringExact apex domain name being approved. Required when apex_mx_override is true.
{
"apex_mx_override": false,
"apex_mx_confirmation": "string"
}EntriSessionValidationError
objectcapacity_recoveryDeliveryCapacityRecoveryInformational recovery at 80 percent used, exhaustion, or when a campaign exceeds remaining allowance. Never denies a send or promises that payment or verification bypasses safety. Actions come from the shared backend projection; only offer verification when new valid proof can improve standing.
recovery_actionobjectContext-specific recovery action, including sending capacity or prepaid funding recovery.
codeintegerrequiredmessagestringrequirederrorbooleanrequirederror_codestring | nullOptional machine-readable error reason.
provisioning_idinteger | nullExisting provisioning row involved in a managed-account conflict.
retryablebooleanWhether retrying the same idempotent operation can succeed.
retry_atstring<date-time>Earliest recommended retry time for a retryable failure.
blockersArray<string>Machine-readable reasons the apex MX cutover cannot proceed.
{
"capacity_recovery": {
"state": "approaching",
"reason_code": "sending_capacity_warning",
"blocking_control": "commercial_capacity",
"usage_percent": 0,
"requested_quantity": 0,
"label": "string",
"detail": "string",
"capacity": {
"source": "plan",
"window_seconds": 86400,
"status": "known",
"limit": 0,
"reserved": 0,
"accepted": 0,
"provider_unknown": 0,
"remaining": 0
},
"upgrade_url": "https://example.com",
"retry_at": "2024-01-15T09:30:00Z",
"recovery_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
},
"recovery_actions": [
{
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
],
"owner_action": {
"type": "upgrade_plan",
"label": "string",
"detail": "string",
"url": "https://example.com",
"required_role": "account_owner_or_admin"
}
},
"recovery_action": {},
"code": 0,
"message": "string",
"error": true,
"error_code": "string",
"provisioning_id": 0,
"retryable": true,
"retry_at": "2024-01-15T09:30:00Z",
"blockers": [
"string"
]
}DomainDnsRecords
objectsending_dns_recordsArray<DomainDnsRecord>receiving_dns_recordsArray<DomainDnsRecord>{
"sending_dns_records": [
{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}
],
"receiving_dns_records": [
{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}
]
}DomainDnsRecord
objectrecord_typestringnamestringrelative_namestringRecord name relative to the registrable domain, as most registrars' Host field expects; @ for the apex.
valuestringprioritystring | nullvalidstring | nullpurposestring | nullrequiredboolean | nullmail_forwardingDomainMailForwarding | null{
"record_type": "string",
"name": "string",
"relative_name": "string",
"value": "string",
"priority": "string",
"valid": "string",
"purpose": "string",
"required": true,
"mail_forwarding": {
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}DomainMailForwarding
objectenabledbooleanrequiredroute_typestringlegacy_forward_allunmatched_forwardrequireddestination_typestringlegacy_mxsmtp_relayrequiredlegacy_mx_recordsArray<MxRecord>requiredsetup_notestringrequired{
"enabled": true,
"route_type": "legacy_forward_all",
"destination_type": "legacy_mx",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}DomainInboundSetupRequest
objectinbound_setupobjectrequired{
"inbound_setup": {
"method": "provider_forwarding",
"provider": "google_workspace",
"local_part": "string",
"display_name": "string",
"prepare": false,
"no_existing_mail_service": false
}
}DomainInboundSetup
objectmethodstringnoneprovider_forwardingmxrequiredstatusstringnot_configuredpendingactiveattentionrequiredmx_scopestring | nullapexsubdomaininboxDomainInboundInbox | nullprovider_forwardingDomainProviderForwarding | nullapex_mxDomainApexMxSetup | null{
"method": "none",
"status": "not_configured",
"mx_scope": "apex",
"inbox": {
"id": 0,
"address": "user@example.com",
"display_name": "string",
"status": "active"
},
"provider_forwarding": {
"provider": "google_workspace",
"forwarding_address": "user@example.com",
"probe_sent_at": "2024-01-15T09:30:00Z",
"verified_at": "2024-01-15T09:30:00Z"
},
"apex_mx": {
"mode": "standalone",
"preparation": {
"state": "queued",
"message": "string",
"failure_code": "string"
},
"prepared": true,
"configured": true,
"approval_required": true,
"approval_expires_at": "2024-01-15T09:30:00Z",
"legacy_provider_label": "string",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}
}DomainInboundInbox
objectidintegerrequiredaddressstring<email>requireddisplay_namestring | nullstatusstringactivedisabledarchivedrequired{
"id": 0,
"address": "user@example.com",
"display_name": "string",
"status": "active"
}DomainProviderForwarding
objectproviderstringgoogle_workspacemicrosoft_365requiredforwarding_addressstring<email>requiredread onlyprobe_sent_atstring<date-time> | nullverified_atstring<date-time> | null{
"provider": "google_workspace",
"forwarding_address": "user@example.com",
"probe_sent_at": "2024-01-15T09:30:00Z",
"verified_at": "2024-01-15T09:30:00Z"
}DomainApexMxSetup
objectmodestringstandaloneforward_allpreparationobjectpreparedbooleanrequiredconfiguredbooleanrequiredapproval_requiredbooleanrequiredapproval_expires_atstring<date-time> | nulllegacy_provider_labelstring | nulllegacy_mx_recordsArray<MxRecord>requiredsetup_notestring | null{
"mode": "standalone",
"preparation": {
"state": "queued",
"message": "string",
"failure_code": "string"
},
"prepared": true,
"configured": true,
"approval_required": true,
"approval_expires_at": "2024-01-15T09:30:00Z",
"legacy_provider_label": "string",
"legacy_mx_records": [
{
"host": "string",
"preference": 0
}
],
"setup_note": "string"
}MxRecord
objecthoststringrequiredpreferenceintegerrequired{
"host": "string",
"preference": 0
}EntriDnsRecord
objecttypestringhoststringvaluestringttlintegerpriorityinteger | null{
"type": "string",
"host": "string",
"value": "string",
"ttl": 0,
"priority": 0
}Integration
objectidintegerproviderstringmailgunsespostmarkresendsendgridtwilioattiohubspotmailchimpstripeshopifyapollocategorystringemailsmscrmrevenueecommercedataactivebooleanprimarybooleanstatusstringpendingconnectederrorconnected_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"
}ShopifyMerchantCredentialRequest
objectshopifyobjectrequired{
"shopify": {
"shop": "string",
"client_id": "string",
"client_secret": "********"
}
}IntegrationWriteRequest
objectintegrationMailgunIntegrationInput | SesIntegrationInput | PostmarkIntegrationInput | ResendIntegrationInput | SendgridIntegrationInputrequired{
"integration": {
"provider": "mailgun",
"api_key": "string",
"domain": "string",
"region": "string",
"active": true
}
}IntegrationSyncConfiguration
objectintegration_idintegerrequiredproviderstringrequiredsync_contractIntegrationSyncContractrequired{
"integration_id": 0,
"provider": "string",
"sync_contract": {
"version": 1,
"mirror_lists": true,
"updated_at": "2024-01-15T09:30:00Z",
"objects": [
{
"object_id": "string",
"object_slug": "string",
"label": "string",
"mode": "addressable",
"enabled": true,
"field_policy": "all_supported",
"selected_fields": [
"string"
],
"excluded_fields": [
"string"
],
"relationship": {
"attribute_slug": "string",
"target_object_slug": "people"
},
"trait_mapping": {
"kind": "deal_pipeline",
"stage_attribute": "string",
"closed_stage_values": [
"string"
],
"amount_attribute": "string",
"currency_attribute": "string"
},
"managed_audience_mapping_key": "string",
"mirror_lists": true
}
]
}
}IntegrationSyncContract
objectversioninteger1requiredmirror_listsbooleanrequiredupdated_atstring<date-time> | nullobjectsArray<IntegrationSyncObjectSelection>required{
"version": 1,
"mirror_lists": true,
"updated_at": "2024-01-15T09:30:00Z",
"objects": [
{
"object_id": "string",
"object_slug": "string",
"label": "string",
"mode": "addressable",
"enabled": true,
"field_policy": "all_supported",
"selected_fields": [
"string"
],
"excluded_fields": [
"string"
],
"relationship": {
"attribute_slug": "string",
"target_object_slug": "people"
},
"trait_mapping": {
"kind": "deal_pipeline",
"stage_attribute": "string",
"closed_stage_values": [
"string"
],
"amount_attribute": "string",
"currency_attribute": "string"
},
"managed_audience_mapping_key": "string",
"mirror_lists": true
}
]
}IntegrationSyncObjectSelection
objectobject_idstringobject_slugstringrequiredlabelstringmodestringaddressablerelatedrequiredenabledbooleantruefield_policystringall_supportedselectedselected_fieldsArray<string>excluded_fieldsArray<string>relationshipobjecttrait_mappingIntegrationSyncTraitMappingmanaged_audience_mapping_keystringmirror_listsboolean{
"object_id": "string",
"object_slug": "string",
"label": "string",
"mode": "addressable",
"enabled": true,
"field_policy": "all_supported",
"selected_fields": [
"string"
],
"excluded_fields": [
"string"
],
"relationship": {
"attribute_slug": "string",
"target_object_slug": "people"
},
"trait_mapping": {
"kind": "deal_pipeline",
"stage_attribute": "string",
"closed_stage_values": [
"string"
],
"amount_attribute": "string",
"currency_attribute": "string"
},
"managed_audience_mapping_key": "string",
"mirror_lists": true
}IntegrationSyncTraitMapping
objectkindstringdeal_pipelinerequiredstage_attributestringrequiredclosed_stage_valuesArray<string>requiredamount_attributestringcurrency_attributestring{
"kind": "deal_pipeline",
"stage_attribute": "string",
"closed_stage_values": [
"string"
],
"amount_attribute": "string",
"currency_attribute": "string"
}IntegrationSyncConfigurationWriteRequest
objectsync_contractIntegrationSyncContractrequired{
"sync_contract": {
"version": 1,
"mirror_lists": true,
"updated_at": "2024-01-15T09:30:00Z",
"objects": [
{
"object_id": "string",
"object_slug": "string",
"label": "string",
"mode": "addressable",
"enabled": true,
"field_policy": "all_supported",
"selected_fields": [
"string"
],
"excluded_fields": [
"string"
],
"relationship": {
"attribute_slug": "string",
"target_object_slug": "people"
},
"trait_mapping": {
"kind": "deal_pipeline",
"stage_attribute": "string",
"closed_stage_values": [
"string"
],
"amount_attribute": "string",
"currency_attribute": "string"
},
"managed_audience_mapping_key": "string",
"mirror_lists": true
}
]
}
}IntegrationSyncDiscovery
objectproviderstringrequiredversioninteger1requiredtruncatedbooleanrequiredobjectsArray<object>required{
"provider": "string",
"version": 1,
"truncated": true,
"objects": [
{
"object_id": "string",
"object_slug": "string",
"singular_noun": "string",
"plural_noun": "string",
"eligible": true,
"recommended_mode": "addressable",
"ineligible_reason": "string",
"attributes_truncated": true,
"attributes": [
{
"attribute_id": "string",
"attribute_slug": "string",
"title": "string",
"type": "string",
"classification": "canonical_scalar",
"required": true,
"unique": true,
"multiselect": true,
"target_object_slugs": [
"string"
],
"options": [
"string"
]
}
],
"relationship_attributes": [
{
"attribute_id": "string",
"attribute_slug": "string",
"title": "string",
"type": "string",
"classification": "canonical_scalar",
"required": true,
"unique": true,
"multiselect": true,
"target_object_slugs": [
"string"
],
"options": [
"string"
]
}
]
}
]
}IntegrationSyncDiscoveredAttribute
objectattribute_idstringrequiredattribute_slugstringrequiredtitlestringtypestringrequiredclassificationstringcanonical_scalarfact_onlyrelationshiprequiredrequiredbooleanuniquebooleanmultiselectbooleantarget_object_slugsArray<string>optionsArray<string>{
"attribute_id": "string",
"attribute_slug": "string",
"title": "string",
"type": "string",
"classification": "canonical_scalar",
"required": true,
"unique": true,
"multiselect": true,
"target_object_slugs": [
"string"
],
"options": [
"string"
]
}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
}Plan
objectidintegernamestringactivebooleanprobation_recipient_cap_24hinteger>= 0standard_recipient_cap_24hinteger>= 0trusted_recipient_cap_24hinteger>= 0Full allowance on earning Trusted; zero represents a contracted unlimited allowance. Credits and safety remain separate.
entitlementsBillingEntitlements{
"id": 0,
"name": "string",
"active": true,
"probation_recipient_cap_24h": 0,
"standard_recipient_cap_24h": 0,
"trusted_recipient_cap_24h": 0,
"entitlements": {
"agent_inbox": {
"enabled": true,
"max_inboxes": 0,
"inbound_messages_included": 0,
"inbound_messages_metered": true,
"inbound_message_overage_rate_cents": "string",
"max_inbound_domains": 0,
"max_apex_domains": 0,
"apex_mx": true,
"legacy_forwarding": true,
"catch_all": true,
"retention_days": 0,
"advanced_queue_controls": true
}
}
}EmailDesign
objectEmail template design document
versioninteger>= 1sectionsArray<EmailSection>themeobjectTheme overrides merged on top of brand theme
{
"version": 1,
"sections": [
{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}
],
"theme": {
"brand_color": "string",
"bg_color": "string",
"text_color": "string",
"font_body": "string",
"font_heading": "string",
"heading_size": 0,
"body_size": 0,
"radius": 0,
"spacing_density": "compact",
"button_background_color": "string",
"button_text_color": "string",
"button_padding": "string",
"logo_url": "string",
"company_name": "string",
"physical_address": "string",
"social_links": [
{
"platform": "string",
"url": "string"
}
]
}
}EmailAccessibilityLint
objectAdvisory accessibility lint result for rendered email previews
validbooleanAlways true while accessibility lint is advisory-only
warningsArray<EmailAccessibilityWarning>{
"valid": true,
"warnings": [
{
"level": "warning",
"rule": "image_alt_text",
"message": "string",
"suggested_fix": "string",
"count": 0,
"min_ratio": 0
}
]
}EmailAccessibilityWarning
objectlevelstringrulestringmessagestringsuggested_fixstringcountintegermin_rationumber<float>{
"level": "warning",
"rule": "image_alt_text",
"message": "string",
"suggested_fix": "string",
"count": 0,
"min_ratio": 0
}EmailSection
objecttypestringheaderherotextimagebuttoncolumnsproductproductsgallerysocialdividerspacerfooterrequiredpropsobjectSection-specific properties (see email component spec)
stylesobject{
"type": "header",
"props": {},
"styles": {
"background_color": "string",
"section_background_color": "string",
"padding": "string",
"align": "left",
"scale": "display",
"font_size": 0,
"text_color": "string",
"shape": "square",
"remove_gap": true,
"border_radius": 0
}
}EmailComponentSpec
objectFull schema for email design sections. Each component has type, description, props (with types, required flags, defaults), and tips.
versionintegerrequireddesign_guidelinesstringrequiredcomponentsArray<object>requiredstyle_attributesArray<object>requiredStandard per-section style attribute registry.
preview_documentobjectrequiredvariablesobjectrequiredMerge variables grouped by source namespace.
filtersArray<object>requiredtheme_attributesArray<object>requiredBrand Kit theme attribute registry (single source of truth for the editor).
{
"version": 0,
"design_guidelines": "string",
"components": [
{
"type": "string",
"description": "string",
"tips": [
"string"
],
"props": {}
}
],
"style_attributes": [
{
"key": "string",
"label": "string",
"type": "color",
"theme_fallback": "string",
"description": "string",
"min": 0,
"max": 0,
"values": [
"string"
],
"target": {
"el": "section",
"attr": "string"
}
}
],
"preview_document": {
"parameter": "string",
"description": "string",
"example": {}
},
"variables": {},
"filters": [
{
"name": "string",
"syntax": "string",
"description": "string"
}
],
"theme_attributes": [
{
"key": "string",
"label": "string",
"type": "color",
"category": "color",
"slot": "string",
"surfaces": [
"string"
],
"min": 0,
"max": 0,
"values": [
"string"
],
"options": [
{
"value": "string",
"label": "string",
"description": "string"
}
],
"transform_table": {},
"column": true,
"storage": "string",
"placeholder": "string",
"value_resolver": "string",
"server_owned": true,
"description": "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>lifecycle_flowsArray<object>Canonical lifecycle flow templates for the flow picker.
{
"filters": {},
"triggers": [
{
"title": "string",
"event": "string"
}
],
"steps": [
{
"type": "string",
"title": "string",
"summary": "string",
"params": {}
}
],
"lifecycle_flows": [
{
"id": "string",
"key": "string",
"goal": "string",
"name": "string",
"description": "string",
"priority": 0,
"trigger": {
"event": "string"
},
"trigger_needs": "string",
"steps": [
{
"type": "string",
"duration": 0,
"subject": "string",
"preheader": "string",
"body": "string",
"design": {}
}
]
}
]
}