CommunityFeedItem community.feed-item@1
Generated at from
openvibe-contracts v0.419.0 and
openvibe-sdk v0.161.0.
- Version
- 1.0.0
- Owner
- community
- Visibility
- public
- Status
- active
- Compatibility
- backward
- Schema
https://openvibe.network/contracts/community/feed-item.v1.json
community.feed-item@1: one card of the menu's Feed on every OpenVibe site (GET /api/v1/feed, OpenVibe.Community server/pulse/feed.js). Each card keeps its source and public visibility. Scheduled calendar cards appear only before their start time; bursts can carry a group of links. Counts carry Community's own views, likes and comments where it knows them.
Fields
| Field | Type | Required | Description | Constraints |
|---|---|---|---|---|
id | string | yes | Stable within one response: p:<pulse item id> for a Pulse item, t:<site>:<url> for a trending card. |
|
kind | enum | yes |
| |
url | string | yes | Where the card opens; https unless the source itself answered an http URL. |
|
title | string | yes |
| |
text | string | yes | The source's first 280 characters, on one line; empty when it has none. |
|
at | string | null | yes | When it happened (Pulse provenance); null for a trending card. |
|
starts_at | string | The start time of a Coming up calendar item; absent on other kinds. |
| |
visibility | enum | Present only for an item returned to a follower or its author. |
| |
site | string | yes | The source service (live, media-hub, pics, games, blog, wiki, quest, chat, today, network, community…). |
|
site_name | string | yes |
| |
actor | object | null | yes | Who did it; null for AI, system, aggregate and trending cards. | |
media | object | null | yes | The card's first picture, as a Media thumbnail; null when it has none. | |
counts | object | yes | Community's own numbers, each present only when it knows it; {} for another service's item. |
|
counts.views | integer |
| ||
counts.likes | integer |
| ||
counts.comments | integer |
| ||
live_now | boolean | Present on live and stream cards: true only while the channel is currently on air. A past broadcast has kind stream and live_now false. | ||
group | object |
| ||
group.count | integer | yes |
| |
group.items | array of object | yes |
| |
group.items[].id | string | yes | ||
group.items[].url | string | yes |
| |
group.items[].title | string | yes | ||
group.items[].media | object | null | yes | ||
label | enum | Present only when the card needs one. |
|
Examples
From the contract's own test fixtures: valid ones validate, rejected ones must fail.
Valid: live
{
"id": "p:42",
"kind": "live",
"url": "https://openvibe.live/@alex",
"title": "Alex went live",
"text": "",
"at": "2026-11-09T10:15:00.000Z",
"site": "live",
"site_name": "Live",
"actor": {
"name": "Alex",
"avatar": "https://openvibe.network/avatar/alex?s=96"
},
"media": null,
"counts": {},
"live_now": true
}Valid: post-with-picture
{
"id": "p:9171",
"kind": "post",
"url": "https://openvibe.community/forum/status/look-at-this-cat",
"title": "Look at this cat",
"text": "Look at this cat",
"at": "2026-11-09T10:15:00.000Z",
"site": "community",
"site_name": "Community",
"actor": {
"name": "Alex",
"avatar": "https://openvibe.network/avatar/alex?s=96"
},
"media": {
"thumb": "https://openvibe.media/o/med_01JAB2C3D4E5F6G7H8J9K0MNPQ",
"ratio": 1.7777777777777777
},
"counts": {
"views": 7,
"likes": 3,
"comments": 2
}
}Valid: stream
{
"id": "p:42",
"kind": "stream",
"url": "https://openvibe.live/@alex",
"title": "Alex went live",
"text": "",
"at": "2026-11-09T10:15:00.000Z",
"site": "live",
"site_name": "Live",
"actor": {
"name": "Alex",
"avatar": "https://openvibe.network/avatar/alex?s=96"
},
"media": null,
"counts": {},
"live_now": false
}Rejected: kind-not-in-the-feed
{
"id": "p:1",
"kind": "food",
"url": "https://openvibe.community/p/one",
"title": "Not a kind the feed shows",
"text": "",
"at": null,
"site": "community",
"site_name": "Community",
"actor": null,
"media": null,
"counts": {}
}Rejected: live-now-string
{
"id": "p:9171",
"kind": "post",
"url": "https://openvibe.community/forum/status/look-at-this-cat",
"title": "Look at this cat",
"text": "Look at this cat",
"at": "2026-11-09T10:15:00.000Z",
"site": "community",
"site_name": "Community",
"actor": {
"name": "Alex",
"avatar": "https://openvibe.network/avatar/alex?s=96"
},
"media": {
"thumb": "https://openvibe.media/o/med_01JAB2C3D4E5F6G7H8J9K0MNPQ",
"ratio": 1.7777777777777777
},
"counts": {
"views": 7,
"likes": 3,
"comments": 2
},
"live_now": "false"
}Rejected: negative-count
{
"id": "p:9171",
"kind": "post",
"url": "https://openvibe.community/forum/status/look-at-this-cat",
"title": "Look at this cat",
"text": "Look at this cat",
"at": "2026-11-09T10:15:00.000Z",
"site": "community",
"site_name": "Community",
"actor": {
"name": "Alex",
"avatar": "https://openvibe.network/avatar/alex?s=96"
},
"media": {
"thumb": "https://openvibe.media/o/med_01JAB2C3D4E5F6G7H8J9K0MNPQ",
"ratio": 1.7777777777777777
},
"counts": {
"likes": -1
}
}Validate
const contracts = require('openvibe-contracts');
contracts.validate('community.feed-item@1', value); // { valid, errors: [{ path, message }] }