Network Topology (Net3D) API Reference
This guide gives you everything you need to push data into GIIP's Network Topology (Net3D) visualization — read it once and you can start inserting data immediately.
Prerequisites
| Item | Description | How to Obtain |
|---|---|---|
| SK (Secret Key) | Secret key used for API authentication | Available from the (server detail) or (corporation/group management) page in the GIIP admin console |
| API URL | Your GIIP server address | Example: |
| LSSN | Unique session number issued after server registration | Retrieved from the response in Step 1 |
What is LSSN?
LSSN (Long-term Session Serial Number) is a numeric ID that identifies a single server. When you register a server for the first time via AgentAutoRegister, a unique LSSN is issued for that server. You then use this LSSN as the
kKey value in all subsequent KVSPut data submissions.
Flow summary:
Register server (AgentAutoRegister) → Receive LSSN → Use LSSN as kKey for netstat/db_connections submissions
Authentication
- Content-Type:
application/x-www-form-urlencoded - Auth location: Include the SK in the
field of the request body — NOT in an HTTP headertoken - Wrong:
(not supported)Authorization: Bearer YOUR_SK - Correct: Include
in the request bodytoken=YOUR_SK
Step 1: Register the Server (AgentAutoRegister) — Obtain LSSN
Register a server with GIIP and receive an LSSN. Save this LSSN — you will need it for every subsequent call.
- Endpoint:
POST https://YOUR_API_URL/api/giipApi?cmd=AgentAutoRegister - Content-Type:
application/x-www-form-urlencoded
Request Body Fields:
| Field | Value |
|---|---|
| YOUR_SK |
| |
| Serialized JSON string (see example below) |
jsondata example:
{ "hostname": "WEB-SRV-01", "os": "Windows Server 2022", "cpu_cores": 8, "ipv4_local": "10.0.0.5" }
curl example:
curl -X POST "https://YOUR_API_URL/api/giipApi?cmd=AgentAutoRegister" \ -H "Content-Type: application/x-www-form-urlencoded" \ --data-urlencode "token=YOUR_SK" \ --data-urlencode "text=AgentAutoRegister" \ --data-urlencode 'jsondata={"hostname":"WEB-SRV-01","os":"Windows Server 2022","cpu_cores":8,"ipv4_local":"10.0.0.5"}'
Response example:
{ "RstVal": 200, "RstMsg": "Success", "lssn": 123456 }
Important: Save the
value from the response (e.g.,lssn). It is used as123456in every Step 2 and Step 3 request.kKey
Step 2: Submit Server Connections (netstat KVSPut)
Send TCP connection information from the current server to external servers.
- Endpoint:
(noPOST https://YOUR_API_URL/api/giipApi
query parameter)cmd - Content-Type:
application/x-www-form-urlencoded
Request Body Fields:
| Field | Value | Description |
|---|---|---|
| YOUR_SK | Authentication key |
| | Literal fixed string — copy exactly as shown |
| Serialized JSON string (see example below) | Actual connection data |
jsondata example:
{ "kType": "lssn", "kKey": "123456", "kFactor": "netstat", "kValue": [ { "remote_ip": "10.0.0.10", "remote_port": 8080, "process_name": "nginx.exe", "state": "ESTABLISHED" }, { "remote_ip": "10.0.0.20", "remote_port": 3306, "process_name": "myapp.exe", "state": "ESTABLISHED" } ] }
curl example:
curl -X POST "https://YOUR_API_URL/api/giipApi" \ -H "Content-Type: application/x-www-form-urlencoded" \ --data-urlencode "token=YOUR_SK" \ --data-urlencode "text=KVSPut kType kKey kFactor" \ --data-urlencode 'jsondata={"kType":"lssn","kKey":"123456","kFactor":"netstat","kValue":[{"remote_ip":"10.0.0.10","remote_port":8080,"process_name":"nginx.exe","state":"ESTABLISHED"}]}'
Response example:
{ "RstVal": 200, "RstMsg": "Success" }
kValue field reference:
| Field | Type | Description |
|---|---|---|
| string | IP address of the destination server |
| integer | Port of the destination server |
| string | Name of the process that owns the connection |
| string | Connection state. Only entries appear as links on the topology |
Note: Only entries where
isstateare rendered as connection lines in the topology view.ESTABLISHED
Step 3: Submit DB Connection Data (db_connections KVSPut)
Send query and load information from an application server to a database server.
- Endpoint:
(same endpoint as netstat)POST https://YOUR_API_URL/api/giipApi - Content-Type:
application/x-www-form-urlencoded
Request Body Fields:
| Field | Value | Description |
|---|---|---|
| YOUR_SK | Authentication key |
| | Literal fixed string — copy exactly as shown |
| Serialized JSON string (see example below) | Actual DB connection data |
jsondata example:
{ "kType": "lssn", "kKey": "123456", "kFactor": "db_connections", "kValue": [ { "client_net_address": "10.0.0.5", "program_name": "MyApp.exe", "cpu_load": 15, "last_sql": "SELECT * FROM users WHERE id = 1", "query_hash": "0xAB12CD34" }, { "client_net_address": "10.0.0.5", "program_name": "MyApp.exe", "cpu_load": 42, "last_sql": "UPDATE orders SET status = 'shipped' WHERE order_id = 9901", "query_hash": "0xCD56EF78" } ] }
curl example:
curl -X POST "https://YOUR_API_URL/api/giipApi" \ -H "Content-Type: application/x-www-form-urlencoded" \ --data-urlencode "token=YOUR_SK" \ --data-urlencode "text=KVSPut kType kKey kFactor" \ --data-urlencode 'jsondata={"kType":"lssn","kKey":"123456","kFactor":"db_connections","kValue":[{"client_net_address":"10.0.0.5","program_name":"MyApp.exe","cpu_load":15,"last_sql":"SELECT * FROM users WHERE id = 1","query_hash":"0xAB12CD34"}]}'
Response example:
{ "RstVal": 200, "RstMsg": "Success" }
kValue field reference:
| Field | Type | Description |
|---|---|---|
| string | Source server IP. Must exactly match to create a DB link |
| string | Executable name. Displayed as the Outgoing node label in the topology |
| integer | Query load (%). Controls link line thickness and particle speed |
| string | Currently executing SQL statement. Displayed in the detail view modal |
| string | SQL statement hash. Used to group identical queries |
Step 4: Retrieve DB List (ManagedDatabaseList)
Retrieve the list of managed databases registered in the project.
- Endpoint:
POST https://YOUR_API_URL/api/giipApi - Content-Type:
application/x-www-form-urlencoded
Request Body Fields:
| Field | Value |
|---|---|
| YOUR_SK |
| (specify db_type as needed) |
curl example:
curl -X POST "https://YOUR_API_URL/api/giipApi" \ -H "Content-Type: application/x-www-form-urlencoded" \ --data-urlencode "token=YOUR_SK" \ --data-urlencode "text=ManagedDatabaseList mssql"
Response example:
{ "RstVal": 200, "RstMsg": "Success", "data": [ { "db_host": "10.0.0.30", "db_name": "ProductionDB", "db_type": "mssql" } ] }
The SK embedded in
carries the project context, so you do not need to passtokenseparately — the server resolves it automatically.csn
Full Example Scripts by Language
1. PowerShell (Windows)
# Configuration $AT = "YOUR_SECRET_KEY" $API_URL = "https://your-api.azurewebsites.net/api/giipApi" # Step 1: Server Registration (AgentAutoRegister) — Obtain LSSN $discoveryData = @{ hostname = $env:COMPUTERNAME os = (Get-CimInstance Win32_OperatingSystem).Caption cpu_cores = (Get-CimInstance Win32_Processor).NumberOfLogicalProcessors ipv4_local = (Get-NetIPAddress -AddressFamily IPv4 | Where-Object { $_.IPAddress -ne '127.0.0.1' } | Select-Object -First 1).IPAddress } | ConvertTo-Json -Compress $regBody = @{ token = $AT text = "AgentAutoRegister" jsondata = $discoveryData } $resp = Invoke-RestMethod -Uri "$API_URL`?cmd=AgentAutoRegister" ` -Method Post -ContentType "application/x-www-form-urlencoded" -Body $regBody $lssn = $resp.lssn Write-Host "Registered. LSSN: $lssn" # Step 2: netstat KVSPut $connections = Get-NetTCPConnection -State Established | Select-Object -First 100 | ForEach-Object { @{ remote_ip = $_.RemoteAddress remote_port = $_.RemotePort state = "ESTABLISHED" process_name = (Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName } } $netstatPayload = @{ kType = "lssn" kKey = "$lssn" kFactor = "netstat" kValue = $connections } | ConvertTo-Json -Compress -Depth 10 $putBody = @{ token = $AT text = "KVSPut kType kKey kFactor" jsondata = $netstatPayload } $r2 = Invoke-RestMethod -Uri $API_URL -Method Post ` -ContentType "application/x-www-form-urlencoded" -Body $putBody Write-Host "netstat result: $($r2.RstMsg)" # Step 3: db_connections KVSPut $dbPayload = @{ kType = "lssn" kKey = "$lssn" kFactor = "db_connections" kValue = @( @{ client_net_address = "10.0.0.5" program_name = "MyApp.exe" cpu_load = 15 last_sql = "SELECT * FROM users WHERE id = 1" query_hash = "0xAB12CD34" } ) } | ConvertTo-Json -Compress -Depth 10 $putBody2 = @{ token = $AT text = "KVSPut kType kKey kFactor" jsondata = $dbPayload } $r3 = Invoke-RestMethod -Uri $API_URL -Method Post ` -ContentType "application/x-www-form-urlencoded" -Body $putBody2 Write-Host "db_connections result: $($r3.RstMsg)"
2. Bash Shell (Linux)
#!/bin/bash AT="YOUR_SECRET_KEY" API_URL="https://your-api.azurewebsites.net/api/giipApi" # Step 1: Server Registration (AgentAutoRegister) — Obtain LSSN JSON_DATA=$(cat <<EOF { "hostname": "$(hostname)", "os": "$(grep PRETTY_NAME /etc/os-release | cut -d'"' -f2)", "cpu_cores": $(nproc), "ipv4_local": "$(hostname -I | awk '{print $1}')" } EOF ) RESP=$(curl -s -X POST "$API_URL?cmd=AgentAutoRegister" \ -H "Content-Type: application/x-www-form-urlencoded" \ --data-urlencode "token=$AT" \ --data-urlencode "text=AgentAutoRegister" \ --data-urlencode "jsondata=$JSON_DATA") LSSN=$(echo "$RESP" | jq -r '.lssn') echo "Registered. LSSN: $LSSN" # Step 2: netstat KVSPut CONNS=$(ss -tunp | awk '/ESTAB/{ split($5,a,":"); split($6,b,":"); printf "{\"remote_ip\":\"%s\",\"remote_port\":%s,\"process_name\":\"unknown\",\"state\":\"ESTABLISHED\"}",a[1],a[2] }' | paste -sd,) NETSTAT_PAYLOAD=$(cat <<EOF { "kType": "lssn", "kKey": "$LSSN", "kFactor": "netstat", "kValue": [$CONNS] } EOF ) RESP2=$(curl -s -X POST "$API_URL" \ -H "Content-Type: application/x-www-form-urlencoded" \ --data-urlencode "token=$AT" \ --data-urlencode "text=KVSPut kType kKey kFactor" \ --data-urlencode "jsondata=$NETSTAT_PAYLOAD") echo "netstat result: $(echo "$RESP2" | jq -r '.RstMsg')" # Step 3: db_connections KVSPut DB_PAYLOAD=$(cat <<EOF { "kType": "lssn", "kKey": "$LSSN", "kFactor": "db_connections", "kValue": [ { "client_net_address": "10.0.0.5", "program_name": "MyApp", "cpu_load": 15, "last_sql": "SELECT * FROM users WHERE id = 1", "query_hash": "0xAB12CD34" } ] } EOF ) RESP3=$(curl -s -X POST "$API_URL" \ -H "Content-Type: application/x-www-form-urlencoded" \ --data-urlencode "token=$AT" \ --data-urlencode "text=KVSPut kType kKey kFactor" \ --data-urlencode "jsondata=$DB_PAYLOAD") echo "db_connections result: $(echo "$RESP3" | jq -r '.RstMsg')"
3. Python (Cross-platform)
import json import platform import socket import urllib.parse import urllib.request AT = "YOUR_SECRET_KEY" BASE_URL = "https://your-api.azurewebsites.net/api/giipApi" def api_post(url, fields): payload = urllib.parse.urlencode(fields).encode("utf-8") req = urllib.request.Request( url, data=payload, headers={"Content-Type": "application/x-www-form-urlencoded; charset=utf-8"}, ) with urllib.request.urlopen(req) as f: return json.loads(f.read().decode("utf-8")) # Step 1: Server Registration (AgentAutoRegister) — Obtain LSSN registration_data = { "hostname": socket.gethostname(), "os": platform.platform(), "cpu_cores": 8, "ipv4_local": socket.gethostbyname(socket.gethostname()), } resp = api_post( f"{BASE_URL}?cmd=AgentAutoRegister", { "token": AT, "text": "AgentAutoRegister", "jsondata": json.dumps(registration_data), }, ) lssn = resp.get("lssn") print(f"Registered. LSSN: {lssn}") # Step 2: netstat KVSPut netstat_payload = { "kType": "lssn", "kKey": str(lssn), "kFactor": "netstat", "kValue": [ { "remote_ip": "10.0.0.10", "remote_port": 8080, "state": "ESTABLISHED", "process_name": "myapp", } ], } resp2 = api_post( BASE_URL, { "token": AT, "text": "KVSPut kType kKey kFactor", "jsondata": json.dumps(netstat_payload), }, ) print(f"netstat result: {resp2.get('RstMsg')}") # Step 3: db_connections KVSPut db_payload = { "kType": "lssn", "kKey": str(lssn), "kFactor": "db_connections", "kValue": [ { "client_net_address": "10.0.0.5", "program_name": "MyApp.exe", "cpu_load": 15, "last_sql": "SELECT * FROM users WHERE id = 1", "query_hash": "0xAB12CD34", } ], } resp3 = api_post( BASE_URL, { "token": AT, "text": "KVSPut kType kKey kFactor", "jsondata": json.dumps(db_payload), }, ) print(f"db_connections result: {resp3.get('RstMsg')}")
Verification
After running a script, follow these steps to confirm data was received correctly.
- Server registration: Go to
and confirm the server appears with the correct hostname.Core Management > Server Inventory - DB mapping: Verify that
exactly matches theclient_net_address
value indb_host
.tManagedDatabase - Topology viewer: Navigate to
and check whether connection lines between nodes are active. Data is typically reflected within 1–2 minutes of transmission./admin/network-topology
Data Integrity Rules
Verify the following conditions before or after inserting data.
- IP mapping: The
field must be a JSON array in the formtLSvr.ips
. A plain string causes the node to appear as 'External' in the topology.[{"CIDR":"10.0.0.5/24"}] - DB host match: The
inclient_net_address
must be an exact text match (including case and whitespace) ofdb_connections
for a DB link to be created.tManagedDatabase.db_host - JSON Depth: When serializing jsondata that contains a
array, use Depth 10 or higher. Insufficient depth truncates nested objects.kValue - state value: Only
entries wherenetstat
equalsstate
are rendered as connection lines in the topology.ESTABLISHED
Troubleshooting
Response RstVal is not 200
| RstVal | Meaning | Action |
|---|---|---|
| 401 | Authentication failed | Verify the value (SK). Confirm it is in the request body, not an HTTP header |
| 400 | Bad request | Verify the field is exactly (literal string) |
| 500 | Server error | Validate jsondata is well-formed JSON. Check for unescaped quotes inside the string |
No connection lines appear in the topology
- Confirm the
value instate
kValue items is exactlynetstat
(uppercase).ESTABLISHED - Confirm
inclient_net_address
is an exact match of the DB host IP registered in GIIP.db_connections - Confirm
is a JSON array (tLSvr.ips
), not a plain string.[{"CIDR":"..."}]
LSSN was lost
Call AgentAutoRegister again with the same
hostname. The server returns the existing LSSN as long as the hostname is unique per server.
jsondata is being truncated in curl
Use
--data-urlencode instead of -d. This safely URL-encodes JSON strings that contain special characters. For very large payloads, switch to the giipApiSk3 endpoint (see below).
Python NameError for undefined variable
This guide's Python examples use a single variable named
AT. Do not mix in a variable named SK — it is not defined in these scripts.
High-fidelity Logging Endpoint (Sk3)
When transmitting thousands of connection entries or when you need detailed error diagnostics, use the
giipApiSk3 endpoint.
- Endpoint:
https://giipfaw.azurewebsites.net/api/giipApiSk3 - Benefits: Prevents data truncation for large jsondata payloads; automatically records detailed agent environment information and stack traces on error for faster topology debugging.
- Usage: Use the same request format as the standard endpoint — just change the URL.
Related Documents
Version: 1.4 Last Updated: 2026-06-19 Source:
giipv3/public/help/api-network-topology.en.md