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

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

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

# LiveAgentStreamStepRequest `live.agent-stream-step-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-step-request.v1.json`](/docs/contracts/live.agent-stream-step-request.json)

live.agent-stream-step-request@1 (the Agent Streams plan, S2): the body of POST /api/streams/agent/:id/steps on OpenVibe.Live, which answers 201 with the step it stored (live.agent-stream-step@1). The publisher posts with its publish ticket (Authorization: Bearer wpt\_…), and Codes and Actor post through their service tokens with live.agent\_stream.publish for the person. AT is when the step began (the agent may say so; Live takes its own clock when it is absent), TITLE says what the step is (at most 120 characters), STATUS says how it stands, DETAIL is the optional longer line (at most 500 characters), TESTS and COST\_USD are the optional reports. Live refuses more than one step a second, more than two thousand steps per stream, a title over 120 characters or a detail over 500, and text the house filters refuse.

## Fields

| Field | Type | Required | Description | Constraints |
| --- | --- | --- | --- | --- |
| `at` | string |  |  | - `format date-time` |
| `title` | string | yes |  | - `minLength 1`<br>- `maxLength 120` |
| `status` | enum | yes |  | - `one of "started", "passed", "failed", "skipped"` |
| `detail` | string |  |  | - `maxLength 500` |
| `tests` | object |  |  | - `no other fields` |
| `tests.passed` | integer | yes |  | - `minimum 0` |
| `tests.failed` | integer | yes |  | - `minimum 0` |
| `cost_usd` | number |  |  | - `minimum 0` |

## Examples

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

 Valid: one

~~~~
{
  "title": "Run the checkout tests",
  "status": "started"
}
~~~~

Valid: with-reports

~~~~
{
  "at": "2026-11-06T10:00:00.000Z",
  "title": "Run the checkout tests",
  "status": "failed",
  "detail": "expected 1 charge, received 2",
  "tests": {
    "passed": 1,
    "failed": 1
  },
  "cost_usd": 0.42
}
~~~~

Rejected: no-status

~~~~
{
  "title": "Run the checkout tests"
}
~~~~

Rejected: title-too-long

~~~~
{
  "title": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "status": "started"
}
~~~~

## Validate

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