List customer context
curl --request GET \
--url https://api.closedloop.sh/v1/context \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.closedloop.sh/v1/context"
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/context', 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/context",
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/context"
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/context")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.closedloop.sh/v1/context")
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{
"data": [
{
"id": "51617100-0000-4000-8000-000000000001",
"type": "churn_reason",
"content": "We won't renew unless the reporting is fixed.",
"created_at": "2026-05-20T14:00:00Z",
"customer_id": "c0ffee00-0000-4000-8000-000000000001",
"customer_name": "Acme Co",
"source": "gong_call_def456"
}
],
"pagination": {
"total": 508,
"limit": 50,
"offset": 0
}
}Context
List customer context
Browse all customer context types in ClosedLoop AI, see when to use each one, and filter records by type, customer, or original source date.
GET
/
context
List customer context
curl --request GET \
--url https://api.closedloop.sh/v1/context \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.closedloop.sh/v1/context"
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/context', 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/context",
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/context"
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/context")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.closedloop.sh/v1/context")
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{
"data": [
{
"id": "51617100-0000-4000-8000-000000000001",
"type": "churn_reason",
"content": "We won't renew unless the reporting is fixed.",
"created_at": "2026-05-20T14:00:00Z",
"customer_id": "c0ffee00-0000-4000-8000-000000000001",
"customer_name": "Acme Co",
"source": "gong_call_def456"
}
],
"pagination": {
"total": 508,
"limit": 50,
"offset": 0
}
}Customer context records show what customers say about buying, using, and leaving your product. Each record is an interpretation of what a customer said; check the original conversation before treating it as fact. Set
Results are newest first by the date of the original conversation (
type to see one kind of context, or omit it to see all kinds.
Context types
| Type | When to use it |
|---|---|
adoption_milestone | See when a customer reached a meaningful point in rollout or regular use. |
aha_moment | Find the moment a customer understood why your product was valuable to them. |
alternatives_considered | See which other solutions a customer evaluated before choosing. |
buying_committee | Find the people who influenced or approved a customer’s purchase. |
churn_reason | Find a customer’s stated decision or serious consideration to leave, cancel, not renew, or stop using part of your product, including a past exit. A complaint without intent to leave does not qualify. |
competitive_positioning | See how a customer compares your product’s strengths or weaknesses with alternatives. |
competitor_mention | Find a customer’s mention of a named competing product or vendor. |
deal_blocker | Find a requirement that prevents a customer from buying, renewing, or expanding. |
decision_criteria | See the factors a customer uses to choose a product. |
design_principle_violation | Find an experience a customer considers inconsistent, surprising, or needlessly complex. |
discovery_path | See how a customer first found your product. |
expansion_opportunity | Find possible broader adoption (older records only). |
general_dislike | Find broad dissatisfaction when the customer has not stated an intention to leave. |
habit_of_present | See an existing habit that makes it harder for a customer to adopt or switch products. |
information_architecture | Find places where a customer struggles to locate or understand information in your product. |
market_perception | See how a customer views your market or product category. |
mental_model_mismatch | Find where your product works differently from what a customer expected. |
onboarding_friction | Find what makes it hard for a customer to get started or learn your product. |
passive_looking | Find customers who encountered your product without actively looking for a solution. |
pmf_signal | Find evidence that your product solves a recurring and important customer problem. |
pricing_perception | See how a customer judges your price, budget fit, or value for money. |
purchase_hesitation | Find a concern that is slowing a customer’s purchase or commitment. |
satisfaction | Find a customer’s substantive positive evaluation of your product. |
social_proof | Find customers willing to recommend, advocate for, or serve as a reference for your product. |
trigger_event | See the event that prompted a customer to start looking for a solution. |
use_case_discovery | Find an unexpected way a customer uses your product. |
value_evidence | Find concrete results or benefits a customer reports from your product. |
win_factor | Find why a deal was won (older records only). |
win_reason | See why a customer chose or adopted your product. |
workflow_context | Understand a customer’s existing process and tools around your product. |
Request and dates
Use the base URL for your team’s region. For example:curl 'https://eu.api.closedloop.sh/v1/context?type=churn_reason&limit=200' \
-H 'X-API-Key: YOUR_API_KEY'
created_at, which can be null). Use limit (maximum 200) and offset to page. customer_id is null when a record is not linked to a customer. For a customer’s current status, use /customers/{id}.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.
Query Parameters
Filter by one of the context types explained in the table above.
One of the public context categories; see the /context endpoint for what each means.
Available options:
adoption_milestone, aha_moment, alternatives_considered, buying_committee, churn_reason, competitive_positioning, competitor_mention, deal_blocker, decision_criteria, design_principle_violation, discovery_path, expansion_opportunity, general_dislike, habit_of_present, information_architecture, market_perception, mental_model_mismatch, onboarding_friction, passive_looking, pmf_signal, pricing_perception, purchase_hesitation, satisfaction, social_proof, trigger_event, use_case_discovery, value_evidence, win_factor, win_reason, workflow_context Example:
"churn_reason"
Filter to context for one customer (same key as on insights).
Start date (inclusive), YYYY-MM-DD. Other formats return 400.
Pattern:
^\d{4}-\d{2}-\d{2}$End date (inclusive), YYYY-MM-DD. Other formats return 400.
Pattern:
^\d{4}-\d{2}-\d{2}$Page size (max 200).
Required range:
1 <= x <= 200Number of records to skip.
Required range:
x >= 0