---
title: "List Unattributed Inference Traffic Events"
method: GET
path: "/api/v1/edges/unattributed_inference/traffic"
tags: ["Edge"]
---

# List Unattributed Inference Traffic Events

`GET /api/v1/edges/unattributed_inference/traffic`

## Request

- Base URL: `https://example.conductor.one`
- URL: `https://example.conductor.one/api/v1/edges/unattributed_inference/traffic`
- Auth: HTTP bearer and OAuth 2
  - Client credentials
  - Token URL: `/auth/v1/token`

Lists auth-rejected inference requests that Time Bandit could not
 attribute to a single Edge, for the whole tenant. Rejections that resolve
 to exactly one Edge appear in that Edge's own inference traffic instead.
 Tenant-level data: restricted to the roles that hold EdgeService:owner
 (Super Administrator, AI Governance Administrator), not Edge or app owners.

## Query parameters

- `auth_rejection_reason` 'TB_AUTH_REJECTION_REASON_UNSPECIFIED' | 'TB_AUTH_REJECTION_REASON_MISSING_CREDENTIAL' | 'TB_AUTH_REJECTION_REASON_INVALID_TOKEN' | 'TB_AUTH_REJECTION_REASON_EXPIRED_TOKEN' | 'TB_AUTH_REJECTION_REASON_UNKNOWN_TENANT' | 'TB_AUTH_REJECTION_REASON_AUDIENCE_MISMATCH' | 'TB_AUTH_REJECTION_REASON_INSUFFICIENT_SCOPE' | 'TB_AUTH_REJECTION_REASON_INVALID_PROOF' | 'TB_AUTH_REJECTION_REASON_CREDENTIAL_UNAVAILABLE': Keeps only rejections with this reason. Unset keeps all.
- `page_size` integer: The pageSize field.
- `page_token` string: The pageToken field.
- `since` string, int64: The since field.
- `until` string, int64: The until field.

## Response `200`

Successful response

