> ## Documentation Index
> Fetch the complete documentation index at: https://docs.broadcast.events/llms.txt
> Use this file to discover all available pages before exploring further.

# Workspace event info

> Read upcoming workspace-scoped events through api.broadcast.events.

export const SourceFieldsTable = () => <table>
        <thead>
            <tr>
                <th>Field</th>
                <th>Type</th>
                <th>Description</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    <code>provider</code>
                </td>
                <td>String</td>
                <td>Current source provider. At the moment this is internal</td>
            </tr>
        </tbody>
    </table>;

export const LinksFieldsTable = ({includeWorkspaceFields = false}) => {
  const rows = [[<code>self</code>, 'String', 'Public Broadcast URL for the event']];
  if (includeWorkspaceFields) {
    rows.push([<code>moreInfo</code>, 'String', 'Optional external information URL']);
  }
  return <table>
            <thead>
                <tr>
                    <th>Field</th>
                    <th>Type</th>
                    <th>Description</th>
                </tr>
            </thead>
            <tbody>
                {rows.map((row, index) => <tr key={index}>
                        {row.map((cell, cellIndex) => <td key={cellIndex}>{cell}</td>)}
                    </tr>)}
            </tbody>
        </table>;
};

export const MediaEmbedsFieldsTable = () => <table>
        <thead>
            <tr>
                <th>Field</th>
                <th>Type</th>
                <th>Description</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    <code>type</code>
                </td>
                <td>String</td>
                <td>Embed provider or type</td>
            </tr>
            <tr>
                <td>
                    <code>name</code>
                </td>
                <td>String</td>
                <td>Human-readable embed label</td>
            </tr>
            <tr>
                <td>
                    <code>id</code>
                </td>
                <td>String</td>
                <td>Embed identifier</td>
            </tr>
        </tbody>
    </table>;

export const ImageVariantsFieldsTable = () => <table>
        <thead>
            <tr>
                <th>Field</th>
                <th>Type</th>
                <th>Description</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    <code>micro</code>
                </td>
                <td>String</td>
                <td>Small preview variant</td>
            </tr>
            <tr>
                <td>
                    <code>small</code>
                </td>
                <td>String</td>
                <td>Small image variant</td>
            </tr>
            <tr>
                <td>
                    <code>medium</code>
                </td>
                <td>String</td>
                <td>Medium image variant</td>
            </tr>
            <tr>
                <td>
                    <code>large</code>
                </td>
                <td>String</td>
                <td>Large image variant</td>
            </tr>
        </tbody>
    </table>;

export const ImageAssetFieldsTable = () => <table>
        <thead>
            <tr>
                <th>Field</th>
                <th>Type</th>
                <th>Description</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    <code>alt</code>
                </td>
                <td>String</td>
                <td>Alt text when available</td>
            </tr>
            <tr>
                <td>
                    <code>url</code>
                </td>
                <td>String</td>
                <td>Default image URL</td>
            </tr>
            <tr>
                <td>
                    <code>variants</code>
                </td>
                <td>Object</td>
                <td>Responsive image URLs in multiple sizes</td>
            </tr>
        </tbody>
    </table>;

export const MediaFieldsTable = ({includeWorkspaceFields = false}) => {
  const rows = [[<code>image</code>, 'Object', 'Event image asset']];
  if (includeWorkspaceFields) {
    rows.push([<code>youtube</code>, 'String', 'YouTube URL when available'], [<code>embeds</code>, 'Array of objects', 'Additional embed metadata']);
  }
  return <table>
            <thead>
                <tr>
                    <th>Field</th>
                    <th>Type</th>
                    <th>Description</th>
                </tr>
            </thead>
            <tbody>
                {rows.map((row, index) => <tr key={index}>
                        {row.map((cell, cellIndex) => <td key={cellIndex}>{cell}</td>)}
                    </tr>)}
            </tbody>
        </table>;
};

