---
title: "Get account summary"
method: GET
path: "/api/v1/me/summary"
tags: ["Settings"]
---

# Get account summary

`GET /api/v1/me/summary`

## Request

- Base URL: `https://api.proof.holdings`
- URL: `https://api.proof.holdings/api/v1/me/summary`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `auth_token`

One-call account snapshot — quota with projection, request health, per-channel completion rates, HITL counts, and active API keys — for the dashboard home and AI agents. Computed live. The hitl_channels sub-object requires the hitl:read scope (JWT sessions always receive it).

## Query parameters

- `environment` 'production' | 'test': Scope request/channel/HITL metrics to test or production data
- `profile_id` string: Scope request/channel/HITL metrics and key counts to one project (public profile): requests branded with the profile or created by its API keys. Quota stays account-wide (billing is per owner).

## Response `200`

Account summary

- AccountSummary: One-call account snapshot for the dashboard home and AI agents
  - `as_of` string, required: When the snapshot was computed (ISO 8601)
  - `cache_age_seconds` number, required: Always 0 — computed live
  - `quota` object, required
    - `plan` string, required
    - `limit` number, required
    - `current_usage` number, required
    - `days_remaining` number, required
    - `projected_eom_usage` number, required
    - `is_on_track` boolean, nullable, required: null when <5 days elapsed or usage is 0
    - `projection_unreliable` boolean, required: true when projection exceeds limit x3
  - `request_health` object, required
    - `pending` number, required
    - `partial` number, required
    - `completed` number, required
    - `expired` number, required
    - `cancelled` number, required
    - `pending_expiring_soon` number, required: Live pending/partial requests worth chasing: expiring within 24h AND already past the midpoint of their own lifetime. The second condition is what keeps a just-created short-lived request out of the count — advising a reminder for a request the recipient has not been handed yet. This is the REQUESTER's rule, so it matches `computed_state.is_expiring_soon` on the same row read from an owner surface, except for a row expiring at this exact instant, which the per-row derivation still calls live and this count excludes.
    - `success_rate` number, nullable, required: completed/(completed+expired+cancelled); null when denominator is 0
  - `top_channels` object[], required
    - `channel` string, required
    - `count` number, required: Attempted assets attributed to this channel
    - `completion_rate` number, nullable, required: verified / attempted
  - `channels_with_zero_completions` string[], required
  - `hitl_channels` object: Present only with hitl:read scope (JWT always)
    - `active_configs` number, required
    - `pending_confirmations` number, required
  - `active_api_keys` number, required
  - `next_action` object, nullable, required: Most-pressing account action; null when healthy
    - `state` string, required
    - `message` string, required

## Other responses

- `401`: Unauthorized
- `403`: `profile_mismatch` — a project-bound API key named another sub-account; it acts for its own sub-account only.

---

[API](https://skmtc.dev/proof/apis/proof-holdings-api.md) · [All operations](https://skmtc.dev/proof/apis/proof-holdings-api/llms.txt) · [OpenAPI document](https://skmtc.dev/proof/apis/proof-holdings-api/revisions/b15f506de696?raw)
