---
title: "today.event.cancelled@1 · OpenVibe.Services"
canonical: "https://openvibe.services/docs/contracts/today.event.cancelled"
updated: null
---

# today.event.cancelled@1 · OpenVibe.Services

HTML: [today.event.cancelled@1 · OpenVibe.Services](https://openvibe.services/docs/contracts/today.event.cancelled)

# TodayEventCancelledPayload `today.event.cancelled@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: today
- Visibility: first-party
- Status: active
- Compatibility: backward
- Schema: [`https://openvibe.network/contracts/events/payloads/today.event.cancelled.v1.json`](/docs/contracts/today.event.cancelled.json)

today.event.cancelled v1 (OpenVibe.Today server/events/store.js, written to its outbox in the same transaction as the change and published once per evt\_ id). Its owner cancelled it: calendars that subscribe drop it (STATUS:CANCELLED), and OpenVibe.Network clears the followers' notices. Envelope: source today, subject and actor { type: user, id: <owner usr\_> }, visibility internal, priority important. OpenVibe.Network tells a streamer's followers about a scheduled public or followers-only stream (STREAM\_SCHEDULED) and clears those notices on cancel (server/notifications/events-consumer.js).

## Fields

| Field | Type | Required | Description | Constraints |
| --- | --- | --- | --- | --- |
| `event_id` | string | yes | Today's id for the calendar entry (not the envelope's evt\_ id). | - `pattern ^tev_[0-9A-HJKMNP-TV-Z]{20}$` |
| `kind` | enum | yes |  | - `one of "stream", "event"` |
| `channel` | string \| null | yes | The owner's Live username for a stream; null for an event. | - `maxLength 64` |
| `title` | string | yes |  | - `minLength 1`<br>- `maxLength 120` |
| `starts_at` | string | yes |  | - `format date-time` |
| `ends_at` | string \| null | yes |  | - `format date-time` |
| `tz` | string | yes | The IANA zone it was scheduled in. | - `minLength 1`<br>- `maxLength 64` |
| `status` | enum | yes |  | - `one of "scheduled", "live", "done", "cancelled"` |
| `visibility` | enum | yes |  | - `one of "public", "followers"` |
| `url` | string \| null | yes | Where it happens (a stream: its Live channel page). | - `pattern ^https://`<br>- `format uri`<br>- `maxLength 2048` |
| `seq` | integer | yes | The calendar SEQUENCE: up by one with every change. | - `minimum 0` |

## Examples

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

 Valid: event

~~~~
{
  "event_id": "tev_01JAB2C3D4E5F6G7H8J9",
  "kind": "event",
  "channel": null,
  "title": "Robot build, part 2",
  "starts_at": "2026-10-30T03:00:00.000Z",
  "ends_at": null,
  "tz": "America/Los_Angeles",
  "status": "cancelled",
  "visibility": "public",
  "url": null,
  "seq": 1
}
~~~~

Valid: stream

~~~~
{
  "event_id": "tev_01JAB2C3D4E5F6G7H8J9",
  "kind": "stream",
  "channel": "carol",
  "title": "Robot build, part 2",
  "starts_at": "2026-10-30T03:00:00.000Z",
  "ends_at": "2026-10-30T05:00:00.000Z",
  "tz": "America/Los_Angeles",
  "status": "cancelled",
  "visibility": "public",
  "url": "https://openvibe.live/@carol",
  "seq": 1
}
~~~~

Rejected: evt-id

~~~~
{
  "event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ",
  "kind": "stream",
  "channel": "carol",
  "title": "Robot build, part 2",
  "starts_at": "2026-10-30T03:00:00.000Z",
  "ends_at": "2026-10-30T05:00:00.000Z",
  "tz": "America/Los_Angeles",
  "status": "cancelled",
  "visibility": "public",
  "url": "https://openvibe.live/@carol",
  "seq": 1
}
~~~~

Rejected: owner-in-payload

~~~~
{
  "event_id": "tev_01JAB2C3D4E5F6G7H8J9",
  "kind": "stream",
  "channel": "carol",
  "title": "Robot build, part 2",
  "starts_at": "2026-10-30T03:00:00.000Z",
  "ends_at": "2026-10-30T05:00:00.000Z",
  "tz": "America/Los_Angeles",
  "status": "cancelled",
  "visibility": "public",
  "url": "https://openvibe.live/@carol",
  "seq": 1,
  "owner_subject": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
}
~~~~

## Validate

~~~~
const contracts = require('openvibe-contracts');
contracts.validate('today.event.cancelled@1', value);   // { valid, errors: [{ path, message }] }
~~~~
