curl --request POST \
--url https://api.hypedexer.com/builders/{builder_address}/external-activity \
--header 'Content-Type: application/json' \
--data '
{
"users": [
"0xf3c0a7cab3f4a1b2c3d4e5f60718293a4b5c6d7e",
"0x00ede59e1a2b3c4d5e6f708192a3b4c5d6e7f809"
],
"timeframe": "7d"
}
'import requests
url = "https://api.hypedexer.com/builders/{builder_address}/external-activity"
payload = {
"users": ["0xf3c0a7cab3f4a1b2c3d4e5f60718293a4b5c6d7e", "0x00ede59e1a2b3c4d5e6f708192a3b4c5d6e7f809"],
"timeframe": "7d"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
users: [
'0xf3c0a7cab3f4a1b2c3d4e5f60718293a4b5c6d7e',
'0x00ede59e1a2b3c4d5e6f708192a3b4c5d6e7f809'
],
timeframe: '7d'
})
};
fetch('https://api.hypedexer.com/builders/{builder_address}/external-activity', 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.hypedexer.com/builders/{builder_address}/external-activity",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'users' => [
'0xf3c0a7cab3f4a1b2c3d4e5f60718293a4b5c6d7e',
'0x00ede59e1a2b3c4d5e6f708192a3b4c5d6e7f809'
],
'timeframe' => '7d'
]),
CURLOPT_HTTPHEADER => [
"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.hypedexer.com/builders/{builder_address}/external-activity"
payload := strings.NewReader("{\n \"users\": [\n \"0xf3c0a7cab3f4a1b2c3d4e5f60718293a4b5c6d7e\",\n \"0x00ede59e1a2b3c4d5e6f708192a3b4c5d6e7f809\"\n ],\n \"timeframe\": \"7d\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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.post("https://api.hypedexer.com/builders/{builder_address}/external-activity")
.header("Content-Type", "application/json")
.body("{\n \"users\": [\n \"0xf3c0a7cab3f4a1b2c3d4e5f60718293a4b5c6d7e\",\n \"0x00ede59e1a2b3c4d5e6f708192a3b4c5d6e7f809\"\n ],\n \"timeframe\": \"7d\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hypedexer.com/builders/{builder_address}/external-activity")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"users\": [\n \"0xf3c0a7cab3f4a1b2c3d4e5f60718293a4b5c6d7e\",\n \"0x00ede59e1a2b3c4d5e6f708192a3b4c5d6e7f809\"\n ],\n \"timeframe\": \"7d\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "External activity for 30 users of builder 0xb84168cf... (7d)",
"data": {
"timeframe": "7d",
"builder": "0xb84168cf3be63c6b8dad05ff5d755e97432ff80b",
"start": "2026-09-01T00:00:00Z",
"end": "2026-09-08T00:48:59Z",
"summary": {
"usersChecked": 30,
"usersWithExternalBuilder": 3,
"usersWithNoBuilderFills": 7,
"usersWithOwnFills": 30,
"usersWithoutFills": 0
},
"users": [
{
"user": "0xf3c0a7cab3…",
"flagged": true,
"externalBuilders": [
{
"builder": "0x5aafc1f2…",
"fillCount": 20,
"totalVolume": 5927.77,
"uniqueCoins": 3,
"firstFill": "2026-09-02T09:14:31Z",
"lastFill": "2026-09-06T01:03:07Z"
}
],
"noBuilder": {
"fillCount": 2,
"totalVolume": 412.5,
"uniqueCoins": 1,
"firstFill": "2026-09-03T18:20:05Z",
"lastFill": "2026-09-03T18:21:47Z"
},
"own": {
"fillCount": 11,
"totalVolume": 8830.12,
"uniqueCoins": 2,
"firstFill": "2026-09-01T07:02:10Z",
"lastFill": "2026-09-07T22:15:40Z"
}
},
{
"user": "0x013c6560ad…",
"flagged": true,
"externalBuilders": [],
"noBuilder": {
"fillCount": 2,
"totalVolume": 96.3,
"uniqueCoins": 1,
"firstFill": "2026-09-05T11:40:00Z",
"lastFill": "2026-09-05T11:41:12Z"
},
"own": {
"fillCount": 17,
"totalVolume": 3120.4,
"uniqueCoins": 2,
"firstFill": "2026-09-01T12:00:03Z",
"lastFill": "2026-09-07T19:33:21Z"
}
},
{
"user": "0x00ede59e…",
"flagged": false,
"externalBuilders": [],
"noBuilder": null,
"own": {
"fillCount": 240,
"totalVolume": 169688.62,
"uniqueCoins": 4,
"firstFill": "2026-09-01T00:05:44Z",
"lastFill": "2026-09-07T03:59:00Z"
}
}
]
},
"execution_time_ms": 107.27
}External activity of your users
Find out which of your users have traded outside your app. Send your builder address and a list of wallet addresses (up to 500); for each wallet you get the fills attributed to other builder codes (competing apps) and, optionally, the fills carrying no builder code at all — official Hyperliquid UI, bots, any tool outside the builder program. About 93 % of all Hyperliquid fills carry no builder code, so noBuilder is what catches a user who left for the official front-end, while externalBuilders catches a user who went to another app.
Flagged users come first, sorted by external volume, so the top of the list is the one to act on. own reports the same wallet’s activity under your builder code, for context. One ClickHouse query on the fills table, typically 100–300 ms for 100 addresses over 7 days. Builder attribution is available from 2025-10-10.
curl --request POST \
--url https://api.hypedexer.com/builders/{builder_address}/external-activity \
--header 'Content-Type: application/json' \
--data '
{
"users": [
"0xf3c0a7cab3f4a1b2c3d4e5f60718293a4b5c6d7e",
"0x00ede59e1a2b3c4d5e6f708192a3b4c5d6e7f809"
],
"timeframe": "7d"
}
'import requests
url = "https://api.hypedexer.com/builders/{builder_address}/external-activity"
payload = {
"users": ["0xf3c0a7cab3f4a1b2c3d4e5f60718293a4b5c6d7e", "0x00ede59e1a2b3c4d5e6f708192a3b4c5d6e7f809"],
"timeframe": "7d"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
users: [
'0xf3c0a7cab3f4a1b2c3d4e5f60718293a4b5c6d7e',
'0x00ede59e1a2b3c4d5e6f708192a3b4c5d6e7f809'
],
timeframe: '7d'
})
};
fetch('https://api.hypedexer.com/builders/{builder_address}/external-activity', 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.hypedexer.com/builders/{builder_address}/external-activity",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'users' => [
'0xf3c0a7cab3f4a1b2c3d4e5f60718293a4b5c6d7e',
'0x00ede59e1a2b3c4d5e6f708192a3b4c5d6e7f809'
],
'timeframe' => '7d'
]),
CURLOPT_HTTPHEADER => [
"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.hypedexer.com/builders/{builder_address}/external-activity"
payload := strings.NewReader("{\n \"users\": [\n \"0xf3c0a7cab3f4a1b2c3d4e5f60718293a4b5c6d7e\",\n \"0x00ede59e1a2b3c4d5e6f708192a3b4c5d6e7f809\"\n ],\n \"timeframe\": \"7d\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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.post("https://api.hypedexer.com/builders/{builder_address}/external-activity")
.header("Content-Type", "application/json")
.body("{\n \"users\": [\n \"0xf3c0a7cab3f4a1b2c3d4e5f60718293a4b5c6d7e\",\n \"0x00ede59e1a2b3c4d5e6f708192a3b4c5d6e7f809\"\n ],\n \"timeframe\": \"7d\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hypedexer.com/builders/{builder_address}/external-activity")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"users\": [\n \"0xf3c0a7cab3f4a1b2c3d4e5f60718293a4b5c6d7e\",\n \"0x00ede59e1a2b3c4d5e6f708192a3b4c5d6e7f809\"\n ],\n \"timeframe\": \"7d\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "External activity for 30 users of builder 0xb84168cf... (7d)",
"data": {
"timeframe": "7d",
"builder": "0xb84168cf3be63c6b8dad05ff5d755e97432ff80b",
"start": "2026-09-01T00:00:00Z",
"end": "2026-09-08T00:48:59Z",
"summary": {
"usersChecked": 30,
"usersWithExternalBuilder": 3,
"usersWithNoBuilderFills": 7,
"usersWithOwnFills": 30,
"usersWithoutFills": 0
},
"users": [
{
"user": "0xf3c0a7cab3…",
"flagged": true,
"externalBuilders": [
{
"builder": "0x5aafc1f2…",
"fillCount": 20,
"totalVolume": 5927.77,
"uniqueCoins": 3,
"firstFill": "2026-09-02T09:14:31Z",
"lastFill": "2026-09-06T01:03:07Z"
}
],
"noBuilder": {
"fillCount": 2,
"totalVolume": 412.5,
"uniqueCoins": 1,
"firstFill": "2026-09-03T18:20:05Z",
"lastFill": "2026-09-03T18:21:47Z"
},
"own": {
"fillCount": 11,
"totalVolume": 8830.12,
"uniqueCoins": 2,
"firstFill": "2026-09-01T07:02:10Z",
"lastFill": "2026-09-07T22:15:40Z"
}
},
{
"user": "0x013c6560ad…",
"flagged": true,
"externalBuilders": [],
"noBuilder": {
"fillCount": 2,
"totalVolume": 96.3,
"uniqueCoins": 1,
"firstFill": "2026-09-05T11:40:00Z",
"lastFill": "2026-09-05T11:41:12Z"
},
"own": {
"fillCount": 17,
"totalVolume": 3120.4,
"uniqueCoins": 2,
"firstFill": "2026-09-01T12:00:03Z",
"lastFill": "2026-09-07T19:33:21Z"
}
},
{
"user": "0x00ede59e…",
"flagged": false,
"externalBuilders": [],
"noBuilder": null,
"own": {
"fillCount": 240,
"totalVolume": 169688.62,
"uniqueCoins": 4,
"firstFill": "2026-09-01T00:05:44Z",
"lastFill": "2026-09-07T03:59:00Z"
}
}
]
},
"execution_time_ms": 107.27
}Headers
Path Parameters
Your builder address (0x…)
Body
Wallet addresses to check (0x…, any case). Duplicates are ignored; any invalid address returns 400.
1 - 500 elementsLookback window, aligned to the hour
1h, 24h, 7d, 30d Also report fills carrying no builder code (official HL UI, bots, other tools)