curl --request POST \
--url https://{subdomain}.conveyour.com/api/contacts/compile/{id} \
--header 'Content-Type: application/json' \
--header 'x-conveyour-token: <api-key>' \
--data '
{
"content": "Hi {{ contact.first_name }}, your badge is {{ contact.badge_number }}.",
"format": "text",
"inputs": {}
}
'const options = {
method: 'POST',
headers: {'x-conveyour-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
content: 'Hi {{ contact.first_name }}, your badge is {{ contact.badge_number }}.',
format: 'text',
inputs: {}
})
};
fetch('https://{subdomain}.conveyour.com/api/contacts/compile/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const options = {
method: 'POST',
headers: {'x-conveyour-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
content: 'Hi {{ contact.first_name }}, your badge is {{ contact.badge_number }}.',
format: 'text',
inputs: {}
})
};
fetch('https://{subdomain}.conveyour.com/api/contacts/compile/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{subdomain}.conveyour.com/api/contacts/compile/{id}"
payload = {
"content": "Hi {{ contact.first_name }}, your badge is {{ contact.badge_number }}.",
"format": "text",
"inputs": {}
}
headers = {
"x-conveyour-token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{subdomain}.conveyour.com/api/contacts/compile/{id}",
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([
'content' => 'Hi {{ contact.first_name }}, your badge is {{ contact.badge_number }}.',
'format' => 'text',
'inputs' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-conveyour-token: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"status": "ok",
"message": "Content compiled",
"data": {
"content": "Hi Jane, your badge is 1234."
}
}{
"status": "failed",
"message": "Lacking necessary permission add_contacts",
"data": {
"permission": "add_contacts"
}
}Compile content for a contact
Compiles Liquid template content in the context of a specific contact. If no contact ID is provided, a dummy contact is used. Useful for previewing personalized messages before sending.
See the Liquid syntax guide for available variables and filters.
Requires the contacts permission on the service account that owns your API key. A key whose service account lacks it fails with "Lacking necessary permission contacts".
A missing record does not return 404. This handler reports the failure without a status code, and the error envelope defaults to HTTP 200 — you get 200 with status: "failed". Branch on status, not on the HTTP code.
curl --request POST \
--url https://{subdomain}.conveyour.com/api/contacts/compile/{id} \
--header 'Content-Type: application/json' \
--header 'x-conveyour-token: <api-key>' \
--data '
{
"content": "Hi {{ contact.first_name }}, your badge is {{ contact.badge_number }}.",
"format": "text",
"inputs": {}
}
'const options = {
method: 'POST',
headers: {'x-conveyour-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
content: 'Hi {{ contact.first_name }}, your badge is {{ contact.badge_number }}.',
format: 'text',
inputs: {}
})
};
fetch('https://{subdomain}.conveyour.com/api/contacts/compile/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const options = {
method: 'POST',
headers: {'x-conveyour-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
content: 'Hi {{ contact.first_name }}, your badge is {{ contact.badge_number }}.',
format: 'text',
inputs: {}
})
};
fetch('https://{subdomain}.conveyour.com/api/contacts/compile/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{subdomain}.conveyour.com/api/contacts/compile/{id}"
payload = {
"content": "Hi {{ contact.first_name }}, your badge is {{ contact.badge_number }}.",
"format": "text",
"inputs": {}
}
headers = {
"x-conveyour-token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{subdomain}.conveyour.com/api/contacts/compile/{id}",
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([
'content' => 'Hi {{ contact.first_name }}, your badge is {{ contact.badge_number }}.',
'format' => 'text',
'inputs' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-conveyour-token: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"status": "ok",
"message": "Content compiled",
"data": {
"content": "Hi Jane, your badge is 1234."
}
}{
"status": "failed",
"message": "Lacking necessary permission add_contacts",
"data": {
"permission": "add_contacts"
}
}Authorizations
Your API key token. Contacts endpoints require a Server-only — Full API key — see Authentication.
Path Parameters
The contact to compile in the context of. Pass any placeholder to compile against a dummy contact.
Query Parameters
Team scope for the request, as one or more team ObjectIds. The brackets are required: PHP keeps only the last value for a repeated plain key, so teams=A&teams=B silently resolves to B alone. On requests with a JSON body you may send teams (no brackets) in the body instead.
Values that are not valid ObjectIds are silently ignored — a mistyped team ID behaves as if no team was sent. See the teams section of the API conventions guide.
Body
Response
The compiled content.