curl --request POST \
--url https://api.erdo.ai/v1/dataset-row-actions/test-send \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"dataset": "<string>",
"deliver_to": "<string>",
"row": [
{
"column": "<string>",
"value": "<string>"
}
],
"steps": [
{
"app": "<string>",
"fallback": true,
"for_each": {},
"found_when": "<string>",
"input": {},
"key": "<string>",
"result_path": "<string>",
"script": "<string>"
}
]
}
'import requests
url = "https://api.erdo.ai/v1/dataset-row-actions/test-send"
payload = {
"dataset": "<string>",
"deliver_to": "<string>",
"row": [
{
"column": "<string>",
"value": "<string>"
}
],
"steps": [
{
"app": "<string>",
"fallback": True,
"for_each": {},
"found_when": "<string>",
"input": {},
"key": "<string>",
"result_path": "<string>",
"script": "<string>"
}
]
}
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({
dataset: '<string>',
deliver_to: '<string>',
row: [{column: '<string>', value: '<string>'}],
steps: [
{
app: '<string>',
fallback: true,
for_each: {},
found_when: '<string>',
input: {},
key: '<string>',
result_path: '<string>',
script: '<string>'
}
]
})
};
fetch('https://api.erdo.ai/v1/dataset-row-actions/test-send', 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.erdo.ai/v1/dataset-row-actions/test-send",
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([
'dataset' => '<string>',
'deliver_to' => '<string>',
'row' => [
[
'column' => '<string>',
'value' => '<string>'
]
],
'steps' => [
[
'app' => '<string>',
'fallback' => true,
'for_each' => [
],
'found_when' => '<string>',
'input' => [
],
'key' => '<string>',
'result_path' => '<string>',
'script' => '<string>'
]
]
]),
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.erdo.ai/v1/dataset-row-actions/test-send"
payload := strings.NewReader("{\n \"dataset\": \"<string>\",\n \"deliver_to\": \"<string>\",\n \"row\": [\n {\n \"column\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"steps\": [\n {\n \"app\": \"<string>\",\n \"fallback\": true,\n \"for_each\": {},\n \"found_when\": \"<string>\",\n \"input\": {},\n \"key\": \"<string>\",\n \"result_path\": \"<string>\",\n \"script\": \"<string>\"\n }\n ]\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.erdo.ai/v1/dataset-row-actions/test-send")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"dataset\": \"<string>\",\n \"deliver_to\": \"<string>\",\n \"row\": [\n {\n \"column\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"steps\": [\n {\n \"app\": \"<string>\",\n \"fallback\": true,\n \"for_each\": {},\n \"found_when\": \"<string>\",\n \"input\": {},\n \"key\": \"<string>\",\n \"result_path\": \"<string>\",\n \"script\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.erdo.ai/v1/dataset-row-actions/test-send")
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 \"dataset\": \"<string>\",\n \"deliver_to\": \"<string>\",\n \"row\": [\n {\n \"column\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"steps\": [\n {\n \"app\": \"<string>\",\n \"fallback\": true,\n \"for_each\": {},\n \"found_when\": \"<string>\",\n \"input\": {},\n \"key\": \"<string>\",\n \"result_path\": \"<string>\",\n \"script\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"sent": true,
"skipped": "<string>",
"subject": "<string>",
"to": "<string>"
}{
"code": "not_found",
"details": {},
"message": "<string>"
}Renders the email a declaration would produce for one sample row and delivers
it to one nominated address, so somebody drafting a lead welcome message sees the real thing in their own inbox before it is switched on for real rows.
The message is rendered by the same template engine the live automation uses, never a second renderer. Two properties bound what this can do: the steps must be zero or more script steps followed by exactly one erdo/send_email step, so no paid, provider-facing or approval-gated action is ever invoked on demand; and deliver_to is the only address it can reach, replacing whatever the declaration’s own recipient renders to.
curl --request POST \
--url https://api.erdo.ai/v1/dataset-row-actions/test-send \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"dataset": "<string>",
"deliver_to": "<string>",
"row": [
{
"column": "<string>",
"value": "<string>"
}
],
"steps": [
{
"app": "<string>",
"fallback": true,
"for_each": {},
"found_when": "<string>",
"input": {},
"key": "<string>",
"result_path": "<string>",
"script": "<string>"
}
]
}
'import requests
url = "https://api.erdo.ai/v1/dataset-row-actions/test-send"
payload = {
"dataset": "<string>",
"deliver_to": "<string>",
"row": [
{
"column": "<string>",
"value": "<string>"
}
],
"steps": [
{
"app": "<string>",
"fallback": True,
"for_each": {},
"found_when": "<string>",
"input": {},
"key": "<string>",
"result_path": "<string>",
"script": "<string>"
}
]
}
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({
dataset: '<string>',
deliver_to: '<string>',
row: [{column: '<string>', value: '<string>'}],
steps: [
{
app: '<string>',
fallback: true,
for_each: {},
found_when: '<string>',
input: {},
key: '<string>',
result_path: '<string>',
script: '<string>'
}
]
})
};
fetch('https://api.erdo.ai/v1/dataset-row-actions/test-send', 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.erdo.ai/v1/dataset-row-actions/test-send",
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([
'dataset' => '<string>',
'deliver_to' => '<string>',
'row' => [
[
'column' => '<string>',
'value' => '<string>'
]
],
'steps' => [
[
'app' => '<string>',
'fallback' => true,
'for_each' => [
],
'found_when' => '<string>',
'input' => [
],
'key' => '<string>',
'result_path' => '<string>',
'script' => '<string>'
]
]
]),
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.erdo.ai/v1/dataset-row-actions/test-send"
payload := strings.NewReader("{\n \"dataset\": \"<string>\",\n \"deliver_to\": \"<string>\",\n \"row\": [\n {\n \"column\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"steps\": [\n {\n \"app\": \"<string>\",\n \"fallback\": true,\n \"for_each\": {},\n \"found_when\": \"<string>\",\n \"input\": {},\n \"key\": \"<string>\",\n \"result_path\": \"<string>\",\n \"script\": \"<string>\"\n }\n ]\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.erdo.ai/v1/dataset-row-actions/test-send")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"dataset\": \"<string>\",\n \"deliver_to\": \"<string>\",\n \"row\": [\n {\n \"column\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"steps\": [\n {\n \"app\": \"<string>\",\n \"fallback\": true,\n \"for_each\": {},\n \"found_when\": \"<string>\",\n \"input\": {},\n \"key\": \"<string>\",\n \"result_path\": \"<string>\",\n \"script\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.erdo.ai/v1/dataset-row-actions/test-send")
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 \"dataset\": \"<string>\",\n \"deliver_to\": \"<string>\",\n \"row\": [\n {\n \"column\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"steps\": [\n {\n \"app\": \"<string>\",\n \"fallback\": true,\n \"for_each\": {},\n \"found_when\": \"<string>\",\n \"input\": {},\n \"key\": \"<string>\",\n \"result_path\": \"<string>\",\n \"script\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"sent": true,
"skipped": "<string>",
"subject": "<string>",
"to": "<string>"
}{
"code": "not_found",
"details": {},
"message": "<string>"
}Authorizations
An Erdo API key (erdo_api_...) or scoped token (erdo_token_...).
Body
and authorised exactly as a save would resolve it: testing what you are about to declare is the same privilege as declaring it.
address a test send can ever reach. Whatever the declaration's own `to` renders to is replaced with it.
Show child attributes
Show child attributes
takes them. A test send accepts one shape only: zero or more script steps followed by exactly one erdo/send_email step. Any other action is refused, so nothing paid or approval-gated is ever invoked to answer this call.
Show child attributes
Show child attributes
Response
Success response

