curl --request POST \
--url https://api.reply.io/v3/contacts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"email": "john.doe@company.com",
"firstName": "John",
"lastName": "Doe",
"title": "Senior Product Manager",
"company": "Tech Solutions Inc",
"phone": "+1-415-555-0123",
"linkedInUrl": "https://www.linkedin.com/in/johndoe",
"accountId": 100,
"customFields": [
{
"key": "leadSource",
"value": "Conference"
}
]
}
'import requests
url = "https://api.reply.io/v3/contacts"
payload = {
"email": "john.doe@company.com",
"firstName": "John",
"lastName": "Doe",
"title": "Senior Product Manager",
"company": "Tech Solutions Inc",
"phone": "+1-415-555-0123",
"linkedInUrl": "https://www.linkedin.com/in/johndoe",
"accountId": 100,
"customFields": [
{
"key": "leadSource",
"value": "Conference"
}
]
}
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({
email: 'john.doe@company.com',
firstName: 'John',
lastName: 'Doe',
title: 'Senior Product Manager',
company: 'Tech Solutions Inc',
phone: '+1-415-555-0123',
linkedInUrl: 'https://www.linkedin.com/in/johndoe',
accountId: 100,
customFields: [{key: 'leadSource', value: 'Conference'}]
})
};
fetch('https://api.reply.io/v3/contacts', 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",
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([
'email' => 'john.doe@company.com',
'firstName' => 'John',
'lastName' => 'Doe',
'title' => 'Senior Product Manager',
'company' => 'Tech Solutions Inc',
'phone' => '+1-415-555-0123',
'linkedInUrl' => 'https://www.linkedin.com/in/johndoe',
'accountId' => 100,
'customFields' => [
[
'key' => 'leadSource',
'value' => 'Conference'
]
]
]),
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/contacts"
payload := strings.NewReader("{\n \"email\": \"john.doe@company.com\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"title\": \"Senior Product Manager\",\n \"company\": \"Tech Solutions Inc\",\n \"phone\": \"+1-415-555-0123\",\n \"linkedInUrl\": \"https://www.linkedin.com/in/johndoe\",\n \"accountId\": 100,\n \"customFields\": [\n {\n \"key\": \"leadSource\",\n \"value\": \"Conference\"\n }\n ]\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/contacts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"john.doe@company.com\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"title\": \"Senior Product Manager\",\n \"company\": \"Tech Solutions Inc\",\n \"phone\": \"+1-415-555-0123\",\n \"linkedInUrl\": \"https://www.linkedin.com/in/johndoe\",\n \"accountId\": 100,\n \"customFields\": [\n {\n \"key\": \"leadSource\",\n \"value\": \"Conference\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/contacts")
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 \"email\": \"john.doe@company.com\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"title\": \"Senior Product Manager\",\n \"company\": \"Tech Solutions Inc\",\n \"phone\": \"+1-415-555-0123\",\n \"linkedInUrl\": \"https://www.linkedin.com/in/johndoe\",\n \"accountId\": 100,\n \"customFields\": [\n {\n \"key\": \"leadSource\",\n \"value\": \"Conference\"\n }\n ]\n}"
response = http.request(request)
puts response.read_bodyCreate a contact
contacts:write scope (or a broader one that includes it).
Add a single contact to your account with any profile and custom fields you have. Returns the contact with its new id.
curl --request POST \
--url https://api.reply.io/v3/contacts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"email": "john.doe@company.com",
"firstName": "John",
"lastName": "Doe",
"title": "Senior Product Manager",
"company": "Tech Solutions Inc",
"phone": "+1-415-555-0123",
"linkedInUrl": "https://www.linkedin.com/in/johndoe",
"accountId": 100,
"customFields": [
{
"key": "leadSource",
"value": "Conference"
}
]
}
'import requests
url = "https://api.reply.io/v3/contacts"
payload = {
"email": "john.doe@company.com",
"firstName": "John",
"lastName": "Doe",
"title": "Senior Product Manager",
"company": "Tech Solutions Inc",
"phone": "+1-415-555-0123",
"linkedInUrl": "https://www.linkedin.com/in/johndoe",
"accountId": 100,
"customFields": [
{
"key": "leadSource",
"value": "Conference"
}
]
}
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({
email: 'john.doe@company.com',
firstName: 'John',
lastName: 'Doe',
title: 'Senior Product Manager',
company: 'Tech Solutions Inc',
phone: '+1-415-555-0123',
linkedInUrl: 'https://www.linkedin.com/in/johndoe',
accountId: 100,
customFields: [{key: 'leadSource', value: 'Conference'}]
})
};
fetch('https://api.reply.io/v3/contacts', 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",
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([
'email' => 'john.doe@company.com',
'firstName' => 'John',
'lastName' => 'Doe',
'title' => 'Senior Product Manager',
'company' => 'Tech Solutions Inc',
'phone' => '+1-415-555-0123',
'linkedInUrl' => 'https://www.linkedin.com/in/johndoe',
'accountId' => 100,
'customFields' => [
[
'key' => 'leadSource',
'value' => 'Conference'
]
]
]),
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/contacts"
payload := strings.NewReader("{\n \"email\": \"john.doe@company.com\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"title\": \"Senior Product Manager\",\n \"company\": \"Tech Solutions Inc\",\n \"phone\": \"+1-415-555-0123\",\n \"linkedInUrl\": \"https://www.linkedin.com/in/johndoe\",\n \"accountId\": 100,\n \"customFields\": [\n {\n \"key\": \"leadSource\",\n \"value\": \"Conference\"\n }\n ]\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/contacts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"john.doe@company.com\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"title\": \"Senior Product Manager\",\n \"company\": \"Tech Solutions Inc\",\n \"phone\": \"+1-415-555-0123\",\n \"linkedInUrl\": \"https://www.linkedin.com/in/johndoe\",\n \"accountId\": 100,\n \"customFields\": [\n {\n \"key\": \"leadSource\",\n \"value\": \"Conference\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/contacts")
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 \"email\": \"john.doe@company.com\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"title\": \"Senior Product Manager\",\n \"company\": \"Tech Solutions Inc\",\n \"phone\": \"+1-415-555-0123\",\n \"linkedInUrl\": \"https://www.linkedin.com/in/johndoe\",\n \"accountId\": 100,\n \"customFields\": [\n {\n \"key\": \"leadSource\",\n \"value\": \"Conference\"\n }\n ]\n}"
response = http.request(request)
puts response.read_bodyAuthorizations
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.
Body
Request model for creating a new contact. All fields are optional — at minimum provide email or a LinkedIn URL.
Primary email address
First name
Last name
Phone number
Secondary 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
Additional information
ID of the contact account to link this contact to
User-defined fields
Show child attributes
Show child attributes
Response
Contact created 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