export const VenueProfileFieldsTable = () => <table>
        <thead>
            <tr>
                <th>Field</th>
                <th>Type</th>
                <th>Description</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    <code>handle</code>
                </td>
                <td>String</td>
                <td>Profile handle such as @john-dee</td>
            </tr>
            <tr>
                <td>
                    <code>canonicalUrl</code>
                </td>
                <td>String</td>
                <td>Canonical public profile URL</td>
            </tr>
        </tbody>
    </table>;

export const VenueLinksFieldsTable = ({includeProfileFields = false}) => {
  const rows = [[<code>self</code>, 'String', 'Public Broadcast URL for the venue']];
  if (includeProfileFields) {
    rows.push([<code>entity</code>, 'String', 'Public entity route. Currently same as self'], [<code>profile</code>, 'String', 'Canonical profile URL when the venue has a slug']);
  }
  return <table>
            <thead>
                <tr>
                    <th>Field</th>
                    <th>Type</th>
                    <th>Description</th>
                </tr>
            </thead>
            <tbody>
                {rows.map((row, index) => <tr key={index}>
                        {row.map((cell, cellIndex) => <td key={cellIndex}>{cell}</td>)}
                    </tr>)}
            </tbody>
        </table>;
};

export const VenueGeoFieldsTable = () => <table>
        <thead>
            <tr>
                <th>Field</th>
                <th>Type</th>
                <th>Description</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    <code>latitude</code>
                </td>
                <td>Number</td>
                <td>Venue latitude</td>
            </tr>
            <tr>
                <td>
                    <code>longitude</code>
                </td>
                <td>Number</td>
                <td>Venue longitude</td>
            </tr>
        </tbody>
    </table>;

export const VenueAddressFieldsTable = () => <table>
        <thead>
            <tr>
                <th>Field</th>
                <th>Type</th>
                <th>Description</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    <code>street</code>
                </td>
                <td>String</td>
                <td>Street address</td>
            </tr>
            <tr>
                <td>
                    <code>city</code>
                </td>
                <td>String</td>
                <td>City name</td>
            </tr>
            <tr>
                <td>
                    <code>postalCode</code>
                </td>
                <td>String</td>
                <td>Postal or ZIP code</td>
            </tr>
            <tr>
                <td>
                    <code>country</code>
                </td>
                <td>String</td>
                <td>Two-letter country code such as NO</td>
            </tr>
        </tbody>
    </table>;

export const VenueFieldsTable = ({includeProfileFields = false}) => {
  const rows = [[<code>id</code>, 'String', 'Broadcast venue ID'], [<code>type</code>, 'String', 'Always venue'], [<code>name</code>, 'String', 'Venue name'], [<code>address</code>, 'Object', 'Venue address details'], [<code>geo</code>, 'Object', 'Venue coordinates when available'], [<code>links</code>, 'Object', includeProfileFields ? 'Public venue and profile links' : 'Public venue links']];
  if (includeProfileFields) {
    rows.push([<code>profile</code>, 'Object', 'Minimal profile metadata']);
  }
  rows.push([<code>media</code>, 'Object', 'Venue media assets']);
  return <table>
            <thead>
                <tr>
                    <th>Field</th>
                    <th>Type</th>
                    <th>Description</th>
                </tr>
            </thead>
            <tbody>
                {rows.map((row, index) => <tr key={index}>
                        {row.map((cell, cellIndex) => <td key={cellIndex}>{cell}</td>)}
                    </tr>)}
            </tbody>
        </table>;
};

export const LocationFieldsTable = () => <table>
        <thead>
            <tr>
                <th>Field</th>
                <th>Type</th>
                <th>Description</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    <code>type</code>
                </td>
                <td>String</td>
                <td>One of venue, online, hybrid, or tba</td>
            </tr>
            <tr>
                <td>
                    <code>venue</code>
                </td>
                <td>Object</td>
                <td>Venue details when the event is tied to a venue</td>
            </tr>
        </tbody>
    </table>;

