# Connect to the anonymous listening room

Requires a same-origin Origin header and WebSocket upgrade. Text frames follow RadioPresenceReportV1; server messages follow RadioPresenceSnapshotV1. Counts are self-reported sessions, expire after 75 seconds, and do not establish unique listeners. Optional normalized cursors are confined to the room. See the radio specification for frame limits and heartbeat requirements.

Operation: joinRadioPresence
GET /api/radio/presence

Access: anonymous. Automatic retries: none. Redirects: manual. Request body limit: 0 bytes.
Default timeout: 30 seconds. Response limit: 16 MiB. Pagination is opt-in and bounded; an exhausted bound reports incomplete execution.

[HTML reference](/developers/api/joinRadioPresence) · [Authoritative schemas](/api/openapi.json)

## Wire contract

```json
{
  "operationId": "joinRadioPresence",
  "summary": "Connect to the anonymous listening room",
  "tags": [
    "Music"
  ],
  "description": "Requires a same-origin Origin header and WebSocket upgrade. Text frames follow RadioPresenceReportV1; server messages follow RadioPresenceSnapshotV1. Counts are self-reported sessions, expire after 75 seconds, and do not establish unique listeners. Optional normalized cursors are confined to the room. See the radio specification for frame limits and heartbeat requirements.",
  "responses": {
    "101": {
      "description": "WebSocket connected"
    },
    "403": {
      "description": "Origin rejected"
    },
    "426": {
      "description": "WebSocket upgrade required"
    },
    "429": {
      "description": "Admission limited; Retry-After: 60"
    },
    "503": {
      "description": "Room unavailable or full"
    }
  }
}
```

## Synthetic examples

### curl

```bash
curl --fail-with-body --max-time 30 --max-filesize 16777216 --request GET 'https://irvinebroque.com/api/radio/presence'
```

### TypeScript

```typescript
import { PublicApi } from '@irvinebroque/public-api';
const api = new PublicApi();
const result = await api.radio.presenceProbe({});
console.log(result.status, result.headers.get('content-type')); // Keep transient capabilities in memory.
```

### CLI

```bash
irvinebroque radio presence-probe
```
