curl --request GET \
--url https://api.reply.io/v3/custom-fields/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.reply.io/v3/custom-fields/{id}"
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/{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/custom-fields/{id}",
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/{id}"
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/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/custom-fields/{id}")
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": "Validation failed",
"status": 400,
"detail": "The request contains validation errors.",
"errors": [
{
"pointer": "id",
"detail": "The field id must be between 1 and 2147483647."
}
]
}{
"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": "Not Found",
"status": 404,
"detail": "Custom field with ID 42 not found",
"code": "customField.notFound"
}{
"title": "Too Many Requests",
"status": 429,
"detail": "API calls quota exceeded! maximum admitted 100 per 1m."
}Get a custom field
contacts:read scope (or a broader one that includes it).
Get one custom field definition by id: its title, its text or number type, its metadata, and whether it’s org-wide.
curl --request GET \
--url https://api.reply.io/v3/custom-fields/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.reply.io/v3/custom-fields/{id}"
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/{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/custom-fields/{id}",
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/{id}"
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/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/custom-fields/{id}")
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": "Validation failed",
"status": 400,
"detail": "The request contains validation errors.",
"errors": [
{
"pointer": "id",
"detail": "The field id must be between 1 and 2147483647."
}
]
}{
"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": "Not Found",
"status": 404,
"detail": "Custom field with ID 42 not found",
"code": "customField.notFound"
}{
"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.
Path Parameters
Custom field ID
Response
Custom field details retrieved successfully
A user-defined field for storing additional data on contacts.
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