export const AttendanceCallToActionFieldsTable = () => <table>
        <thead>
            <tr>
                <th>Field</th>
                <th>Type</th>
                <th>Description</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    <code>label</code>
                </td>
                <td>String</td>
                <td>CTA label such as Book table or Reserve</td>
            </tr>
            <tr>
                <td>
                    <code>url</code>
                </td>
                <td>String</td>
                <td>CTA destination URL</td>
            </tr>
        </tbody>
    </table>;

export const AttendancePriceFieldsTable = () => <table>
        <thead>
            <tr>
                <th>Field</th>
                <th>Type</th>
                <th>Description</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    <code>text</code>
                </td>
                <td>String</td>
                <td>
                    Human-readable price label such as NOK 250 or Free Entry
                </td>
            </tr>
        </tbody>
    </table>;

export const AttendanceFieldsTable = ({includeWorkspaceFields = false}) => {
  const rows = [[<code>isFree</code>, 'Boolean', 'true when the event has free entry'], [<code>soldOut</code>, 'Boolean', 'true when the event is sold out'], [<code>price</code>, 'Object', 'Price details']];
  if (includeWorkspaceFields) {
    rows.push([<code>ticketing</code>, 'String', 'Primary ticket URL'], [<code>commonTicketUrl</code>, 'String', 'Shared or default ticket URL when available'], [<code>additionalPriceInfo</code>, 'String', 'Free-text pricing notes'], [<code>callToAction</code>, 'Object', 'Optional booking, reservation, or other CTA']);
  }
  return <table>
            <thead>
                <tr>
                    <th>Field</th>
                    <th>Type</th>
                    <th>Description</th>
                </tr>
            </thead>
            <tbody>
                {rows.map((row, index) => <tr key={index}>
                        {row.map((cell, cellIndex) => <td key={cellIndex}>{cell}</td>)}
                    </tr>)}
            </tbody>
        </table>;
};

export const ClassificationFieldsTable = ({includeWorkspaceFields = false}) => {
  const rows = [[<code>tags</code>, 'Array of strings', 'Event tags normalized for API output'], [<code>categories</code>, 'Array of strings', 'Event category list. Usually derived from the event type'], [<code>ageRestrictionText</code>, 'String', 'Age restriction label such as 18+'], [<code>isAllAges</code>, 'Boolean', 'true when the event is marked as all ages']];
  if (includeWorkspaceFields) {
    rows.push([<code>noAgeLimit</code>, 'Boolean', 'Raw workspace-facing flag for the same age concept']);
  }
  return <table>
            <thead>
                <tr>
                    <th>Field</th>
                    <th>Type</th>
                    <th>Description</th>
                </tr>
            </thead>
            <tbody>
                {rows.map((row, index) => <tr key={index}>
                        {row.map((cell, cellIndex) => <td key={cellIndex}>{cell}</td>)}
                    </tr>)}
            </tbody>
        </table>;
};

export const TimingFieldsTable = () => <table>
        <thead>
            <tr>
                <th>Field</th>
                <th>Type</th>
                <th>Description</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    <code>doors</code>
                </td>
                <td>String</td>
                <td>Main event datetime in ISO format</td>
            </tr>
            <tr>
                <td>
                    <code>close</code>
                </td>
                <td>String</td>
                <td>End time in ISO format when available</td>
            </tr>
            <tr>
                <td>
                    <code>timezone</code>
                </td>
                <td>String</td>
                <td>Time zone for the event. Currently Europe/Oslo</td>
            </tr>
            <tr>
                <td>
                    <code>startTime</code>
                </td>
                <td>String</td>
                <td>Show start time in ISO format when available</td>
            </tr>
        </tbody>
    </table>;

