curl --request GET \
--url https://api.closedloop.sh/v1/customers/{id} \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.closedloop.sh/v1/customers/{id}"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.closedloop.sh/v1/customers/{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.closedloop.sh/v1/customers/{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 => [
"X-API-Key: <api-key>"
],
]);
$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.closedloop.sh/v1/customers/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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.closedloop.sh/v1/customers/{id}")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.closedloop.sh/v1/customers/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "c0ffee00-0000-4000-8000-000000000001",
"name": "Acme Co",
"parent_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"parent_name": "<string>",
"domain": "acme.example",
"industry": "Software",
"employee_count": 250,
"arr": 48000,
"currency": "USD",
"is_active_customer": true,
"is_paying": true,
"churn_state": "active",
"insight_count": 23,
"last_seen": "2026-06-10T09:00:00Z",
"external_ids": [
{
"integration_id": "1e7e6600-0000-4000-8000-000000000001",
"source": "salesforce",
"external_id": "001A000001AbCdEAAZ"
}
],
"parents": [
{
"id": "c0ffee00-0000-4000-8000-000000000002",
"name": "Acme Group",
"source": "salesforce",
"external_id": "001A000001AbCdFAAZ"
}
],
"family": {
"id": "fa111e00-0000-4000-8000-000000000001",
"name": "Acme",
"is_grouped": true,
"member_count": 3,
"members": [
{
"id": "c0ffee00-0000-4000-8000-000000000003",
"name": "Acme Germany",
"external_ids": [
{
"integration_id": "1e7e6600-0000-4000-8000-000000000001",
"source": "salesforce",
"external_id": "001A000001AbCdEAAZ"
}
],
"domain": "acme.com"
}
]
}
}{
"error": "Not found.",
"code": "NOT_FOUND"
}{
"error": "API key authentication is temporarily unavailable. Please retry shortly.",
"code": "API_KEY_AUTH_UNAVAILABLE"
}Get a customer
Get one customer account with its CRM details, churn state, record ids in your CRM, parent accounts, and the family it belongs to.
curl --request GET \
--url https://api.closedloop.sh/v1/customers/{id} \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.closedloop.sh/v1/customers/{id}"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.closedloop.sh/v1/customers/{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.closedloop.sh/v1/customers/{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 => [
"X-API-Key: <api-key>"
],
]);
$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.closedloop.sh/v1/customers/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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.closedloop.sh/v1/customers/{id}")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.closedloop.sh/v1/customers/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "c0ffee00-0000-4000-8000-000000000001",
"name": "Acme Co",
"parent_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"parent_name": "<string>",
"domain": "acme.example",
"industry": "Software",
"employee_count": 250,
"arr": 48000,
"currency": "USD",
"is_active_customer": true,
"is_paying": true,
"churn_state": "active",
"insight_count": 23,
"last_seen": "2026-06-10T09:00:00Z",
"external_ids": [
{
"integration_id": "1e7e6600-0000-4000-8000-000000000001",
"source": "salesforce",
"external_id": "001A000001AbCdEAAZ"
}
],
"parents": [
{
"id": "c0ffee00-0000-4000-8000-000000000002",
"name": "Acme Group",
"source": "salesforce",
"external_id": "001A000001AbCdFAAZ"
}
],
"family": {
"id": "fa111e00-0000-4000-8000-000000000001",
"name": "Acme",
"is_grouped": true,
"member_count": 3,
"members": [
{
"id": "c0ffee00-0000-4000-8000-000000000003",
"name": "Acme Germany",
"external_ids": [
{
"integration_id": "1e7e6600-0000-4000-8000-000000000001",
"source": "salesforce",
"external_id": "001A000001AbCdEAAZ"
}
],
"domain": "acme.com"
}
]
}
}{
"error": "Not found.",
"code": "NOT_FOUND"
}{
"error": "API key authentication is temporarily unavailable. Please retry shortly.",
"code": "API_KEY_AUTH_UNAVAILABLE"
}Authorizations
Team-scoped API key created in the app (Settings → API Keys).
Sent as X-API-Key: <key> on every request. The header name apikey
is also accepted as an alias.
Path Parameters
Resource UUID.
Response
Customer detail
"c0ffee00-0000-4000-8000-000000000001"
"Acme Co"
Direct CRM parent account, if this is a child account.
Parent account name.
"acme.example"
"Software"
250
Current annual recurring revenue in your team's currency. 0 when the customer does not pay now; null when unknown.
48000
"USD"
Whether your CRM marks this account as an active customer. Null when unknown, which is not the same as false.
true
Whether this customer pays now, decided for its whole family. Null when not known yet.
true
active, at_risk, churned "active"
23
Latest known insight source date; null when unknown.
"2026-06-10T09:00:00Z"
This customer's records in your connected tools: the connection, the tool, and its id there.
Show child attributes
Show child attributes
Accounts above this one in your CRM hierarchy, nearest first, up to 10 levels. Empty for a top-level account.
Show child attributes
Show child attributes
The family this account belongs to. Theme and feature customer counts count each family once.
Show child attributes
Show child attributes