curl --request POST \
--url https://api.reply.io/v3/custom-fields/{id}/preview \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"contactId": 1024,
"promptText": "Summarize what {{Company}} does"
}
'import requests
url = "https://api.reply.io/v3/custom-fields/{id}/preview"
payload = {
"contactId": 1024,
"promptText": "Summarize what {{Company}} does"
}
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({contactId: 1024, promptText: 'Summarize what {{Company}} does'})
};
fetch('https://api.reply.io/v3/custom-fields/{id}/preview', 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.reply.io/v3/custom-fields/{id}/preview",
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([
'contactId' => 1024,
'promptText' => 'Summarize what {{Company}} does'
]),
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.reply.io/v3/custom-fields/{id}/preview"
payload := strings.NewReader("{\n \"contactId\": 1024,\n \"promptText\": \"Summarize what {{Company}} does\"\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.reply.io/v3/custom-fields/{id}/preview")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"contactId\": 1024,\n \"promptText\": \"Summarize what {{Company}} does\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/custom-fields/{id}/preview")
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 \"contactId\": 1024,\n \"promptText\": \"Summarize what {{Company}} does\"\n}"
response = http.request(request)
puts response.read_body{
"customFieldId": 42,
"contactId": 1024,
"value": "Acme builds industrial robotics for warehouse automation.",
"status": "succeeded",
"errorMessage": null
}Preview an AI custom field
Coming soon. This endpoint will be available by early October 2026.
contacts:operate scope (or a broader one that includes it).
See what an AI custom field would produce for one contact. Nothing is written to the contact.
curl --request POST \
--url https://api.reply.io/v3/custom-fields/{id}/preview \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"contactId": 1024,
"promptText": "Summarize what {{Company}} does"
}
'import requests
url = "https://api.reply.io/v3/custom-fields/{id}/preview"
payload = {
"contactId": 1024,
"promptText": "Summarize what {{Company}} does"
}
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({contactId: 1024, promptText: 'Summarize what {{Company}} does'})
};
fetch('https://api.reply.io/v3/custom-fields/{id}/preview', 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.reply.io/v3/custom-fields/{id}/preview",
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([
'contactId' => 1024,
'promptText' => 'Summarize what {{Company}} does'
]),
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.reply.io/v3/custom-fields/{id}/preview"
payload := strings.NewReader("{\n \"contactId\": 1024,\n \"promptText\": \"Summarize what {{Company}} does\"\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.reply.io/v3/custom-fields/{id}/preview")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"contactId\": 1024,\n \"promptText\": \"Summarize what {{Company}} does\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/custom-fields/{id}/preview")
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 \"contactId\": 1024,\n \"promptText\": \"Summarize what {{Company}} does\"\n}"
response = http.request(request)
puts response.read_body{
"customFieldId": 42,
"contactId": 1024,
"value": "Acme builds industrial robotics for warehouse automation.",
"status": "succeeded",
"errorMessage": null
}Authorizations
Authenticate every request with a Bearer token. Pass your Reply API key in the
Authorization header:
Authorization: Bearer <your-api-key>
Get your API key from the Reply dashboard: Settings → API Key.
Path Parameters
Custom field ID
Body
Response
The prompt ran. Check status for the outcome — a run that produced no value still returns 200, with value set to null.
The value an AI custom field's prompt produced for one contact. Nothing is written to the contact.
The custom field the prompt belongs to.
The contact the prompt was resolved against.
Outcome of the run. missingData means the contact does not carry a template variable the prompt refers to; noResults means the prompt produced nothing.
succeeded, failed, missingData, noResults The generated value, or null when status is anything other than succeeded.
Explains any status other than succeeded; null otherwise.