export const EventObjectFieldsTable = ({includeWorkspaceFields = false}) => {
  const rows = [[<code>id</code>, 'String', 'Broadcast event ID'], [<code>type</code>, 'String', 'Always event'], [<code>title</code>, 'String', 'Primary event title']];
  if (includeWorkspaceFields) {
    rows.push([<code>descriptionMD</code>, 'String', 'Long-form event description']);
  }
  rows.push([<code>subtitle</code>, 'String', 'Secondary title when available'], [<code>summary</code>, 'String', 'Short event summary or blurb'], [<code>status</code>, 'String', 'Event status such as scheduled, cancelled, or sold_out'], [<code>timing</code>, 'Object', 'Event timing details'], [<code>classification</code>, 'Object', 'Tags, categories, and age guidance'], [<code>attendance</code>, 'Object', includeWorkspaceFields ? 'Price and workspace-specific ticketing fields' : 'Free, sold out, and price information'], [<code>location</code>, 'Object', 'Venue or online location details'], [<code>media</code>, 'Object', includeWorkspaceFields ? 'Event image plus optional embed/video metadata' : 'Event media assets'], [<code>links</code>, 'Object', includeWorkspaceFields ? 'Broadcast links and optional external info links' : 'Public Broadcast links']);
  if (includeWorkspaceFields) {
    rows.push([<code>meta</code>, 'Object', 'Workspace/internal event metadata'], [<code>relatedEvents</code>, 'Array', 'Related event references when available']);
  }
  rows.push([<code>source</code>, 'Object', 'Source metadata'], [<code>createdAt</code>, 'String', 'Event created timestamp in ISO format'], [<code>updatedAt</code>, 'String', 'Event updated timestamp in ISO format']);
  if (includeWorkspaceFields) {
    rows.push([<code>structuredData</code>, 'Object', 'Structured data payloads']);
  }
  return <table>
            <thead>
                <tr>
                    <th>Field</th>
                    <th>Type</th>
                    <th>Description</th>
                </tr>
            </thead>
            <tbody>
                {rows.map((row, index) => <tr key={index}>
                        {row.map((cell, cellIndex) => <td key={cellIndex}>{cell}</td>)}
                    </tr>)}
            </tbody>
        </table>;
};

## Overview

Use this endpoint to read upcoming events across the projects in a workspace.

* Endpoint: `GET https://api.broadcast.events/workspace/events`
* Auth: `Authorization: Bearer <api-key>`

The feed returns upcoming events for the workspace behind the API key. It merges events across venue, promoter, and festival projects, dedupes them by event id, and sorts results by start time.

For a history of API and documentation changes, see the [API changelog](/api-changelog).

## Approach

This endpoint is designed for **authenticated workspace integrations** that need more context than the public feed.

The workspace route uses the API key itself as the boundary:

* The key decides which **workspace** is queried.
* The key can optionally restrict results to a subset of **allowed projects**.
* The response includes the public event fields plus workspace-specific fields such as publishing metadata, richer ticketing details, related events, and JSON-LD.

The response `meta.projects` lists the distinct workspace projects represented in the returned page of results.

**Source of truth:** Event details can change after you fetch them. We recommend linking end users to the canonical Broadcast event using `links.self`, and to venue pages or profile links when relevant.

## Caching

Responses may be cached on our side for about **15 seconds** to keep the feed fast and protect the data layer.

## Access and authentication

<Info>
  This API is currently available on request. Contact
  [support@broadcast.events](mailto:support@broadcast.events) to enable access
  for your workspace.
</Info>

Send your workspace API key as a bearer token:

```http Raw HTTP theme={null}
Authorization: Bearer YOUR_API_KEY
```

The key must include the `workspace.events.read` scope.

## Query parameters

| Name              | Type    | Required | Description                                                                  |
| ----------------- | ------- | -------- | ---------------------------------------------------------------------------- |
| `limit`           | Number  | No       | Number of events to return. Default is `50`. Maximum is `100`.               |
| `disableUtmLinks` | Boolean | No       | Set to `true` to return raw outbound links without Broadcast UTM parameters. |

Notes:

