---
title: "live.agent-stream-curtain-request@1 · OpenVibe.Services"
canonical: "https://openvibe.services/docs/contracts/live.agent-stream-curtain-request"
updated: null
---

# live.agent-stream-curtain-request@1 · OpenVibe.Services

HTML: [live.agent-stream-curtain-request@1 · OpenVibe.Services](https://openvibe.services/docs/contracts/live.agent-stream-curtain-request)

# LiveAgentStreamCurtainRequest `live.agent-stream-curtain-request@1`

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).

- Version: 1.0.0
- Owner: live
- Visibility: first-party
- Status: active
- Compatibility: backward
- Schema: [`https://openvibe.network/contracts/live/agent-stream-curtain-request.v1.json`](/docs/contracts/live.agent-stream-curtain-request.json)

live.agent-stream-curtain-request@1 (the Agent Streams plan, S1): the body of POST /api/streams/agent/:id/curtain on OpenVibe.Live (capability live.agent\_stream.publish): the desk reports that its privacy screen went up or came down. While the curtain is up Live pauses every viewer's consumer (mediasoup consumer.pause()), so a desk that failed to blank still shows nothing. Viewers see 'Private screen' and never why. The curtain comes down only from the desk, after its detectors report clear for two seconds, or from the owner's own button; a detector that fails or is unsure puts it up and never down.

## Fields

| Field | Type | Required | Description | Constraints |
| --- | --- | --- | --- | --- |
| `up` | boolean | yes |  |  |
| `reason` | enum | yes | Why the curtain is up (the last reason when it comes down). | - `one of "password_field", "secret_file", "env_print", "manual", "site", "detector"` |

## Examples

From the contract's own test fixtures: valid ones validate, rejected ones must fail.

 Valid: down

~~~~
{
  "up": false,
  "reason": "manual"
}
~~~~

Valid: up

~~~~
{
  "up": true,
  "reason": "password_field"
}
~~~~

Rejected: unknown-reason

~~~~
{
  "up": true,
  "reason": "gossip"
}
~~~~

## Validate

~~~~
const contracts = require('openvibe-contracts');
contracts.validate('live.agent-stream-curtain-request@1', value);   // { valid, errors: [{ path, message }] }
~~~~
