cURL

curl https://api.traceexit.com/v1/ip/203.0.113.10 \
  -H "Authorization: Bearer te_live_…" \
  -H "Accept: application/json"

Node

const res = await fetch("https://api.traceexit.com/v1/ip/203.0.113.10", {
  headers: { Authorization: "Bearer " + process.env.TRACE_EXIT_API_KEY },
});
const dto = await res.json();

MCP (Cursor)

{
  "mcpServers": {
    "traceexit": {
      "command": "npx",
      "args": ["-y", "@traceexit/mcp"],
      "env": {
        "TRACE_EXIT_API_KEY": "te_live_…",
        "TRACE_EXIT_BASE_URL": "https://api.traceexit.com"
      }
    }
  }
}

Tools: lookup_ip, check_privacy, check_fraud. Same keys and quotas as REST. Connect MCP.

Response shape

Nested IpLookupDto — no public sources[]. Use ?legacy=true for flat SA-compatible fields.

{
  "ip": "203.0.113.10",
  "ipVersion": 4,
  "privacy": {
    "vpn": false,
    "proxy": false,
    "tor": false,
    "datacenter": true,
    "residentialProxy": false,
    "anonymizer": false
  },
  "risk": {
    "score": 42,
    "level": "medium"
  },
  "location": {
    "countryCode": "US",
    "city": "Ashburn"
  },
  "meta": {
    "cacheHit": true
  }
}

CGNAT / mobile

Shared carrier NATs can look noisy. Prefer ASN allowlists for known mobile ranges; see enterprise guidance when you scale.

API & MCP documentation — Trace Exit