curl --request GET \
--url https://api.reply.io/v3/sequences/{id}/contacts/{contact_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.reply.io/v3/sequences/{id}/contacts/{contact_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/sequences/{id}/contacts/{contact_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/sequences/{id}/contacts/{contact_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/sequences/{id}/contacts/{contact_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/sequences/{id}/contacts/{contact_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/sequences/{id}/contacts/{contact_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_bodyGet a contact in a sequence
sequences:read scope (or a broader one that includes it).
Get one contact’s state inside a sequence: status, the step they’re waiting on, when they were added, and opt-out.
curl --request GET \
--url https://api.reply.io/v3/sequences/{id}/contacts/{contact_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.reply.io/v3/sequences/{id}/contacts/{contact_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/sequences/{id}/contacts/{contact_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/sequences/{id}/contacts/{contact_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/sequences/{id}/contacts/{contact_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/sequences/{id}/contacts/{contact_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/sequences/{id}/contacts/{contact_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_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.
Response
Contact details retrieved successfully
A contact enrolled in a sequence with sequence-specific metadata
Contact ID
Sequence ID
Contact email address
Contact first name
Contact last name
Contact company name
Contact job title
Contact's status in this sequence. The writable subset (active, paused, finished, outOfOffice) can be set via POST /v3/sequences/{id}/contacts/set-status-in-sequence. inactive is set by the system when the contact is missing data needed to continue (e.g. no email when the next step is an email step).
active, paused, finished, inactive, outOfOffice Whether the contact has opted out (contact-level flag, not sequence-scoped)
Contact-level call status (none / toCall / called).
none, toCall, called Contact-level meeting status (none / meetingBooked).
none, meetingBooked Reply/bounce status for the most recent email sent to this contact in this sequence.
null when no email has been sent to this contact yet in this sequence.
Otherwise an object with isReplied and isBounced flags. false/false here means an email was sent
but no reply or bounce was registered — distinct from the null "never sent" state.
Show child attributes
Show child attributes
Current sequence step the contact is on. Always present in the response.
When the contact has no in-progress step (e.g. finished or paused at the end of the sequence), stepId is null and displayName is "Finished".
Show child attributes
Show child attributes
Date the contact was added to the sequence
Identifier of the email account this contact is assigned to send from in this sequence.
null when no email account is assigned (e.g. the sequence has no email steps the contact has reached, or the assignment hasn't been resolved yet).
Identifier of the LinkedIn account this contact is assigned to send from in this sequence.
null when no LinkedIn account is assigned (e.g. the sequence has no LinkedIn steps the contact has reached).