curl --request GET \
--url https://api.reply.io/v3/custom-fields \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.reply.io/v3/custom-fields"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.reply.io/v3/custom-fields', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.reply.io/v3/custom-fields"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.reply.io/v3/custom-fields")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/custom-fields")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body[
{
"id": 123,
"title": "<string>",
"fieldType": "text",
"metadata": "<string>",
"orgWide": true,
"fieldSource": "regular",
"aiDefinition": {
"promptText": "Summarize what {{Company}} does in one sentence",
"variableKeys": [
"Company"
],
"createdAt": "2026-09-15T12:00:00Z",
"updatedAt": "2026-09-15T12:30:00Z"
},
"promptActions": [
{
"promptActionId": 12,
"promptActionName": "Qualify inbound"
}
]
}
]{
"title": "Unauthorized",
"status": 401,
"detail": "Authentication credentials are missing or invalid."
}{
"title": "Forbidden",
"status": 403,
"detail": "Feature scopes [ViewCustomField] are denied for userId 123",
"code": "customField.forbidden"
}{
"title": "Too Many Requests",
"status": 429,
"detail": "API calls quota exceeded! maximum admitted 100 per 1m."
}List all custom fields
contacts:read scope (or a broader one that includes it).
Get every custom field your contacts can carry, for your team and your organization. One flat array, no paging.
curl --request GET \
--url https://api.reply.io/v3/custom-fields \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.reply.io/v3/custom-fields"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.reply.io/v3/custom-fields', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.reply.io/v3/custom-fields"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.reply.io/v3/custom-fields")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/custom-fields")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body[
{
"id": 123,
"title": "<string>",
"fieldType": "text",
"metadata": "<string>",
"orgWide": true,
"fieldSource": "regular",
"aiDefinition": {
"promptText": "Summarize what {{Company}} does in one sentence",
"variableKeys": [
"Company"
],
"createdAt": "2026-09-15T12:00:00Z",
"updatedAt": "2026-09-15T12:30:00Z"
},
"promptActions": [
{
"promptActionId": 12,
"promptActionName": "Qualify inbound"
}
]
}
]{
"title": "Unauthorized",
"status": 401,
"detail": "Authentication credentials are missing or invalid."
}{
"title": "Forbidden",
"status": 403,
"detail": "Feature scopes [ViewCustomField] are denied for userId 123",
"code": "customField.forbidden"
}{
"title": "Too Many Requests",
"status": 429,
"detail": "API calls quota exceeded! maximum admitted 100 per 1m."
}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.
Response
List of custom fields retrieved successfully
Custom field ID
Custom field name
Custom field type
text, number Optional metadata for the field (e.g., dropdown options)
Whether the field is shared across the organization
What fills the field. regular is one you fill yourself, ai one that carries its own prompt in aiDefinition, and promptAction one written by the Prompt Actions listed in promptActions. Only an ai field can be previewed or enriched; only a field that is not ai can be mapped to a Prompt Action output.
regular, ai, promptAction The prompt that fills the field. Present only when fieldSource is ai; null otherwise.
Show child attributes
Show child attributes
{
"promptText": "Summarize what {{Company}} does in one sentence",
"variableKeys": ["Company"],
"createdAt": "2026-09-15T12:00:00Z",
"updatedAt": "2026-09-15T12:30:00Z"
}
The Prompt Actions that write into this field. Empty unless fieldSource is promptAction.
Show child attributes
Show child attributes