* Ticketmaster affiliate wrapping is disabled for this route.
* UTM parameters are enabled by default unless you pass `disableUtmLinks=true`.
* Invalid or non-positive `limit` values fall back to `50`.

## Example request

<CodeGroup>
  ```bash cURL theme={null}
  curl --request GET \
    --url "https://api.broadcast.events/workspace/events?limit=25&disableUtmLinks=true" \
    --header "Authorization: Bearer YOUR_API_KEY"
  ```

  ```http Raw HTTP theme={null}
  GET /workspace/events?limit=25&disableUtmLinks=true HTTP/1.1
  Host: api.broadcast.events
  Authorization: Bearer YOUR_API_KEY
  ```
</CodeGroup>

## Example response

Use the copy control on the code block to grab the full JSON.

```json title="Example response" lines wrap theme={null}
{
    "data": [
        {
            "id": "evt_123",
            "type": "event",
            "title": "Broadcast Showcase",
            "descriptionMD": "Long-form event description in markdown or HTML-friendly text.",
            "subtitle": "Live in Oslo",
            "summary": "An evening of live music and DJs.",
            "status": "scheduled",
            "timing": {
                "doors": "2026-05-10T18:00:00.000Z",
                "close": "2026-05-10T22:30:00.000Z",
                "timezone": "Europe/Oslo",
                "startTime": "2026-05-10T19:00:00.000Z"
            },
            "classification": {
                "tags": ["live", "indie"],
                "categories": ["concert"],
                "ageRestrictionText": "18+",
                "noAgeLimit": false
            },
            "attendance": {
                "isFree": false,
                "soldOut": false,
                "price": {
                    "text": "NOK 250"
                },
                "ticketing": "https://tickets.example.com/event-123",
                "commonTicketUrl": "https://tickets.example.com/common",
                "additionalPriceInfo": "Doors + service fee may apply",
                "callToAction": {
                    "label": "Book table",
                    "url": "https://tables.example.com/event-123"
                }
            },
            "location": {
                "type": "venue",
                "venue": {
                    "id": "venue_123",
                    "type": "venue",
                    "name": "John Dee",
                    "address": {
                        "city": "Oslo",
                        "country": "NO"
                    },
                    "links": {
                        "self": "https://www.broadcast.events/v/venue_123",
                        "entity": "https://www.broadcast.events/v/venue_123",
                        "profile": "https://www.broadcast.events/@john-dee"
                    },
                    "profile": {
                        "handle": "@john-dee",
                        "canonicalUrl": "https://www.broadcast.events/@john-dee"
                    }
                }
            },
            "media": {
                "image": {
                    "url": "https://img.broadcastapp.no/example/tr:w-375",
                    "variants": {
                        "micro": "https://img.broadcastapp.no/example/tr:w-100",
                        "small": "https://img.broadcastapp.no/example/tr:w-178",
                        "medium": "https://img.broadcastapp.no/example/tr:w-375",
                        "large": "https://img.broadcastapp.no/example/tr:w-750"
                    }
                },
                "youtube": "https://youtube.com/watch?v=abc123",
                "embeds": [
                    {
                        "type": "spotify",
                        "name": "Playlist",
                        "id": "playlist_1"
                    }
                ]
            },
            "links": {
                "self": "https://www.broadcast.events/events/broadcast-showcase/evt_123",
                "moreInfo": "https://venue.example.com/more-info"
            },
            "meta": {
                "publishedAt": "2026-05-01T09:00:00.000Z",
                "importId": "import-123",
                "importIntegrationId": "integration-123"
            },
            "relatedEvents": [
                {
                    "objectId": "evt_related_456"
                }
            ],
            "source": {
                "provider": "internal"
            },
            "createdAt": "2026-04-01T12:00:00.000Z",
            "updatedAt": "2026-04-05T09:30:00.000Z",
            "structuredData": {
                "jsonLd": "{\"@context\":\"https://schema.org\",\"@type\":\"MusicEvent\"}"
            }
        }
    ],
    "meta": {
        "projects": [
            {
                "id": "project_venue_123",
                "name": "John Dee"
            },
            {
                "id": "project_promoter_456",
                "name": "All Things Live"
            }
        ],
        "count": 1,
        "itemCount": 1,
        "generatedAt": "2026-05-04T10:00:00.000Z",
        "limit": 25
    }
}
```

