---
title: "List Visible Contents"
method: GET
path: "/v2/contents/visible"
tags: ["v2 - Contents"]
---

# List Visible Contents

`GET /v2/contents/visible`

## Request

- Base URL: `https://api.jubjubapp.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.jubjubapp.com/v2/contents/visible`
- Auth: HTTP bearer

Everything this profile MAY SEE, across every workspace it can reach.

🔑 THE VAULT ASKS THE WRONG QUESTION TODAY. It answers "what did I put
here" — the dashboard queries `onchain_publish_events` by
`contributors_jubjub_profile_ids array-contains me`, so a teammate's piece
in a workspace I fully share is invisible to me even though I can open it
and play it through the workspace door. This endpoint answers "what may I
see" instead, which is the question a shared workspace implies.

⚠️ THE ACCESS RULE IS NOT REIMPLEMENTED HERE. Every candidate workspace is
put through `check_workspace_access` — the SAME function
`require_workspace_context` and `verify_workspace_permission` use, and
therefore the same one that already governs playback. A second copy of an
access rule is how a leak happens: the copies drift, one of them forgets
a case, and the forgetful one is the one serving media. There is exactly
one rule and this calls it.

Candidates are gathered widely and then FILTERED by that rule, never
trusted from the gathering step:
  * workspaces owned by, or directly listing, this profile
    (`list_by_profile` — which covers owner + direct member only)
  * workspaces linked to any team this profile belongs to, which
    `list_by_profile` does NOT return: that omission is precisely the gap
    being closed.

Membership is checked per workspace even for team-linked candidates,
because team membership is necessary but not sufficient — the permission
still has to hold.

## Query parameters

- `limit` integer
- `offset` integer

## Headers

- `Authorization` string
- `X-JubJub-Service-Key` string
- `X-JubJub-Agent-Key` string
- `X-JubJub-Platform-Key` string
- `Origin` string
- `Referer` string
- `X-JubJub-Trial-Token` string

## Response `200`

Successful Response

- ContentListResponse: Response for listing contents.
  - `contents` ContentCardResponse[], required
    - `content_id` string, required
    - `workspace_id` string, nullable
    - `folder_id` string, nullable
    - `title` string, required
    - `description` string, nullable, required
    - `video_id` string, required
    - `thumbnail_id` string, nullable, required
    - `thumbnail_url` string, nullable
    - `current_version` integer
    - `version_count` integer
    - `approval_status` string
    - `status` string, required
    - `platforms` string[]: Configured platform names (legacy)
    - `platform_configs` PlatformConfigInfo[]: Platform configs with real status
      - `config_id` string, required
      - `platform` string, required
      - `status` string, required
      - `credential_id` string, nullable
      - `credential_name` string, nullable
    - `updated_at` string, date-time, required
    - `ownership_contract_address` string, nullable
    - `on_chain_tx_hash` string, nullable
    - `on_chain_confirmed` boolean
    - `source` string, nullable
    - `published_at` string, nullable
    - `registered_at` string, nullable
    - `platform` string, nullable
  - `total` integer, required
  - `limit` integer, required
  - `offset` integer, required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/jubjubapp/apis/jubjub-api.md) - [All operations](https://skmtc.dev/jubjubapp/apis/jubjub-api/llms.txt) - [OpenAPI document](https://skmtc.dev/jubjubapp/apis/jubjub-api/revisions/353157b296f2?raw)
