---
title: "Confirm Call Publisher"
method: POST
path: "/api/voice/calls/{call_id}/publisher-check"
tags: ["voice-control", "voice-control"]
---

# Confirm Call Publisher

`POST /api/voice/calls/{call_id}/publisher-check`

## Request

- Base URL: `https://api.dialogbrain.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.dialogbrain.com/api/voice/calls/{call_id}/publisher-check`
- Auth: none declared

Re-check ownership AFTER the asking tab has joined the room.

Publish permission is baked into a token when it is minted, and revoking it
is a one-shot action against a participant who has to already be in the
room — UpdateParticipant on someone absent is a 404, which we deliberately
read as "not publishing, nothing to do".

Those two facts leave a window. A tab mints a publish-capable token, and
before it finishes connecting the operator answers in another tab: the claim
displaces it in the registry and revokes a participant who does not exist
yet. A moment later it joins with the token it already holds, publishes, and
nothing ever contradicts it — LiveKit fires no permission change because
nothing changed after it joined. The registry says one owner and the room
has two: the operator hears themselves, and the tab that lost draws full
call chrome for a call it does not own (reported repeatedly 2026-08-03; the
bridge logged both browser identities subscribing to one call).

So the joined tab asks once, at the only moment its presence is certain, and
a tab that is not the holder is revoked here — which is what the overlays'
`participantPermissionsChanged` handler already reacts to. The answer is the
registry's, so it holds across browser profiles and devices, unlike the
BroadcastChannel election.

## Path parameters

- `call_id` string, required

## Request body

- RejoinRequest: Optional body for /rejoin and /coexist. `tab_id` is a per-tab UUID generated client-side (sessionStorage) and appended to the LK browser identity so multiple tabs/browsers logged in as the same user don't DUPLICATE_IDENTITY-kick each other in the LK room. Omit to fall back to the legacy `browser:{user}:{call}` shape (single-tab semantics — second tab WILL kick the first).
  - `tab_id` string, nullable

## Response `200`

Successful Response

- PublisherCheckResponse: Whether the asking tab still owns the microphone, checked after it joined.
  - `owns` boolean, required
  - `holder_tab_id` string, nullable

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/dialogbrain/apis/dialogbrain-v2-api-gateway.md) · [All operations](https://skmtc.dev/dialogbrain/apis/dialogbrain-v2-api-gateway/llms.txt) · [OpenAPI document](https://skmtc.dev/dialogbrain/apis/dialogbrain-v2-api-gateway/revisions/d84e7dc9977d?raw)
