ReviewsSignalRemovedPayload reviews.signal.removed@1
Generated at from
openvibe-contracts v0.34.2 and
openvibe-sdk v0.5.0.
- Version
- 1.0.0
- Owner
- reviews
- Visibility
- first-party
- Status
- active
- Compatibility
- backward
- Schema
https://openvibe.network/contracts/events/payloads/reviews.signal.removed.v1.json
reviews.signal.removed v1 (OpenVibe.Reviews server/reviews/service.js withdrawSignal → signalEvent). A signal stopped being active, in the transaction of the change. status superseded: a newer revision of the same item replaced it for the same entity (replaced_by names the new signal, whose reviews.signal.added follows). status withdrawn: its source removed the item (sources.item.removed or a removed item on import), the item no longer states a signal, or an editor reattributed or unresolved the item. The payload repeats the signal as recorded (values and provenance never change) plus status and reason; summaries citing it are flagged and get a pending revision, and the entity's aggregate and Search document are refreshed, in the same transaction. Envelope: subject { type: signal, id: <signal_id> }, visibility public, priority important, actor the caller (the importing service, e.g. service:sources-sync, or the editor, user usr_…) or service:reviews for the Sources event consumer and sync worker.
Fields
| Field | Type | Required | Description | Constraints |
|---|---|---|---|---|
signal_id | string | yes |
| |
entity_id | string | yes | The entity the signal is attributed to (never rewritten by a merge). |
|
canonical_entity_id | string | yes | The entity it counted under: entity_id, or the entity it is merged into. |
|
type | enum | yes |
| |
source_key | string | yes | OpenVibe.Sources source key. |
|
source_item_id | string | yes |
| |
item_revision | integer | yes | The Sources item revision the signal was read from. |
|
observed_at | string | yes | When Sources retrieved that item revision (provenance.retrieved_at). |
|
source_published_at | string | null | yes | The item's published_at as Sources gave it; null when it gave none. | |
canonical_url | string | null | yes | The item's canonical URL as Sources gave it; null when it has none. | |
license_note | string | null | yes | Licence note recorded for the item in Sources; null when none. | |
recommended | boolean | recommendation only: whether the reviewer recommends it. | ||
positive_count | integer | recommendation_tally only: positive reviews the source counts. |
| |
total_count | integer | recommendation_tally only: all reviews the source counts (≥ positive_count). |
| |
rating_value | number | rating and rating_aggregate only: the value as stated. | ||
rating_best | number | null | rating and rating_aggregate only: top of the stated scale; null when the source states none. | ||
rating_worst | number | null | rating and rating_aggregate only: bottom of the stated scale; null when the source states none. | ||
rating_count | integer | rating and rating_aggregate only: ratings behind the value (1 for a single review). |
| |
status | enum | yes | superseded: replaced by a newer revision of the same item; withdrawn: every other removal. |
|
reason | string | yes | Why, in plain words (e.g. "removed by its source: <reason>", "source item revised (r1 → r2)"). |
|
replaced_by | string | status superseded only: the signal that replaced it. |
|
Examples
From the contract's own test fixtures: valid ones validate, rejected ones must fail.
Valid: superseded
{
"signal_id": "sig_01M38GW2W9GCC5P6WKXXFVXBQY",
"entity_id": "ent_01M38GW2QD088TQ08VN985JTXT",
"canonical_entity_id": "ent_01M38GW2QD088TQ08VN985JTXT",
"type": "recommendation",
"source_key": "steam-reviews-portal-2",
"source_item_id": "itm_01M2ZB00F8E73MN708E0S8WFM0",
"item_revision": 1,
"observed_at": "2026-09-20T12:00:01.000Z",
"source_published_at": "2026-09-01T00:00:00.000Z",
"canonical_url": null,
"license_note": null,
"recommended": true,
"status": "superseded",
"reason": "source item revised (r1 → r2)",
"replaced_by": "sig_01M38GW33Q3WGNNV0RVRERXSA3"
}Valid: withdrawn-by-source
{
"signal_id": "sig_01M38GW33AG2JGY97E8YACRG2G",
"entity_id": "ent_01M38GW32MMJWAVC9KPYXC759Y",
"canonical_entity_id": "ent_01M38GW32MMJWAVC9KPYXC759Y",
"type": "rating_aggregate",
"source_key": "shop-example",
"source_item_id": "itm_01M2ZB05BG9JCWV5MRXRD4ZTBG",
"item_revision": 1,
"observed_at": "2026-09-20T12:00:06.000Z",
"source_published_at": null,
"canonical_url": "https://shop.example/p/widget",
"license_note": "Product data as published by shop.example",
"rating_value": 4.2,
"rating_best": 5,
"rating_worst": null,
"rating_count": 120,
"status": "withdrawn",
"reason": "removed by its source: takedown"
}Rejected: deleted-status
{
"signal_id": "sig_01M38GW30H8EXZTMFC3DWMR8RR",
"entity_id": "ent_01M38GW2QD088TQ08VN985JTXT",
"canonical_entity_id": "ent_01M38GW2QD088TQ08VN985JTXT",
"type": "recommendation",
"source_key": "steam-reviews-portal-2",
"source_item_id": "itm_01M2ZB03D0JFTD8H9CZE26KNHR",
"item_revision": 1,
"observed_at": "2026-09-20T12:00:04.000Z",
"source_published_at": null,
"canonical_url": null,
"license_note": null,
"recommended": false,
"status": "deleted",
"reason": "removed by its source: author deleted the review"
}Rejected: missing-status
{
"signal_id": "sig_01M38GW30H8EXZTMFC3DWMR8RR",
"entity_id": "ent_01M38GW2QD088TQ08VN985JTXT",
"canonical_entity_id": "ent_01M38GW2QD088TQ08VN985JTXT",
"type": "recommendation",
"source_key": "steam-reviews-portal-2",
"source_item_id": "itm_01M2ZB03D0JFTD8H9CZE26KNHR",
"item_revision": 1,
"observed_at": "2026-09-20T12:00:04.000Z",
"source_published_at": null,
"canonical_url": null,
"license_note": null,
"recommended": false,
"reason": "removed by its source: author deleted the review"
}Rejected: superseded-without-replacement
{
"signal_id": "sig_01M38GW2W9GCC5P6WKXXFVXBQY",
"entity_id": "ent_01M38GW2QD088TQ08VN985JTXT",
"canonical_entity_id": "ent_01M38GW2QD088TQ08VN985JTXT",
"type": "recommendation",
"source_key": "steam-reviews-portal-2",
"source_item_id": "itm_01M2ZB00F8E73MN708E0S8WFM0",
"item_revision": 1,
"observed_at": "2026-09-20T12:00:01.000Z",
"source_published_at": null,
"canonical_url": null,
"license_note": null,
"recommended": true,
"status": "superseded",
"reason": "source item revised (r1 → r2)"
}Rejected: tally-without-counts
{
"signal_id": "sig_01M38GW31D8P3PQ89VKPPRBT9T",
"entity_id": "ent_01M38GW2QD088TQ08VN985JTXT",
"canonical_entity_id": "ent_01M38GW2QD088TQ08VN985JTXT",
"type": "recommendation_tally",
"source_key": "steam-reviews-portal-2",
"source_item_id": "itm_01M2ZB04C8N9TB7GZ9266TR9EY",
"item_revision": 1,
"observed_at": "2026-09-20T12:00:05.000Z",
"source_published_at": null,
"canonical_url": null,
"license_note": null,
"status": "withdrawn",
"reason": "the source no longer states a signal (no value)"
}Validate
const contracts = require('openvibe-contracts');
contracts.validate('reviews.signal.removed@1', value); // { valid, errors: [{ path, message }] }