---
title: "live.agent_stream.publish · OpenVibe.Services"
canonical: "https://openvibe.services/docs/capabilities/live.agent_stream.publish"
updated: null
---

# live.agent\_stream.publish · OpenVibe.Services

HTML: [live.agent\_stream.publish · OpenVibe.Services](https://openvibe.services/docs/capabilities/live.agent_stream.publish)

# `live.agent_stream.publish`

Generated at 2026-11-13 06:25:48 UTC from [`openvibe-contracts v0.419.0`](https://github.com/OpenVibers/OpenVibe.Contracts/tree/v0.419.0) and [`openvibe-sdk v0.161.0`](https://github.com/OpenVibers/OpenVibe.SDK/tree/v0.161.0).

Grantable to apps: request it for an app on its project page. Network approves it only inside the project's allowance.

Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took ("Suggested by @mira"). The caller is the person's own session token, or a first-party service token acting for that person (a Link principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent\_stream.publish. S7 adds the owner's schedules: POST /api/streams/agent/schedules writes one, GET /api/streams/agent/schedules lists the caller's, DELETE /api/streams/agent/schedules/:id cancels one, POST /api/streams/agent/schedules/:id/remind opts the caller in to its reminder, POST /api/streams/agent/schedules/:id/go is the owner's Go for a chatplays schedule, and POST /api/streams/agent/desk/heartbeat says the owner's desk is online so a due schedule can start. A schedule that finds the desk offline is recorded as missed ('didn't start: the desk was offline') and starts nothing.

- Owner: live (token audience `openvibe.live`)
- Version: 1.0
- Status: active
- Visibility: public
- Resource constraints: owner
- Quota class: standard
- Permissions: live:write
- Input: [live.agent-stream-create-request@1](/docs/contracts/live.agent-stream-create-request)
- Output: live.agent-stream-publish@1
- Events: live.agent\_stream.changed
- Implemented by: - `POST /api/streams/agent`
- `POST /api/streams/agent/:id/ticket`
- `DELETE /api/streams/agent/:id/ticket`
- `POST /api/streams/agent/:id/curtain`
- `PUT /api/streams/agent/:id/frame`
- `POST /api/streams/agent/:id/end`
- `GET /api/streams/agent/:id/state`
- `POST /api/streams/agent/:id/control`
- `GET /api/streams/agent/:id/controls`
- `POST /api/streams/agent/schedules`
- `GET /api/streams/agent/schedules`
- `DELETE /api/streams/agent/schedules/:id`
- `POST /api/streams/agent/schedules/:id/remind`
- `POST /api/streams/agent/schedules/:id/go`
- `POST /api/streams/agent/desk/heartbeat`

[These routes in the API explorer](/docs/api/live#cap-live.agent_stream.publish)
