✦
Trace
/API Reference
← BackTalk to us
API Reference
Pricing
Lookup$0.10
TikTok$2.00
Instagram$3.00+
Both$5.00+
RerunFree
+ $1.20/1k IG following >1,000

Horizon Trace API

Social intelligence API. Submit an Instagram or TikTok handle — get back profile classification, personality signals, network graph, confirmed locations, and risk signals. Start with /lookup at $0.10. Scale to full traces when you need depth.

text
Base URL:  https://api.myhorizonview.com
Auth:      X-API-Key header (get your key from the developer portal)
Format:    JSON
Async:     Traces are queued — submit, poll /status, fetch /report

Authentication

Every request requires an X-API-Key header. Generate keys from the developer portal. Keys begin with htk_ and are shown once on creation.

bash
curl https://api.myhorizonview.com/api/v1/credits \
  -H "X-API-Key: htk_your_key_here"

Returns 401 if the key is missing, invalid, or revoked. Returns 402 if your credit balance is insufficient for the requested operation.

POST /api/v1/lookup

POST/api/v1/lookup★ Start here

Fetch profile data, instant account classification, and bare personality signals derived from bio. No trace required. $0.10 per profile found — profiles not found are not charged.

Request

ig_usernamestring?
Instagram username (without @)
tt_usernamestring?
TikTok username (without @)
At least one username required.

Example request

bash
curl -X POST https://api.myhorizonview.com/api/v1/lookup \
  -H "X-API-Key: htk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"ig_username": "target_handle"}'

Response

json
{
  "status":   "success",
  "found":    ["ig"],
  "cost_usd": 0.10,
  "profiles": {
    "ig": {
      "username":     "target_handle",
      "display_name": "Mario Egie",
      "followers":    4200,
      "following":    834,
      "posts":        312,
      "is_private":   false,
      "is_verified":  false,
      "bio":          "Founder @HorizonView · Spatial AI",
      "profile_pic":  "https://...",

      "classification": {
        "tier":        "T3",
        "warmth":      "HOT",
        "disposition": "NORMAL"
      },

      "bare_personality": {
        "signals": [
          { "label": "Entrepreneurship & Business", "confidence": "HIGH"   },
          { "label": "Technology & Development",    "confidence": "MEDIUM" }
        ],
        "has_website_link": true,
        "confidence_note":  "Derived from bio and display name only."
      }
    }
  }
}

Classification field reference

tierstring
Follower count bracket
T1 <100 · T2 <1k · T3 <10k · T4 <100k · T5 <1M · T6 <10M · T7 10M+
warmthstring
Activity level by post count
COLD = 0 · COLD_WARM = 1–5 · WARM = 6–20 · HOT = 21+
dispositionstring
Follow ratio signal
CREATOR = ratio <0.5 · CONSUMER = ratio >2.0 · MINIMALIST = both <100 · NORMAL · UNKNOWN

bare_personality note

Signals are extracted from the bio text and display name using keyword pattern matching — the same categories used in full trace personality analysis. HIGH confidence means explicit keywords were matched (job titles, business links). MEDIUM means strong category keywords. LOW means weaker signals. For personality weighted across hundreds of accounts the subject follows, run a full trace.

POST /api/v1/trace

POST/api/v1/trace

Submit a full trace. Credits are deducted immediately and the trace is queued. Returns a trace_id to poll. Run /lookup first to get the IG following count and compute your exact cost before submitting.

Request

ig_usernamestring?
Instagram username (without @)
tt_usernamestring?
TikTok username (without @)
ig_limitint
Max Instagram following to collect. Use when subject follows more than 1,000 — set to the total you want covered.
Default: 1000. Cost: $1.20 per 1,000 above 1,000.
At least one username required.

IG overage pricing

If the subject follows more than 1,000 accounts on Instagram, an overage charge applies: $1.20 per 1,000 following above 1,000.

text
subject.ig.following = 4500
overage = 4500 - 1000 = 3500
overage_cost = (3500 / 1000) × $1.20 = $4.20
total = $3.00 base + $4.20 = $7.20

Example request

bash
curl -X POST https://api.myhorizonview.com/api/v1/trace \
  -H "X-API-Key: htk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"tt_username": "target_handle"}'

Response

json
{
  "status":    "queued",
  "trace_id":  1042,
  "platforms": ["tt"],
  "cost": {
    "base_cost_usd":   2.00,
    "extra_following": 0,
    "extra_cost_usd":  0.00,
    "total_cost_usd":  2.00,
    "ig_following":    0,
    "ig_limit":        1000
  },
  "message": "Poll GET /api/v1/trace/1042/status for progress."
}

