curl --request PUT \
--url https://api.reply.io/v3/prompt-actions/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Company focus summary",
"prompt": "Summarise in one sentence what {{Company}} sells, based on their website.",
"outputs": [
{
"label": "Company focus",
"customFieldId": 1907,
"fieldType": "text"
},
{
"label": "Employee count estimate",
"fieldType": "number"
}
]
}
'import requests
url = "https://api.reply.io/v3/prompt-actions/{id}"
payload = {
"name": "Company focus summary",
"prompt": "Summarise in one sentence what {{Company}} sells, based on their website.",
"outputs": [
{
"label": "Company focus",
"customFieldId": 1907,
"fieldType": "text"
},
{
"label": "Employee count estimate",
"fieldType": "number"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Company focus summary',
prompt: 'Summarise in one sentence what {{Company}} sells, based on their website.',
outputs: [
{label: 'Company focus', customFieldId: 1907, fieldType: 'text'},
{label: 'Employee count estimate', fieldType: 'number'}
]
})
};
fetch('https://api.reply.io/v3/prompt-actions/{id}', 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/prompt-actions/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Company focus summary',
'prompt' => 'Summarise in one sentence what {{Company}} sells, based on their website.',
'outputs' => [
[
'label' => 'Company focus',
'customFieldId' => 1907,
'fieldType' => 'text'
],
[
'label' => 'Employee count estimate',
'fieldType' => 'number'
]
]
]),
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/prompt-actions/{id}"
payload := strings.NewReader("{\n \"name\": \"Company focus summary\",\n \"prompt\": \"Summarise in one sentence what {{Company}} sells, based on their website.\",\n \"outputs\": [\n {\n \"label\": \"Company focus\",\n \"customFieldId\": 1907,\n \"fieldType\": \"text\"\n },\n {\n \"label\": \"Employee count estimate\",\n \"fieldType\": \"number\"\n }\n ]\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.reply.io/v3/prompt-actions/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Company focus summary\",\n \"prompt\": \"Summarise in one sentence what {{Company}} sells, based on their website.\",\n \"outputs\": [\n {\n \"label\": \"Company focus\",\n \"customFieldId\": 1907,\n \"fieldType\": \"text\"\n },\n {\n \"label\": \"Employee count estimate\",\n \"fieldType\": \"number\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/prompt-actions/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Company focus summary\",\n \"prompt\": \"Summarise in one sentence what {{Company}} sells, based on their website.\",\n \"outputs\": [\n {\n \"label\": \"Company focus\",\n \"customFieldId\": 1907,\n \"fieldType\": \"text\"\n },\n {\n \"label\": \"Employee count estimate\",\n \"fieldType\": \"number\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": 312,
"name": "Company focus summary",
"prompt": "Summarise in one sentence what {{Company}} sells, based on their website.",
"outputs": [
{
"id": 84,
"label": "Company focus",
"customFieldId": 1907,
"customFieldName": "Company focus",
"fieldType": "text"
}
],
"createdAt": "2026-09-02T11:24:31.120Z",
"lastRunAt": "2026-09-14T08:03:55.000Z"
}Update a Prompt Action
New. This endpoint shipped recently. If anything about it is unclear or could work better for you, tell us in the developer Slack.
contacts:write scope (or a broader one that includes it).
Replace a Prompt Action’s name, prompt text and outputs. The whole definition is overwritten, so send every output you want to keep — any output you leave out is dropped.
curl --request PUT \
--url https://api.reply.io/v3/prompt-actions/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Company focus summary",
"prompt": "Summarise in one sentence what {{Company}} sells, based on their website.",
"outputs": [
{
"label": "Company focus",
"customFieldId": 1907,
"fieldType": "text"
},
{
"label": "Employee count estimate",
"fieldType": "number"
}
]
}
'import requests
url = "https://api.reply.io/v3/prompt-actions/{id}"
payload = {
"name": "Company focus summary",
"prompt": "Summarise in one sentence what {{Company}} sells, based on their website.",
"outputs": [
{
"label": "Company focus",
"customFieldId": 1907,
"fieldType": "text"
},
{
"label": "Employee count estimate",
"fieldType": "number"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Company focus summary',
prompt: 'Summarise in one sentence what {{Company}} sells, based on their website.',
outputs: [
{label: 'Company focus', customFieldId: 1907, fieldType: 'text'},
{label: 'Employee count estimate', fieldType: 'number'}
]
})
};
fetch('https://api.reply.io/v3/prompt-actions/{id}', 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/prompt-actions/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Company focus summary',
'prompt' => 'Summarise in one sentence what {{Company}} sells, based on their website.',
'outputs' => [
[
'label' => 'Company focus',
'customFieldId' => 1907,
'fieldType' => 'text'
],
[
'label' => 'Employee count estimate',
'fieldType' => 'number'
]
]
]),
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/prompt-actions/{id}"
payload := strings.NewReader("{\n \"name\": \"Company focus summary\",\n \"prompt\": \"Summarise in one sentence what {{Company}} sells, based on their website.\",\n \"outputs\": [\n {\n \"label\": \"Company focus\",\n \"customFieldId\": 1907,\n \"fieldType\": \"text\"\n },\n {\n \"label\": \"Employee count estimate\",\n \"fieldType\": \"number\"\n }\n ]\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.reply.io/v3/prompt-actions/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Company focus summary\",\n \"prompt\": \"Summarise in one sentence what {{Company}} sells, based on their website.\",\n \"outputs\": [\n {\n \"label\": \"Company focus\",\n \"customFieldId\": 1907,\n \"fieldType\": \"text\"\n },\n {\n \"label\": \"Employee count estimate\",\n \"fieldType\": \"number\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/prompt-actions/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Company focus summary\",\n \"prompt\": \"Summarise in one sentence what {{Company}} sells, based on their website.\",\n \"outputs\": [\n {\n \"label\": \"Company focus\",\n \"customFieldId\": 1907,\n \"fieldType\": \"text\"\n },\n {\n \"label\": \"Employee count estimate\",\n \"fieldType\": \"number\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": 312,
"name": "Company focus summary",
"prompt": "Summarise in one sentence what {{Company}} sells, based on their website.",
"outputs": [
{
"id": 84,
"label": "Company focus",
"customFieldId": 1907,
"customFieldName": "Company focus",
"fieldType": "text"
}
],
"createdAt": "2026-09-02T11:24:31.120Z",
"lastRunAt": "2026-09-14T08:03:55.000Z"
}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
Prompt Action ID
x >= 1Body
Body for creating or updating a Prompt Action. Every field is replaced on update, so send the complete definition including the outputs you want to keep.
Name of the Prompt Action
1 - 200Prompt text sent to the model
1 - 4000Values the prompt produces. At least one, at most 5. Labels must be unique (trimmed, case-insensitive), and no two outputs may map to the same customFieldId.
1 - 5 elementsShow child attributes
Show child attributes
Response
The updated Prompt Action
A reusable AI prompt that runs against contacts and writes its results into contact custom fields.
Unique identifier of the Prompt Action
Name of the Prompt Action
Prompt text sent to the model
Values the prompt produces, each mapped to a contact custom field
Show child attributes
Show child attributes
When the Prompt Action was created
When the Prompt Action was last run, or null if it has never run