# List bundles

List the apps, websites, newsletters, documents and templates you can access. Each item identifies its business content type. Use its content ID with content management operations or as the corresponding document or template ID.

POST https://api.brigg.app/v1/operations/workspace.ListBundles

## Access & visibility

Allow `workspace.ListBundles` on your API key.

**Workspace access by default.** Private member data requires [approved member delegation](https://developer.brigg.app/authentication#member-delegation) through `Brigg-Act-As`; the key supplies permissions while private ownership and project boundaries remain enforced.

[Set up authentication](https://developer.brigg.app/authentication) · [Choose permissions](https://developer.brigg.app/permissions)

## Request

No parameters. Send an empty JSON object (`{}`).

## Response

Returns **200 OK** with a JSON body.

This operation has no continuation cursor. An empty `items` array means no matching visible results were returned.
| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `items` | array of [Workspace content](#workspace-content-response-items) | Yes | Apps, websites, documents, templates, newsletters and integrations visible to the acting member; kind identifies the content type. This operation has no cursor pagination. |

### Workspace content · response.items[]

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `content_id` | string | Yes | Content ID used by document, app and sharing operations. It is distinct from an uploaded file ID. |
| `label` | string | Yes | Human-readable name of the content item. |
| `kind` | string | Yes | Content category; use it to choose the matching document, template, website or app workflow. Allowed: `"app"`, `"website"`, `"newsletter"`, `"document"`, `"template"`, `"integration"`. |
| `published` | boolean | Yes | Whether a published version exists. Publication here does not by itself mean anonymous public access. |
| `has_unsaved_changes` | boolean | Yes | Whether the acting member has changes that differ from the saved version. |

## Errors & retries

This operation reads data. It needs no idempotency key and can be retried after a transient failure.

For rate limits, follow the server’s retry guidance and back off. See [HTTP errors](https://developer.brigg.app/http#errors) and [safe retries and limits](https://developer.brigg.app/reliability).

| HTTP status | Code | What to do |
| --- | --- | --- |
| 400 | `invalid_json` | Send a JSON object with Content-Type: application/json. |
| 400 | `invalid_input` | Check the request fields and types. |
| 401 | `invalid_key` | The workspace API key is missing, invalid or revoked. |
| 403 | `forbidden` | Check the key’s operation and resource grants. If Brigg-Act-As is supplied, the key must be authorized to delegate to that member. |
| 404 | `not_found` | The requested operation or resource is not available to this credential. |
| 429 | `rate_limited` | Wait for Retry-After before retrying. |

## Next steps

[Download OpenAPI](https://developer.brigg.app/openapi.json) · [Versioning & retirement](https://developer.brigg.app/versioning)

## Examples

### Example request

Fictional values. Replace IDs and business details with values from your workspace.
#### cURL


```sh
curl 'https://api.brigg.app/v1/operations/workspace.ListBundles' \
  -H "Authorization: Bearer $BRIGG_API_KEY" \
  -H 'Content-Type: application/json' \
  --data-raw '{}'
```

#### TypeScript


```typescript
const response = await fetch("https://api.brigg.app/v1/operations/workspace.ListBundles", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.BRIGG_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({}),
});
const result = await response.json();
if (!response.ok) throw new Error(`${response.status}: ${result.error} — ${result.message}`);
console.log(result);
```

#### Python


```python
import json
import os
from urllib.request import Request, urlopen
from urllib.error import HTTPError

payload = {}
request = Request(
    "https://api.brigg.app/v1/operations/workspace.ListBundles",
    data=json.dumps(payload).encode("utf-8"),
    headers={
        "Authorization": f"Bearer {os.environ['BRIGG_API_KEY']}",
        "Content-Type": "application/json",
    },
    method="POST",
)
try:
    with urlopen(request) as response:
        print(json.load(response))
except HTTPError as error:
    print(error.code, json.load(error))
    raise
```

#### Response example


```json
{
  "items": [
    {
      "content_id": "document_proposal",
      "label": "Consulting proposal",
      "kind": "document",
      "published": true,
      "has_unsaved_changes": false
    }
  ]
}
```

## JSON schemas


```json-schema-request
{
  "type": "object",
  "properties": {},
  "additionalProperties": false,
  "examples": [
    {}
  ]
}
```


```json-schema-response
{
  "type": "object",
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "content_id": {
            "type": "string",
            "description": "Content ID used by document, app and sharing operations. It is distinct from an uploaded file ID.",
            "examples": [
              "document_proposal"
            ]
          },
          "label": {
            "type": "string",
            "description": "Human-readable name of the content item.",
            "examples": [
              "Consulting proposal"
            ]
          },
          "kind": {
            "type": "string",
            "enum": [
              "app",
              "website",
              "newsletter",
              "document",
              "template",
              "integration"
            ],
            "description": "Content category; use it to choose the matching document, template, website or app workflow.",
            "examples": [
              "document"
            ]
          },
          "published": {
            "type": "boolean",
            "description": "Whether a published version exists. Publication here does not by itself mean anonymous public access.",
            "examples": [
              true
            ]
          },
          "has_unsaved_changes": {
            "type": "boolean",
            "description": "Whether the acting member has changes that differ from the saved version.",
            "examples": [
              false
            ]
          }
        },
        "required": [
          "content_id",
          "label",
          "kind",
          "published",
          "has_unsaved_changes"
        ],
        "additionalProperties": false,
        "title": "Workspace content"
      },
      "description": "Apps, websites, documents, templates, newsletters and integrations visible to the acting member; kind identifies the content type. This operation has no cursor pagination."
    }
  },
  "required": [
    "items"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "items": [
        {
          "content_id": "document_proposal",
          "label": "Consulting proposal",
          "kind": "document",
          "published": true,
          "has_unsaved_changes": false
        }
      ]
    }
  ]
}
```

