curl --request PUT \
--url https://api.reply.io/v3/contact-accounts/{id}/owner \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"userId": 123
}'import requests
url = "https://api.reply.io/v3/contact-accounts/{id}/owner"
payload = { "userId": 123 }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({userId: 123})
};
fetch('https://api.reply.io/v3/contact-accounts/{id}/owner', 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/contact-accounts/{id}/owner",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'userId' => 123
]),
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/contact-accounts/{id}/owner"
payload := strings.NewReader("{\n \"userId\": 123\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.reply.io/v3/contact-accounts/{id}/owner")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"userId\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/contact-accounts/{id}/owner")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"userId\": 123\n}"
response = http.request(request)
puts response.read_body{
"id": 12345,
"ownerUserId": 42,
"name": "Acme Corporation",
"description": "Enterprise software company",
"domainName": "acme.com",
"domainSecondary": "acme.io",
"industry": "Software",
"companySize": "51-200",
"country": "United States",
"state": "California",
"city": "San Francisco",
"timeZoneId": "America/Los_Angeles",
"linkedInUrl": "https://www.linkedin.com/company/acme",
"phone": "+1-415-555-0100",
"twitterUrl": "https://twitter.com/acme",
"logoUrl": "https://cdn.example.com/logos/acme.png",
"email": "info@acme.com",
"emailProvider": "office",
"stage": {
"id": 3,
"name": "Qualified",
"colorId": 2
},
"linkedProspectsCount": 17,
"createdDate": "2026-01-15T09:30:00Z",
"lastActivityDate": "2026-06-20T14:05:00Z"
}Update account owner
contacts:write scope (or a broader one that includes it).
Hand an account to another member of your team by user id. Nothing else changes, and the account comes back with its new owner.
curl --request PUT \
--url https://api.reply.io/v3/contact-accounts/{id}/owner \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"userId": 123
}'import requests
url = "https://api.reply.io/v3/contact-accounts/{id}/owner"
payload = { "userId": 123 }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({userId: 123})
};
fetch('https://api.reply.io/v3/contact-accounts/{id}/owner', 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/contact-accounts/{id}/owner",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'userId' => 123
]),
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/contact-accounts/{id}/owner"
payload := strings.NewReader("{\n \"userId\": 123\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.reply.io/v3/contact-accounts/{id}/owner")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"userId\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/contact-accounts/{id}/owner")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"userId\": 123\n}"
response = http.request(request)
puts response.read_body{
"id": 12345,
"ownerUserId": 42,
"name": "Acme Corporation",
"description": "Enterprise software company",
"domainName": "acme.com",
"domainSecondary": "acme.io",
"industry": "Software",
"companySize": "51-200",
"country": "United States",
"state": "California",
"city": "San Francisco",
"timeZoneId": "America/Los_Angeles",
"linkedInUrl": "https://www.linkedin.com/company/acme",
"phone": "+1-415-555-0100",
"twitterUrl": "https://twitter.com/acme",
"logoUrl": "https://cdn.example.com/logos/acme.png",
"email": "info@acme.com",
"emailProvider": "office",
"stage": {
"id": 3,
"name": "Qualified",
"colorId": 2
},
"linkedProspectsCount": 17,
"createdDate": "2026-01-15T09:30:00Z",
"lastActivityDate": "2026-06-20T14:05:00Z"
}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
Account ID
Body
Request body for updating the owner of a contact account
ID of the new owner user
Response
Account owner updated successfully
A single contact account, including the resolved email provider
Unique identifier of the contact account
ID of the user who owns this contact account
Contact account name
Optional description of the contact account
Primary domain name
Secondary domain name
Industry of the company
Company size range
Empty, SelfEmployed, 2-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+ Country of the company
State or province
City
Time zone identifier
LinkedIn profile URL
Phone number
Twitter profile URL
Company logo URL
Contact email address
Email hosting provider for the account's primary domain, resolved from the domain's MX records.
null when the account has no domain or the provider could not be determined.
other, gSuite, office, zoho, mimecast, proofpoint, yandex, ovh, goDaddy, ionos, gandi, hostinger, oneAndOne, amazon, barracuda, spamexperts, hotmail, liveCom, yahoo, bloomberg, gmail, outlook, ciscoSecureEmail, titanMail, protonmail, namecheap, appleMail, linkedin Current stage of the contact account
Show child attributes
Show child attributes
Number of contacts linked to this account
Date when the account was created
Date of the last activity on this account