curl --request GET \
--url https://api.reply.io/v3/contacts/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.reply.io/v3/contacts/{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/contacts/{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/contacts/{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/contacts/{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/contacts/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/contacts/{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": 12345,
"email": "john.doe@company.com",
"firstName": "John",
"lastName": "Doe",
"title": "Senior Product Manager",
"company": "Tech Solutions Inc",
"domain": "company.com",
"companySize": "oneThousand",
"city": "San Francisco",
"state": "CA",
"country": "United States",
"timeZoneId": "America/Los_Angeles",
"phone": "+1-415-555-0123",
"phoneStatus": "valid",
"linkedInUrl": "https://www.linkedin.com/in/johndoe",
"linkedInSalesNavigatorUrl": "https://www.linkedin.com/sales/profile/123456",
"linkedInRecruiterUrl": "https://www.linkedin.com/recruiter/profile/789012",
"industry": "Software & Technology",
"notes": "Met at SaaS Conference 2024",
"ownerUserId": 42,
"accountId": 100,
"isOptedOut": false,
"callStatus": "toCall",
"meetingStatus": "none",
"stage": "Interested",
"addingDate": "2024-03-08T10:00:00+00:00",
"createdAt": "2024-03-08T10:00:00",
"lastModifiedAt": "2024-03-10T15:30:00",
"customFields": [
{
"key": "leadSource",
"value": "Conference"
},
{
"key": "budget",
"value": "100k-250k"
}
]
}Get a contact
contacts:read scope (or a broader one that includes it).
Get the full record for one contact by id: profile fields, owner, opt-out, call and meeting status, and custom fields.
curl --request GET \
--url https://api.reply.io/v3/contacts/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.reply.io/v3/contacts/{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/contacts/{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/contacts/{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/contacts/{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/contacts/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/contacts/{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": 12345,
"email": "john.doe@company.com",
"firstName": "John",
"lastName": "Doe",
"title": "Senior Product Manager",
"company": "Tech Solutions Inc",
"domain": "company.com",
"companySize": "oneThousand",
"city": "San Francisco",
"state": "CA",
"country": "United States",
"timeZoneId": "America/Los_Angeles",
"phone": "+1-415-555-0123",
"phoneStatus": "valid",
"linkedInUrl": "https://www.linkedin.com/in/johndoe",
"linkedInSalesNavigatorUrl": "https://www.linkedin.com/sales/profile/123456",
"linkedInRecruiterUrl": "https://www.linkedin.com/recruiter/profile/789012",
"industry": "Software & Technology",
"notes": "Met at SaaS Conference 2024",
"ownerUserId": 42,
"accountId": 100,
"isOptedOut": false,
"callStatus": "toCall",
"meetingStatus": "none",
"stage": "Interested",
"addingDate": "2024-03-08T10:00:00+00:00",
"createdAt": "2024-03-08T10:00:00",
"lastModifiedAt": "2024-03-10T15:30:00",
"customFields": [
{
"key": "leadSource",
"value": "Conference"
},
{
"key": "budget",
"value": "100k-250k"
}
]
}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
Contact ID
Response
Contact details retrieved successfully
Contact response model
Unique ID
Primary email address
Email domain (derived from email)
First name
Last name
Phone number
Job title
Organization name
Organization employee count range
empty, selfEmployed, ten, fifty, twoHundred, fiveHundred, oneThousand, fiveThousand, tenThousand, overTenThousand Business sector
City of residence
State/province
Country
Timezone identifier
LinkedIn profile URL
Sales Navigator URL
Recruiter URL
Phone validation status
pending, invalid, valid, validationFailed, notValidated Additional information
ID of the user who owns this contact
ID of the contact account this contact belongs to
Whether the contact has opted out of communications
Contact-level call status
none, toCall, called Contact-level meeting status
none, meetingBooked Pipeline stage the contact sits in, by name, or null when it has none. A workspace has eight stages, named New, Engaging, Replied, Interested, Not interested, Unresponsive, Do not contact and Bad contact info unless the team has renamed them. GET /v3/settings returns the current names under contacts.contactStages.
Date the contact was added
Creation timestamp
Last modification timestamp
User-defined fields. An entry is returned when it holds a value, or when an enrichment has left a status on it — so a field being enriched appears with a null value and an enrichmentStatus.
Show child attributes
Show child attributes