## Response fields

Empty values are omitted from the response, so some optional fields may be missing.

### At a glance

| Field  | Type   | Description                       |
| ------ | ------ | --------------------------------- |
| `data` | Array  | List of matching workspace events |
| `meta` | Object | Metadata about the response       |

### Response `meta`

| Field         | Type             | Description                                               |
| ------------- | ---------------- | --------------------------------------------------------- |
| `projects`    | Array of objects | Workspace projects represented in the returned events     |
| `count`       | Number           | Number of events returned in this response                |
| `itemCount`   | Number           | Same as `count`. Included for consistency with other APIs |
| `generatedAt` | String           | ISO timestamp for when the response payload was generated |
| `limit`       | Number           | Effective limit used for the request                      |

#### `meta.projects[]`

| Field  | Type   | Description                                     |
| ------ | ------ | ----------------------------------------------- |
| `id`   | String | Workspace project id                            |
| `name` | String | Current project name for that workspace project |

### Event object

The workspace event object starts with the public event shape and adds a few workspace-specific fields.

<EventObjectFieldsTable includeWorkspaceFields={true} />

### `timing`

<TimingFieldsTable />

### `classification`

<ClassificationFieldsTable includeWorkspaceFields={true} />

### `attendance`

<AttendanceFieldsTable includeWorkspaceFields={true} />

#### `attendance.price`

<AttendancePriceFieldsTable />

#### `attendance.callToAction`

<AttendanceCallToActionFieldsTable />

### `location`

<LocationFieldsTable />

#### `location.venue`

<VenueFieldsTable includeProfileFields={true} />

#### `location.venue.address`

<VenueAddressFieldsTable />

#### `location.venue.geo`

<VenueGeoFieldsTable />

#### `location.venue.links`

<VenueLinksFieldsTable includeProfileFields={true} />

#### `location.venue.profile`

<VenueProfileFieldsTable />

### `media`

<MediaFieldsTable includeWorkspaceFields={true} />

#### Image asset

<ImageAssetFieldsTable />

#### `image.variants`

<ImageVariantsFieldsTable />

#### `media.embeds[]`

<MediaEmbedsFieldsTable />

### `links`

<LinksFieldsTable includeWorkspaceFields={true} />

### Event `meta`

| Field                 | Type             | Description                                    |
| --------------------- | ---------------- | ---------------------------------------------- |
| `publishedAt`         | String           | ISO timestamp for when the event was published |
| `importId`            | String or Number | Import id from an upstream integration         |
| `importIntegrationId` | String           | Integration instance id in Broadcast           |

### `source`

<SourceFieldsTable />

### `relatedEvents`

| Field           | Type  | Description                             |
| --------------- | ----- | --------------------------------------- |
| `relatedEvents` | Array | Related event references when available |

### `structuredData`

| Field    | Type   | Description                       |
| -------- | ------ | --------------------------------- |
| `jsonLd` | String | Stringified JSON-LD for the event |

## Error responses

| Status | Meaning                                     |
| ------ | ------------------------------------------- |
| `401`  | Missing, invalid, or expired API key        |
| `403`  | API key does not include the required scope |
| `429`  | Too many requests                           |
| `500`  | Internal server error                       |

## Notes

* This endpoint merges events across venue, promoter, and festival projects in the workspace.
* Events are deduped by event id and sorted by start time before the final limit is applied.
* `meta.projects` reflects the projects represented in the current returned slice, not every project in the workspace.
* The route is workspace-scoped and intended for richer internal integrations than the public feed.
