curl --request POST \
--url https://api.tented.ai/v1/email-blasts/{blastId}/schedule \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"scheduled_at": "2023-11-07T05:31:56Z",
"operational": true
}
'import requests
url = "https://api.tented.ai/v1/email-blasts/{blastId}/schedule"
payload = {
"scheduled_at": "2023-11-07T05:31:56Z",
"operational": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({scheduled_at: '2023-11-07T05:31:56Z', operational: true})
};
fetch('https://api.tented.ai/v1/email-blasts/{blastId}/schedule', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.tented.ai/v1/email-blasts/{blastId}/schedule",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'scheduled_at' => '2023-11-07T05:31:56Z',
'operational' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.tented.ai/v1/email-blasts/{blastId}/schedule"
payload := strings.NewReader("{\n \"scheduled_at\": \"2023-11-07T05:31:56Z\",\n \"operational\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.tented.ai/v1/email-blasts/{blastId}/schedule")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"scheduled_at\": \"2023-11-07T05:31:56Z\",\n \"operational\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tented.ai/v1/email-blasts/{blastId}/schedule")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"scheduled_at\": \"2023-11-07T05:31:56Z\",\n \"operational\": true\n}"
response = http.request(request)
puts response.read_body{
"blast_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "<string>",
"name": "<string>",
"status": "draft",
"description": "<string>",
"audience_list_id": "<string>",
"audience_source": "<string>",
"audience": {
"list_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"source": "<string>",
"name": "<string>",
"kind": "<string>",
"member_count": 123
},
"email_id": "<string>",
"email_source": "<string>",
"email": {
"email_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"source": "<string>",
"name": "<string>",
"status": "<string>",
"subject": "<string>",
"current_version": 123,
"approved_version": 123
},
"operational": true,
"scheduled_at": "2023-11-07T05:31:56Z",
"approved_at": "2023-11-07T05:31:56Z",
"approved_email_version": 123,
"sent_at": "2023-11-07T05:31:56Z",
"send_mode": "<string>",
"details": {
"blast_recipient_count": 123,
"blast_qualified_count": 123,
"blast_sent_count": 123,
"blast_failed_count": 123,
"blast_blocked_count": 123,
"blast_audience_truncated": true,
"blast_delivered_count": 123,
"blast_opened_count": 123,
"blast_clicked_count": 123,
"blast_bounced_count": 123,
"blast_spam_count": 123,
"blast_unsubscribed_count": 123
},
"approval_readiness": {
"ready": true,
"missing": [
"<string>"
],
"warnings": [
"<string>"
]
},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}{
"error": "<string>",
"error_code": "<string>",
"message": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"current": 123
}{
"error": "<string>",
"error_code": "<string>",
"message": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"current": 123
}{
"error": "<string>",
"error_code": "<string>",
"message": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"current": 123
}{
"error": "<string>",
"error_code": "<string>",
"message": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"current": 123
}Schedule a blast
Schedule the send. The blast must be ready (approved email, audience, valid future time) — otherwise 400 campaign_not_ready with an approval_readiness breakdown.
curl --request POST \
--url https://api.tented.ai/v1/email-blasts/{blastId}/schedule \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"scheduled_at": "2023-11-07T05:31:56Z",
"operational": true
}
'import requests
url = "https://api.tented.ai/v1/email-blasts/{blastId}/schedule"
payload = {
"scheduled_at": "2023-11-07T05:31:56Z",
"operational": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({scheduled_at: '2023-11-07T05:31:56Z', operational: true})
};
fetch('https://api.tented.ai/v1/email-blasts/{blastId}/schedule', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.tented.ai/v1/email-blasts/{blastId}/schedule",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'scheduled_at' => '2023-11-07T05:31:56Z',
'operational' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.tented.ai/v1/email-blasts/{blastId}/schedule"
payload := strings.NewReader("{\n \"scheduled_at\": \"2023-11-07T05:31:56Z\",\n \"operational\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.tented.ai/v1/email-blasts/{blastId}/schedule")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"scheduled_at\": \"2023-11-07T05:31:56Z\",\n \"operational\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tented.ai/v1/email-blasts/{blastId}/schedule")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"scheduled_at\": \"2023-11-07T05:31:56Z\",\n \"operational\": true\n}"
response = http.request(request)
puts response.read_body{
"blast_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "<string>",
"name": "<string>",
"status": "draft",
"description": "<string>",
"audience_list_id": "<string>",
"audience_source": "<string>",
"audience": {
"list_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"source": "<string>",
"name": "<string>",
"kind": "<string>",
"member_count": 123
},
"email_id": "<string>",
"email_source": "<string>",
"email": {
"email_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"source": "<string>",
"name": "<string>",
"status": "<string>",
"subject": "<string>",
"current_version": 123,
"approved_version": 123
},
"operational": true,
"scheduled_at": "2023-11-07T05:31:56Z",
"approved_at": "2023-11-07T05:31:56Z",
"approved_email_version": 123,
"sent_at": "2023-11-07T05:31:56Z",
"send_mode": "<string>",
"details": {
"blast_recipient_count": 123,
"blast_qualified_count": 123,
"blast_sent_count": 123,
"blast_failed_count": 123,
"blast_blocked_count": 123,
"blast_audience_truncated": true,
"blast_delivered_count": 123,
"blast_opened_count": 123,
"blast_clicked_count": 123,
"blast_bounced_count": 123,
"blast_spam_count": 123,
"blast_unsubscribed_count": 123
},
"approval_readiness": {
"ready": true,
"missing": [
"<string>"
],
"warnings": [
"<string>"
]
},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}{
"error": "<string>",
"error_code": "<string>",
"message": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"current": 123
}{
"error": "<string>",
"error_code": "<string>",
"message": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"current": 123
}{
"error": "<string>",
"error_code": "<string>",
"message": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"current": 123
}{
"error": "<string>",
"error_code": "<string>",
"message": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"current": 123
}Authorizations
Workspace API key, e.g. Authorization: Bearer tented_.... Create keys in Workspace Settings → API Keys.
Path Parameters
Blast ID.
Body
Response
Scheduled.
An email blast. approval_readiness is included only while the blast is a draft.
Blast ID.
Always email_blast.
Blast name.
Lifecycle state.
draft, scheduled, sending, sent, failed, cancelled, archived Description.
List backing the audience.
existing or inline.
Attached audience, or null when not set.
Show child attributes
Show child attributes
Email attached to the blast.
existing or inline.
Attached email summary, or null when not set.
Show child attributes
Show child attributes
True for operational/transactional sends: unsubscribed contacts are not suppressed and the unsubscribe footer is skipped.
Scheduled send time (UTC).
When the attached email was approved for this blast.
Email version locked in for the send.
When the send completed.
scheduled or send_now.
Send and engagement counters.
Show child attributes
Show child attributes
Readiness summary included on draft blasts and on campaign_not_ready errors.
Show child attributes
Show child attributes
Creation time.
Last update.