GET /api/v1/trace/{id}/status

GET/api/v1/trace/{id}/statusfree

Poll for trace progress. Recommended interval: every 10 seconds. Traces typically complete in 5–15 minutes.

Response

json
{
  "trace_id": 1042,
  "status":   "collecting",
  "progress": "Building intelligence report...",
  "complete": false,
  "failed":   false
}
statusstring
Current stage
pending · collecting · analysing · complete · failed
progressstring
Human-readable progress message
completebool
True when report is ready to fetch
failedbool
True if trace failed — use POST /rerun to retry free

GET /api/v1/trace/{id}/report

GET/api/v1/trace/{id}/reportfree

Fetch the completed intelligence report. Returns 425 if not yet complete — keep polling /status.

Top-level response

json
{
  "status":     "success",
  "trace_id":   1042,
  "platforms":  ["tt"],
  "report": {
    "classification":     { ... },
    "personality":        { ... },
    "network":            { ... },
    "twitter_personality": {},
    "analysed_at":        "2026-08-07T21:04:44.668110+00:00"
  }
}

report.classification

json
"classification": {
  "primary_platform": "tt",
  "primary": {
    "platform":    "tt",
    "tier":        "T4",
    "warmth":      "HOT",
    "disposition": "CREATOR",
    "followers":   94958,
    "following":   69,
    "posts":       107,
    "is_private":  false,
    "is_verified": false,
    "bio":         "Instagram:username\nPlease follow on ig",
    "name":        "Display Name",
    "username":    "username"
  },
  "per_platform": {
    "tt": { /* same shape as primary */ }
  },
  "consistency": {
    "status":  "single_platform",
    "signals": []
  },
  "private_signals": {}
}
consistency.statusstring
Cross-platform consistency
single_platform · consistent · inconsistent
consistency.signalsstring[]
Inconsistency descriptions when multiple platforms traced
private_signalsobject
Per-platform private account interpretation — only present when is_private=true

report.personality

json
"personality": {
  "interests": [
    { "signal": "entrepreneur_mindset", "label": "Entrepreneurship & Business", "score": 6.0 },
    { "signal": "fashion_interest",     "label": "Fashion & Style",             "score": 4.0 },
    { "signal": "tech_interest",        "label": "Technology & Development",    "score": 4.0 }
  ],
  "location_interests": {
    "global": {
      "London":  { "count": 8,  "signal": "uk_ambition",           "lat": 51.5074, "lng": -0.1277 },
      "Dubai":   { "count": 5,  "signal": "global_expansion",      "lat": 25.2048, "lng": 55.2708 },
      "Lagos":   { "count": 22, "signal": "nigerian_state"                                         },
      "Berlin":  { "count": 3,  "signal": "europe_ambition",       "lat": 52.5200, "lng": 13.4050 }
    }
  },
  "confirmed_locations": {
    "confirmed_base": [
      { "city": "Lagos", "count": 14, "lat": 6.5244, "lng": 3.3792 }
    ],
    "visited":        [],
    "travel_signals": [
      { "city": "London", "count": 2, "lat": 51.5074, "lng": -0.1277 }
    ]
  },
  "gender": {
    "gender":     "MALE",
    "confidence": "MEDIUM",
    "method":     "name_match"
  },
  "risk_signals":           [],
  "fake_accounts_followed": 0,
  "fake_accounts_list":     []
}
interests[].signalstring
Internal signal key
interests[].labelstring
Human-readable interest label
interests[].scorefloat
Aggregated signal strength. Higher = stronger signal across the following list.
location_interests.globalobject
City-level location signals detected across the following list. Key = city name, value = { count, signal, lat?, lng? }. Nigerian states appear here as cities alongside all other locations — no country-specific grouping.
confirmed_locations.confirmed_basearray
Cities with 3+ post/video location tags. { city, count, lat?, lng? }
confirmed_locations.visitedarray
Cities with 1–2 post tags. Domestic locations.
confirmed_locations.travel_signalsarray
Cities with 1–2 post tags. Detected as foreign.
gender.genderstring
Inferred gender
MALE · FEMALE · INCONCLUSIVE
gender.confidencestring
Inference confidence
HIGH · MEDIUM · LOW
gender.methodstring
How gender was inferred
name_match · category_signals · none
risk_signalsarray
{ signal, level, account } — financial scam or high-risk pattern detected in following list
fake_accounts_followedint
Count of flagged fake/bot accounts in the following list

report.network

