Director-dealings clusters
curl --request GET \
--url https://api.ngnmarket.com/v1/insiders/clusters \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.ngnmarket.com/v1/insiders/clusters"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.ngnmarket.com/v1/insiders/clusters', 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.ngnmarket.com/v1/insiders/clusters",
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.ngnmarket.com/v1/insiders/clusters"
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.ngnmarket.com/v1/insiders/clusters")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ngnmarket.com/v1/insiders/clusters")
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_body{
"success": true,
"data": {
"data": [
{
"company_symbol": "TRANSCORP",
"company_name": "TRANSNATIONAL CORPORATION PLC",
"side": "buy",
"insiders": 5,
"trades": 5,
"value": 93580528.5,
"insider_type_breakdown": {
"senior_officer": 4,
"executive_director": 1
},
"first_date": "2026-07-25",
"last_date": "2026-07-25"
}
],
"days": 60,
"min_insiders": 3
},
"meta": {
"plan": "business",
"calls_used": 4023,
"calls_remaining": 1995977,
"reset_at": "2026-10-01T00:00:00.000Z"
}
}
Insider Endpoints
Director-Dealings Clusters
Groups of multiple distinct insiders trading the same symbol in the same direction within a given period.
GET
/
insiders
/
clusters
Director-dealings clusters
curl --request GET \
--url https://api.ngnmarket.com/v1/insiders/clusters \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.ngnmarket.com/v1/insiders/clusters"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.ngnmarket.com/v1/insiders/clusters', 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.ngnmarket.com/v1/insiders/clusters",
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.ngnmarket.com/v1/insiders/clusters"
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.ngnmarket.com/v1/insiders/clusters")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ngnmarket.com/v1/insiders/clusters")
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_body{
"success": true,
"data": {
"data": [
{
"company_symbol": "TRANSCORP",
"company_name": "TRANSNATIONAL CORPORATION PLC",
"side": "buy",
"insiders": 5,
"trades": 5,
"value": 93580528.5,
"insider_type_breakdown": {
"senior_officer": 4,
"executive_director": 1
},
"first_date": "2026-07-25",
"last_date": "2026-07-25"
}
],
"days": 60,
"min_insiders": 3
},
"meta": {
"plan": "business",
"calls_used": 4023,
"calls_remaining": 1995977,
"reset_at": "2026-10-01T00:00:00.000Z"
}
}
Returns groups of distinct insiders who traded the same symbol in the same direction within a configurable lookback window. By default, a cluster requires at least three distinct insiders, and you can adjust both the lookback period and minimum number of insiders.
The endpoint identifies patterns in the available filings. It does not determine whether the trades were coordinated or what motivated them.
This endpoint requires a Business plan.
Check
insider_type_breakdown before interpreting a cluster. It shows the types of insiders represented in the group, which can help distinguish activity spread across employees from activity concentrated among directors or senior officers. For example, a cluster dominated by employee/staff records may reflect broader employee participation. Both patterns can produce the same basic “N insiders traded” count, so the breakdown provides important context. A cluster should be treated as a pattern in the filings, not as evidence of coordinated intent or investment conviction.curl "https://api.ngnmarket.com/v1/insiders/clusters" \
-H "Authorization: Bearer ngm_live_YOUR_KEY"
curl "https://api.ngnmarket.com/v1/insiders/clusters?days=90&min_insiders=5" \
-H "Authorization: Bearer ngm_live_YOUR_KEY"
const res = await fetch(
'https://api.ngnmarket.com/v1/insiders/clusters?days=90&min_insiders=5',
{ headers: { Authorization: 'Bearer ngm_live_YOUR_KEY' } }
);
const { data } = await res.json();
import requests
res = requests.get(
'https://api.ngnmarket.com/v1/insiders/clusters',
params={'days': 90, 'min_insiders': 5},
headers={'Authorization': 'Bearer ngm_live_YOUR_KEY'},
)
data = res.json()['data']
Authorizations
Pass your API key as a Bearer token: Authorization: Bearer ngm_live_YOUR_KEY.
Generate keys at ngnmarket.com/dashboard/developer.
Query Parameters
Lookback window in days.
Required range:
7 <= x <= 365Minimum distinct insiders required to qualify as a cluster.
Required range:
2 <= x <= 20