- C1ApiEdgeV1EdgeServiceListUnattributedInferenceTrafficEventsResponse: The EdgeServiceListUnattributedInferenceTrafficEventsResponse message.
  - `events` C1ApiEdgeV1TBTrafficEvent[], nullable: The events field.
    - `applicationOperation` string: The HTTP operation the Edge listener served for this row, e.g. "GET /v1/models". Lets a row with no upstream dest_host (a request the Edge answered locally) still say what it was. Empty on rows written before Time Bandit recorded it and on non-application flows.
    - `attemptOrdinal` string, uint64: One-based provider attempt; 0 on the listener-flow row. A retried call bills once per attempt.
    - `authRejectionReason` 'TB_AUTH_REJECTION_REASON_UNSPECIFIED' | 'TB_AUTH_REJECTION_REASON_MISSING_CREDENTIAL' | 'TB_AUTH_REJECTION_REASON_INVALID_TOKEN' | 'TB_AUTH_REJECTION_REASON_EXPIRED_TOKEN' | 'TB_AUTH_REJECTION_REASON_UNKNOWN_TENANT' | 'TB_AUTH_REJECTION_REASON_AUDIENCE_MISMATCH' | 'TB_AUTH_REJECTION_REASON_INSUFFICIENT_SCOPE' | 'TB_AUTH_REJECTION_REASON_INVALID_PROOF' | 'TB_AUTH_REJECTION_REASON_CREDENTIAL_UNAVAILABLE': Why authentication rejected the request. Set only when outcome is AUTH_REJECTED.
    - `authRejectionSourceClass` 'TB_AUTH_REJECTION_SOURCE_CLASS_UNSPECIFIED' | 'TB_AUTH_REJECTION_SOURCE_CLASS_LOOPBACK' | 'TB_AUTH_REJECTION_SOURCE_CLASS_PRIVATE' | 'TB_AUTH_REJECTION_SOURCE_CLASS_PUBLIC' | 'TB_AUTH_REJECTION_SOURCE_CLASS_UNKNOWN': Set only when outcome is AUTH_REJECTED. Class of the peer address.
    - `authRejectionSuppressedCount` string, uint64: Set only when outcome is AUTH_REJECTED. Rejections Time Bandit's rate limiter dropped since the previous emitted row of the same bucket (scope, source class and reason). The total number of rejections is the sum of 1 + auth_rejection_suppressed_count over the rows.
    - `cacheReadTokens` string, uint64: The cacheReadTokens field.
    - `cacheWriteTokens` string, uint64: The cacheWriteTokens field.
    - `callRole` string: answer | auxiliary. An auxiliary call bills on top of the answer call.
    - `capability` 'TB_TRAFFIC_CAPABILITY_UNSPECIFIED' | 'TB_TRAFFIC_CAPABILITY_EGRESS' | 'TB_TRAFFIC_CAPABILITY_LLM': The capability field.
    - `configGeneration` string: Time Bandit's own sha256 content hash of its daemon config -- not an Edge/C1 policy generation. Set on LLM rows only; empty on every egress row.
    - `contactPhase` string: How far the attempt got with the provider: not_started | started | responded. Empty when not recorded.
    - `costLookup` 'TB_COST_LOOKUP_UNSPECIFIED' | 'TB_COST_LOOKUP_PRICED' | 'TB_COST_LOOKUP_UNPRICED' | 'TB_COST_LOOKUP_UNMATCHED' | 'TB_COST_LOOKUP_ROUTE': The costLookup field.
    - `costNanoUsd` string, int64: Computed on read from the token counts above via pkg/inferenceprice; 0 and not a real price unless cost_lookup is PRICED.
    - `counterLatencyMs` string, uint64: The counterLatencyMs field.
    - `counterRequestBytes` string, uint64: The counterRequestBytes field.
    - `counterResponseBytes` string, uint64: The counterResponseBytes field.
    - `destHost` string: Egress-shaped destination fields; empty when capability is LLM and no egress connection underlies the call.
    - `destPort` integer: The destPort field.
    - `egressEnforcementMode` string: observe | enforce -- the Edge mode the egress access policy ran under for this row. Empty when no Edge egress-policy decision was made (every LLM/ingress row, and an Edge whose egress rules were never configured).
    - `egressPolicyVerdict` string: allow | deny -- what the Edge egress access policy decided, which is NOT always what was acted on. Under egress_enforcement_mode = "observe" a deny here rides a row whose outcome is allowed: the policy would have refused the CONNECT, and observe let it through anyway. Reading outcome alone cannot tell that row apart from one no rule objected to. Empty alongside egress_enforcement_mode.
    - `eventId` string: Deterministic over tenant+flow+event_time.
    - `eventTime` string, date-time, nullable
    - `federatedSession` C1ApiEdgeV1TBFederatedSession: TBFederatedSession is TB's secret-free hosted OAuth session lineage for a cryptographically attested call (see AuditFederatedSession in the TB sink). grant_jti_hash and proof_key_thumbprint are a hash and a public key thumbprint, not secrets.
      - `clientId` string: The clientId field.
      - `grantJtiHash` string: The grantJtiHash field.
      - `issuerName` string: The issuerName field.
      - `proofKeyThumbprint` string: The proofKeyThumbprint field.
      - `resource` string: The resource field.
      - `scopes` string[], nullable: The scopes field.
      - `sessionId` string: The sessionId field.
      - `tenantId` string: The tenantId field.
    - `flowId` string: The flowId field.
    - `ingressEnforcementMode` string: enforce | ...; empty alongside ingress_scope.
    - `ingressScope` string: The direct-listener scope this call authenticated through, e.g. "squire-idjag-llm"; empty on capture/legacy ingress with no listener scope.
    - `inputTokens` string, uint64: LLM token counts; zero on egress rows and on a listener-flow row that never reached a provider (see attempt_ordinal).
    - `judgeOutcome` 'TB_JUDGE_OUTCOME_UNSPECIFIED' | 'TB_JUDGE_OUTCOME_USABLE' | 'TB_JUDGE_OUTCOME_UNUSABLE' | 'TB_JUDGE_OUTCOME_CALL_FAILED' | 'TB_JUDGE_OUTCOME_UNREPORTED': Whether the routing algorithm could use this judge attempt's reply. Set only on judge provider-attempt rows Time Bandit recorded it for.
    - `judgeReason` string: Stable, content-free code for an UNUSABLE or UNREPORTED judge_outcome, e.g. "truncated_json", "verdict_rejected", "run_ended". Empty otherwise.
    - `logicalModel` string: The logicalModel field.
    - `modelName` string: The provider-native served model, e.g. "claude-opus-5" -- what cost is priced against. logical_model is only the caller-facing alias.
    - `modelRoute` string: LLM-shaped fields; empty when capability is EGRESS.
    - `modelTarget` string: The modelTarget field.
    - `observationStatus` string: observed | over_limit | malformed. Anything but "observed" means the audit body wasn't fully parsed, so the token counts above are a floor, not a total.
    - `outcome` 'TB_TRAFFIC_OUTCOME_UNSPECIFIED' | 'TB_TRAFFIC_OUTCOME_ALLOWED' | 'TB_TRAFFIC_OUTCOME_DENIED' | 'TB_TRAFFIC_OUTCOME_AUTH_REJECTED': The outcome field.
    - `outputTokens` string, uint64: The outputTokens field.
    - `parsedVerdictReasons` C1ApiEdgeV1TBVerdictReason[], nullable: Structured parse of verdict_reasons, one entry per verdict_reasons entry in the same order. Populated only when the request asked for it (include_parsed_verdict_reasons); verdict_reasons itself is unchanged.
      - `blockingKinds` string[], nullable: Credential kinds of the classes that were not exempted.
      - `classes` string[], nullable: Content-inspection class labels, e.g. "high-entropy", "jwt".
      - `clean` boolean: True for a content-inspection scan that found nothing.
      - `context` string: The content-inspection location (e.g. "request_header", "streaming_response"); empty for stages other than content and response_body.
      - `exemptedKinds` string[], nullable: Credential kinds (Time Bandit spelling, e.g. "ApiKey") the matching rule already exempts.
      - `response` boolean: True for a response-side finding.
      - `stage` string: rule_deny | ssrf | body_cap | encoding | content | response_body | other.
    - `policyVersion` string: The configuration version that decided the request: for a hosted Edge, the version C1 published for the Edge's configuration. An opaque digest, never comparable across planes. Empty when not recorded, including before authentication and on rows written before Time Bandit recorded it.
    - `principalUserId` string: The C1 user id source_principal resolves to, when it's an OIDC principal whose subject is a real C1 user; empty for a service/agent principal or one c1 couldn't resolve to a user.
    - `providerStatus` integer: The HTTP status the provider answered a failed attempt with, when it answered at all (100-599); 0 when there was none.
    - `reasonCode` string: Stable outcome code of the request: allowed, or the public error code the caller received. Set on request-level rows only; empty on provider-attempt rows and on rows written before Time Bandit recorded it.
    - `requestAuthority` string: The requestAuthority field.
    - `requestedMaxOutputTokens` string, uint64: The output-token cap this provider attempt asked for; 0 when the request set none or the row predates Time Bandit recording it.
    - `responseStopReason` string: Normalized stop reason of the provider reply: end_turn | max_tokens | tool_use | content_filter | error | unknown. Empty when not observed.
    - `routingFailureClass` string: Why this provider attempt failed, as Time Bandit's routing classified it: one of Switchyard's published failure classes, e.g. "provider_rejected", "provider_timeout", "transport". Empty when the attempt did not fail or the row predates it. Never carries provider error text.
    - `routingRunId` string: Joins the listener-flow row and its provider-attempt child row -- one LLM request writes both; empty on non-LLM rows.
    - `sourceConfidence` string: A | B | C | D | "" (unresolved).
    - `sourcePrincipal` string: Caller identity. source_principal_kind and source_confidence qualify how source_principal was resolved (see AuditSource in the TB sink).
    - `sourcePrincipalKind` string: The sourcePrincipalKind field.
    - `verdictFromFallback` boolean: True when this row's verdict is the fail-closed default rather than an explicit rule match, so an empty verdict_reasons isn't a missing-data gap.
    - `verdictReasons` string[], nullable: Why `outcome` resolved as it did. Can be legitimately empty even on a DENY -- see verdict_from_fallback.
    - `verdictResolvedRaw` string: The verdictResolvedRaw field.
  - `nextPageToken` string: The nextPageToken field.

## Changes

- **2026-10-20** `fe943bedf41b`: 2 info
  - added the optional property `events/items/policyVersion` to the response with the `200` status
  - added the optional property `events/items/reasonCode` to the response with the `200` status
- **2026-10-06** `918a4e749f56`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/conductorone/apis/c1-api/changes/api/v1/edges/unattributed_inference/traffic/get.md)

---

[API](https://skmtc.dev/conductorone/apis/c1-api.md) - [All operations](https://skmtc.dev/conductorone/apis/c1-api/llms.txt) - [OpenAPI document](https://skmtc.dev/conductorone/apis/c1-api/revisions/fe943bedf41b?raw)