json
"network": {
  "nodes": [
    {
      "username":     "atletiboy",
      "display_name": "Atletiboy",
      "bio":          "Atlético isn't just a team to me – it's family.",
      "profile_pic":  "https://...",
      "platforms":    ["tt"],
      "tss":          63,
      "bss":          90,
      "network_tier": "INNER_CIRCLE",
      "interaction_types": ["commented on post(s)"],
      "is_shadow":    false,
      "is_predicted": false,
      "platform_match_confidence": 1.0
    }
  ],
  "inner_circle":    [ /* top ~30% of high-TSS nodes */ ],
  "close_network":   [ /* remaining high-TSS nodes  */ ],
  "active_network":  [ /* TSS >= 40% of top score   */ ],
  "peripheral":      [ /* below active threshold     */ ],
  "shadow_ties":     [ /* zero TSS, high BSS — connected by pattern only */ ],
  "pool_activations":[ /* brand/page accounts that activated from pool  */ ],
  "is_predicted_network": false
}
nodes[].tssint
Tie Strength Score 0–100. How strong the connection is (interaction weight × BSS multiplier).
nodes[].bssint
Behavioural Similarity Score 0–95. How similar the candidate's account behaviour is to the subject's.
nodes[].network_tierstring
Ring placement
INNER_CIRCLE · CLOSE_NETWORK · ACTIVE_NETWORK · PERIPHERAL · SHADOW
nodes[].interaction_typesstring[]
What interactions qualified this node
commented on post(s) · liked N post(s) · tagged in post · collaborated on post · mutual mention engagement · subject replied to comment
nodes[].is_shadowbool
True if TSS=0 but BSS≥60 — connected by pattern, no visible interaction
nodes[].is_predictedbool
True when the subject is private and the network was predicted from tier/warmth ratios rather than real data
nodes[].platformsstring[]
Which platforms this node was found on. Multiple platforms = cross-platform match confirmed.
is_predicted_networkbool
True when the entire network was predicted (private subject, no following data available)

POST /api/v1/trace/{id}/rerun

POST/api/v1/trace/{id}/rerunfree

Re-run a failed trace at no charge. Cannot rerun a completed trace — submit a new trace instead.

Response

json
{
  "status":   "queued",
  "trace_id": 1042,
  "cost_usd": 0.00,
  "message":  "Re-queued free. Poll GET /api/v1/trace/1042/status."
}

GET /api/v1/credits

GET/api/v1/creditsfree

Response

json
{
  "balance_usd":    4.90,
  "total_topped":   10.00,
  "total_spent":    5.10,
  "last_topped_up": "2026-09-01T21:37:00+00:00",
  "pricing": {
    "lookup":         "$0.10 per profile found",
    "trace_tt":       "$2.00 flat",
    "trace_ig":       "$3.00 base + $1.20 per 1,000 IG following above 1,000",
    "trace_both":     "$5.00 base + $1.20 per 1,000 IG following above 1,000",
    "rerun":          "free"
  },
  "recent_requests": [
    {
      "endpoint":  "trace_tt",
      "platforms": ["tt"],
      "trace_id":  1042,
      "status":    "complete",
      "cost_usd":  2.00,
      "date":      "2026-09-01T22:00:00+00:00"
    }
  ]
}

GET /api/v1/usage

GET/api/v1/usagefree

Paginated request log. Use ?limit=50&offset=0 query params.

Response

json
{
  "total":  42,
  "offset": 0,
  "limit":  50,
  "requests": [
    {
      "request_id": 88,
      "endpoint":   "trace_tt",
      "platforms":  ["tt"],
      "trace_id":   1042,
      "status":     "complete",
      "cost_usd":   2.00,
      "error":      null,
      "date":       "2026-09-01T22:00:00+00:00"
    }
  ]
}

Pricing

Lookupper profile found — profiles not found not charged
$0.10
TikTok traceflat per trace
$2.00
Instagram tracebase per trace
$3.00
IG overageper 1,000 following above 1,000
$1.20
Both platformsbase per trace
$5.00
Rerun on failureretry at no charge
Free

Credits are topped up via USDT (Cryptomus). Minimum top-up $5.00. Credits appear within ~2 minutes of on-chain confirmation. Also available on RapidAPI with monthly subscription plans and credit card billing.

Errors

400Bad request — missing or invalid parameters
401Invalid or revoked API key
402Insufficient credits
404Trace not found
422Trace failed — use POST /rerun to retry free
425Trace not ready — keep polling /status
429Rate limit or quota exceeded (RapidAPI plans)
502Upstream profile fetch failed — retry

All error responses return { "detail": "message" }.