curl --request POST \
--url https://api.parallellabs.app/api/v0/marketing-campaign-templates/{templateId}/chat \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"companyId": "<string>",
"message": "<string>",
"threadId": "<string>",
"clientMessageId": "<string>",
"attachments": [
{}
],
"bodyDocument": "<string>",
"variables": [
"<string>"
]
}
'import requests
url = "https://api.parallellabs.app/api/v0/marketing-campaign-templates/{templateId}/chat"
payload = {
"companyId": "<string>",
"message": "<string>",
"threadId": "<string>",
"clientMessageId": "<string>",
"attachments": [{}],
"bodyDocument": "<string>",
"variables": ["<string>"]
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
companyId: '<string>',
message: '<string>',
threadId: '<string>',
clientMessageId: '<string>',
attachments: [{}],
bodyDocument: '<string>',
variables: ['<string>']
})
};
fetch('https://api.parallellabs.app/api/v0/marketing-campaign-templates/{templateId}/chat', 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.parallellabs.app/api/v0/marketing-campaign-templates/{templateId}/chat",
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([
'companyId' => '<string>',
'message' => '<string>',
'threadId' => '<string>',
'clientMessageId' => '<string>',
'attachments' => [
[
]
],
'bodyDocument' => '<string>',
'variables' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.parallellabs.app/api/v0/marketing-campaign-templates/{templateId}/chat"
payload := strings.NewReader("{\n \"companyId\": \"<string>\",\n \"message\": \"<string>\",\n \"threadId\": \"<string>\",\n \"clientMessageId\": \"<string>\",\n \"attachments\": [\n {}\n ],\n \"bodyDocument\": \"<string>\",\n \"variables\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.parallellabs.app/api/v0/marketing-campaign-templates/{templateId}/chat")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"companyId\": \"<string>\",\n \"message\": \"<string>\",\n \"threadId\": \"<string>\",\n \"clientMessageId\": \"<string>\",\n \"attachments\": [\n {}\n ],\n \"bodyDocument\": \"<string>\",\n \"variables\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.parallellabs.app/api/v0/marketing-campaign-templates/{templateId}/chat")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"companyId\": \"<string>\",\n \"message\": \"<string>\",\n \"threadId\": \"<string>\",\n \"clientMessageId\": \"<string>\",\n \"attachments\": [\n {}\n ],\n \"bodyDocument\": \"<string>\",\n \"variables\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Chat with the visual builder AI agent about a template's email design.
Streams typed server-sent events (text / tool_call / tool_result / files_changed / done / error). The agent edits the template’s bodyDocument, starting from the bodyDocument sent in the request; each edit is saved and versioned like a visual builder save, and emits files_changed.
curl --request POST \
--url https://api.parallellabs.app/api/v0/marketing-campaign-templates/{templateId}/chat \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"companyId": "<string>",
"message": "<string>",
"threadId": "<string>",
"clientMessageId": "<string>",
"attachments": [
{}
],
"bodyDocument": "<string>",
"variables": [
"<string>"
]
}
'import requests
url = "https://api.parallellabs.app/api/v0/marketing-campaign-templates/{templateId}/chat"
payload = {
"companyId": "<string>",
"message": "<string>",
"threadId": "<string>",
"clientMessageId": "<string>",
"attachments": [{}],
"bodyDocument": "<string>",
"variables": ["<string>"]
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
companyId: '<string>',
message: '<string>',
threadId: '<string>',
clientMessageId: '<string>',
attachments: [{}],
bodyDocument: '<string>',
variables: ['<string>']
})
};
fetch('https://api.parallellabs.app/api/v0/marketing-campaign-templates/{templateId}/chat', 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.parallellabs.app/api/v0/marketing-campaign-templates/{templateId}/chat",
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([
'companyId' => '<string>',
'message' => '<string>',
'threadId' => '<string>',
'clientMessageId' => '<string>',
'attachments' => [
[
]
],
'bodyDocument' => '<string>',
'variables' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.parallellabs.app/api/v0/marketing-campaign-templates/{templateId}/chat"
payload := strings.NewReader("{\n \"companyId\": \"<string>\",\n \"message\": \"<string>\",\n \"threadId\": \"<string>\",\n \"clientMessageId\": \"<string>\",\n \"attachments\": [\n {}\n ],\n \"bodyDocument\": \"<string>\",\n \"variables\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.parallellabs.app/api/v0/marketing-campaign-templates/{templateId}/chat")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"companyId\": \"<string>\",\n \"message\": \"<string>\",\n \"threadId\": \"<string>\",\n \"clientMessageId\": \"<string>\",\n \"attachments\": [\n {}\n ],\n \"bodyDocument\": \"<string>\",\n \"variables\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.parallellabs.app/api/v0/marketing-campaign-templates/{templateId}/chat")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"companyId\": \"<string>\",\n \"message\": \"<string>\",\n \"threadId\": \"<string>\",\n \"clientMessageId\": \"<string>\",\n \"attachments\": [\n {}\n ],\n \"bodyDocument\": \"<string>\",\n \"variables\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Authorizations
Company API key - scoped to a specific company. Generate from the Integrations page in your dashboard.
Path Parameters
Body
Chat message
Chat message for the visual email builder agent
Company ID
User message
Thread to continue (defaults to the active thread)
Client-generated id for the user message
Image attachments (design references)
The document currently open in the visual builder, including unsaved edits. The agent starts from it; defaults to the saved bodyDocument
Smart list field tokens (without braces) the email may use
Response
Missing required fields
Error message

