---
title: "Identify the authenticated account and credential"
method: GET
path: "/api/v1/me"
tags: ["Account"]
---

# Identify the authenticated account and credential

`GET /api/v1/me`

Returns caller-owned account and credential IDs, credential validity, paid-data entitlement and approved scopes. Null scopes mean full legacy developer-key access. Valid credentials can use this control-plane diagnostic path after paid access lapses; data routes still require active paid access. OAuth grants and named integration keys need read scope. Does not return credentials, payment details or personal contact details.

## Headers

- `X-Query-Validation` 'strict'

## Response `200`

Authenticated account and credential identity.

- AccountIdentity
  - `object` 'account', required
  - `data` object, required
    - `user_id` integer, required
    - `credential_id` integer, required
    - `credential_kind` 'api_key' | 'oauth_grant', required
    - `credential_status` 'active', required — The credential is currently valid; revoked, expired or unknown credentials are rejected.
    - `entitlement` object, required
      - `paid_data_access` 'active' | 'lapsed', required
      - `recovery_action` 'renew_subscription', nullable, required — When paid data access is lapsed, the caller should renew the subscription; otherwise null.
    - `scopes` string[], nullable, required — Approved OAuth scopes; null for full developer-key access.
  - `meta` ResponseMeta, required
    - `request_id` string, required — Unique request ID (req_ prefix). The same value as the X-Request-Id response header, the request's usage accounting row and its log lines.
    - `cached` boolean, required
    - `cache_age_s` integer — Cache age in seconds. Omitted when the response was not cached, and also when it was cached but its age cannot be established (an entry stored before its cache carried a computed instant). Never a placeholder: an unknown age is reported as no value rather than as the cache TTL.
    - `cost` integer, required — Advisory request weight (relative compute cost). 1 for simple reads; higher for heavier endpoints. Not a credit/price.
    - `ranking_generation` integer — Committed PostgreSQL-owned leaderboard generation for the returned rows and cursor. Present on GET /api/v1/leaderboard; omitted on endpoints that do not read this ranking.
    - `ranking_as_of` string, date-time — Authoritative RFC3339 timestamp from cache_generations.updated_at for ranking_generation. It is read in the same repeatable-read snapshot as the leaderboard rows and is not request time, cache write time, or row insertion order.
    - `directional_source` 'live' | 'degraded' — Which path produced the team-directional read on this response. Only present on endpoints that compute one (today: GET /api/v1/sports-edge-signals). "live" means the read RAN. "degraded" means it FAILED, so nothing was measured and the ranking fell back to raw conviction. The flag describes the READ, not its consequence: a read that ran and found nothing groupable also leaves the directional fields null, and that is honestly "live" -- the per-signal nulls already say "nothing to enrich here", so this snapshot-level flag carries only what they cannot, namely whether the read ran at all. A degraded response is cached on the shorter degraded TTL so it self-heals. Reported SEPARATELY from ranking_source because the two degradations are independent -- a sharp-money DB miss weakens the ranking DATA, a directional failure removes a ranking WEIGHT -- and a consumer down-weighting a degraded response needs to know which input it lost. Omitted on endpoints that compute no directional read.
    - `ranking_source` 'live' | 'db_only' — Which ranking-data path produced this response. Only present on endpoints that can degrade a ranking (today: GET /api/v1/sports-edge-signals). "live" is the normal path (the current holder pile from the provider batch); "db_only" is the degraded fallback (a truthful but weaker trader_markets ranking) served when the live sharp-money ranking batch is unavailable (a sharp-money DB read failure, not a Polymarket outage) and cached on a shorter TTL, so a consumer can down-weight or skip it. Omitted on endpoints that never degrade.
    - `category_skill_source` 'live' | 'partial' | 'degraded' | 'unavailable' — Whole filtered snapshot category-evidence status before pagination. Operational live always remains partial source coverage.
    - `category_skill_model_version` string
    - `category_skill_taxonomy_version` string
    - `category_skill_platform` 'polymarket'
    - `category_skill_scope` 'observed_goldsky_primary_taker_fill'
    - `category_skill_source_coverage` 'partial_whale_threshold_fills' | 'graded_wallet_fills'
    - `category_skill_observation_started_at` string, date-time
    - `category_skill_model_operationally_degraded` boolean — Whole-model operational readiness captured with the category model snapshot. Present on category-enriched responses even when the filtered signal list is empty. When true, category_skill_source is degraded and sports-edge-signals uses the shorter degraded cache TTL.
    - `category_skill_status_counts` object
      - `live` integer, required
      - `insufficient` integer, required
      - `stale` integer, required
      - `unknown` integer, required
      - `degraded` integer, required
    - `category_skill_base_payload_hash` string — SHA-256 of the funded signal membership/order/rank/cursor vector immediately before category-skill enrichment. Sports-edge-signals only.
    - `category_skill_enriched_base_payload_hash` string — Independent SHA-256 recomputation over the same base fields immediately after category-skill enrichment. Equality with category_skill_base_payload_hash proves shadow enrichment did not change funded inputs. Sports-edge-signals only.

## Other responses

- `401` — Missing or invalid API key
- `403` — Account access denied
- `423` — Account is locked
- `429` — Rate limit exceeded. GET /api/v1/me and GET /api/v1/usage share a separate control-plane inspection bucket of 100 reads/minute per user; these diagnostics do not spend the primary request or monthly quota. Honor Retry-After and the RateLimit-* headers. The per-address budget also applies.
- `503` — Redis-backed authenticated rate limiter unavailable; retry after the per-process outage cooldown

## Changes

- **2026-09-23** `ece7a25b7a44` — 5 warning, 5 info
  - added the new `freshness_ceiling_unsatisfied` enum value to the `error/reason` response property for the response status `401`
  - added the new `freshness_ceiling_unsatisfied` enum value to the `error/reason` response property for the response status `403`
  - added the new `freshness_ceiling_unsatisfied` enum value to the `error/reason` response property for the response status `423`
  - added the new `freshness_ceiling_unsatisfied` enum value to the `error/reason` response property for the response status `429`
  - …6 more
- **2026-09-23** `8462acf80f8c` — 5 warning
  - added the new `export_expired` enum value to the `error/reason` response property for the response status `401`
  - added the new `export_expired` enum value to the `error/reason` response property for the response status `403`
  - added the new `export_expired` enum value to the `error/reason` response property for the response status `423`
  - added the new `export_expired` enum value to the `error/reason` response property for the response status `429`
  - …1 more
- …earlier changes not shown

[Full history](https://skmtc.dev/0xinsider/apis/0xinsider-api/changes/api/v1/me/get.md)

---

[API](https://skmtc.dev/0xinsider/apis/0xinsider-api.md) · [All operations](https://skmtc.dev/0xinsider/apis/0xinsider-api/llms.txt) · [OpenAPI document](https://skmtc.dev/0xinsider/apis/0xinsider-api/revisions/2035b3316329?raw)
