---
title: "List an evidence asset’s live owners"
method: GET
path: "/v1/evidence/{assetId}/grants"
tags: ["Evidence"]
---

# List an evidence asset’s live owners

`GET /v1/evidence/{assetId}/grants`

## Request

- Base URL: `https://brain.inite.ai`
- URL: `https://brain.inite.ai/v1/evidence/{assetId}/grants`
- Auth: HTTP bearer

The asset’s LIVE (unrevoked) ownership rows. Revoked rows are audit, not a directory, and stay off the wire. Grantee handles are ownership facts about other principals, so they reach a caller that passed the ownership fence and nobody else — a non-owner gets the same bare 404 as for an asset that does not exist. Acting requires the caller to pass the raw-read gateway’s own fences over the asset: tenant (the lookup runs inside the authenticated tenant), liveness (not tombstoned, quarantine clean-or-absent, retention horizon not already past), OWNERSHIP (at least one live grant exists, and a user-bound key must hold the end user’s own live user grant), and the media-PII polarity (unclassified blocked, `[]` open, classified needs `brain:read_media`) — nobody shares what they cannot read. The byte-delivery steps are deliberately NOT applied (no bytes move here), so a metadata-only `external` asset is shareable; every serve still re-runs the full gateway ladder against the grantee. Any denial is the same bare 404 — unknown, foreign and forbidden are indistinguishable. 404 until `EVIDENCE_GRANTS_API_ENABLED=1` AND `EVIDENCE_SUBSTRATE_ENABLED=1` (raised in a guard, before body validation could reveal the route). Source: src/evidence/evidence-grants.controller.ts.

Required scope: `brain:read`.

## Path parameters

- `assetId` string, required

## Response `200`

The asset's live grants.

- EvidenceGrantsListResponse
  - `assetId` string, required
  - `grants` EvidenceGrantRow[], required
    - `grantId` string, required
    - `grantedAt` string, required
    - `ownerId` string, required
    - `ownerKind` 'user' | 'pack' | 'system', required
    - `purpose` string

## Other responses

- `401`: Missing or unknown bearer key.
- `403`: The key lacks the required scope.
- `404`: No such resource in this tenant.

---

[API](https://skmtc.dev/inite/apis/inite-brain-platform-api.md) · [All operations](https://skmtc.dev/inite/apis/inite-brain-platform-api/llms.txt) · [OpenAPI document](https://skmtc.dev/inite/apis/inite-brain-platform-api/revisions/c7c3eb5e304b?raw)
