TipsInteraction tips.interaction@1
Generated at from
openvibe-contracts v0.53.0 and
openvibe-sdk v0.11.0.
- Version
- 1.0.0
- Owner
- tips
- Visibility
- first-party
- Status
- active
- Compatibility
- backward
- Schema
https://openvibe.network/contracts/tips/interaction.v1.json
tips.interaction@1: a tip interaction on OpenVibe.Tips (server/domain/interactions.js present): one act of support (a tip, a paid chat message, text-to-speech or a media request) with two separate states: payment (mirrored from OpenVibe.Billing: pending, settled, reversed or failed) and delivery (awaiting_payment, queued, delivered, failed or cancelled). Only the supporter sees who an anonymous supporter is; public is what may be shown to the public and privacy the supporter's choices. A checkout-funded interaction adds checkout; the creator and services also get effects, provider, provider_ref and legacy_source. Amounts are Vibes bits.
Fields
| Field | Type | Required | Description | Constraints |
|---|---|---|---|---|
id | string | yes |
| |
creator | identity.subject-ref | yes | ||
supporter | one of | yes | null for an anonymous supporter (to anyone but them), an erased one, a simulation or an external tip without one. | |
supporter_name | string | null | yes | ||
kind | enum | yes |
| |
amount | integer | yes |
| |
currency | string | yes | vibes-bits. | |
message | string | null | yes | ||
tts | one of | yes | ||
media | one of | yes | ||
goal_id | string | null | yes | The goal the supporter picked. | |
funding | enum | yes |
| |
settlement | enum | yes |
| |
origin | enum | yes |
| |
test | boolean | yes | A simulation or Billing test money: never counted. | |
privacy | object | yes | ||
privacy.anonymous | boolean | yes | ||
privacy.hide_amount | boolean | yes | ||
privacy.private_message | boolean | yes | ||
public | tips.public-interaction | yes | ||
erased_at | string | null | yes | When the supporter erased their data from it. | |
moderation | object | yes | ||
moderation.state | enum | yes |
| |
moderation.filtered | boolean | yes | ||
moderation.at | string | null | yes | ||
payment | object | yes | ||
payment.state | enum | yes |
| |
payment.billing_txn_id | string | null | yes | ||
payment.reversal_txn_ids | array of string | yes | ||
payment.reversed_amount | integer | yes |
| |
payment.failure | string | null | yes | ||
payment.settled_at | string | null | yes | ||
payment.reversed_at | string | null | yes | ||
delivery | object | yes | ||
delivery.state | enum | yes |
| |
delivery.delivered_at | string | null | yes | ||
created_at | string | yes | ||
updated_at | string | yes | ||
checkout | object | Checkout-funded interactions only. | ||
checkout.url | string | null | yes | ||
checkout.ref | string | null | yes | ||
checkout.provider | string | null | yes | ||
checkout.intent_id | string | null | yes | ||
effects | array of object | The creator and services only: the delivery effects. | ||
effects[].effect | enum | yes |
| |
effects[].adapter | string | yes | ||
effects[].state | enum | yes |
| |
effects[].attempts | integer | yes |
| |
effects[].last_error | string | null | yes | ||
effects[].updated_at | string | yes | ||
provider | string | null | |||
provider_ref | string | null | |||
legacy_source | string | null |
Examples
From the contract's own test fixtures: valid ones validate, rejected ones must fail.
Valid: pending-checkout
{
"id": "tint_01JAB2C3D4E5F6G7H8J9K0MNQ7",
"creator": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"supporter": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPR"
},
"supporter_name": "moosefan",
"kind": "tip",
"amount": 1000,
"currency": "vibes-bits",
"message": null,
"tts": null,
"media": null,
"goal_id": null,
"funding": "checkout",
"settlement": "billing",
"origin": "tips",
"test": false,
"privacy": {
"anonymous": false,
"hide_amount": false,
"private_message": false
},
"public": {
"interaction_id": "tint_01JAB2C3D4E5F6G7H8J9K0MNQ7",
"kind": "tip",
"amount": 1000,
"amount_hidden": false,
"currency": "vibes-bits",
"settlement": "billing",
"test": false,
"at": "2026-09-25T09:12:40.118Z",
"supporter_name": "moosefan",
"message": null,
"tts": null,
"media": null,
"hidden": false
},
"erased_at": null,
"moderation": {
"state": "visible",
"filtered": false,
"at": null
},
"payment": {
"state": "pending",
"billing_txn_id": null,
"reversal_txn_ids": [],
"reversed_amount": 0,
"failure": null,
"settled_at": null,
"reversed_at": null
},
"delivery": {
"state": "awaiting_payment",
"delivered_at": null
},
"created_at": "2026-09-25T09:12:40.118Z",
"updated_at": "2026-09-25T09:12:40.118Z",
"checkout": {
"url": "https://powerchat.live/checkout/pc_91c2e7",
"ref": "pc_91c2e7",
"provider": "powerchat",
"intent_id": "int_01JAB2C3D4E5F6G7H8J9K0MNQ8"
}
}Valid: service-view
{
"id": "tint_01JAB2C3D4E5F6G7H8J9K0MNQ5",
"creator": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"supporter": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPR"
},
"supporter_name": "moosefan",
"kind": "paid_message",
"amount": 500,
"currency": "vibes-bits",
"message": "Great stream tonight!",
"tts": null,
"media": null,
"goal_id": null,
"funding": "credit",
"settlement": "billing",
"origin": "tips",
"test": false,
"privacy": {
"anonymous": false,
"hide_amount": false,
"private_message": false
},
"public": {
"interaction_id": "tint_01JAB2C3D4E5F6G7H8J9K0MNQ5",
"kind": "paid_message",
"amount": 500,
"amount_hidden": false,
"currency": "vibes-bits",
"settlement": "billing",
"test": false,
"at": "2026-09-25T09:12:41.530Z",
"supporter_name": "moosefan",
"message": "Great stream tonight!",
"tts": null,
"media": null,
"hidden": false
},
"erased_at": null,
"moderation": {
"state": "visible",
"filtered": false,
"at": null
},
"payment": {
"state": "settled",
"billing_txn_id": "txn_01JAB2C3D4E5F6G7H8J9K0MNQ6",
"reversal_txn_ids": [],
"reversed_amount": 0,
"failure": null,
"settled_at": "2026-09-25T09:12:41.530Z",
"reversed_at": null
},
"delivery": {
"state": "delivered",
"delivered_at": "2026-09-25T09:12:43.004Z"
},
"created_at": "2026-09-25T09:12:40.118Z",
"updated_at": "2026-09-25T09:12:43.004Z",
"effects": [
{
"effect": "overlay_alert",
"adapter": "overlay",
"state": "delivered",
"attempts": 1,
"last_error": null,
"updated_at": "2026-09-25T09:12:41.530Z"
},
{
"effect": "paid_message",
"adapter": "live-chat",
"state": "delivered",
"attempts": 1,
"last_error": null,
"updated_at": "2026-09-25T09:12:43.004Z"
}
],
"provider": null,
"provider_ref": null,
"legacy_source": null
}Valid: supporter-receipt
{
"id": "tint_01JAB2C3D4E5F6G7H8J9K0MNQ5",
"creator": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"supporter": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPR"
},
"supporter_name": "moosefan",
"kind": "paid_message",
"amount": 500,
"currency": "vibes-bits",
"message": "Great stream tonight!",
"tts": null,
"media": null,
"goal_id": null,
"funding": "credit",
"settlement": "billing",
"origin": "tips",
"test": false,
"privacy": {
"anonymous": false,
"hide_amount": false,
"private_message": false
},
"public": {
"interaction_id": "tint_01JAB2C3D4E5F6G7H8J9K0MNQ5",
"kind": "paid_message",
"amount": 500,
"amount_hidden": false,
"currency": "vibes-bits",
"settlement": "billing",
"test": false,
"at": "2026-09-25T09:12:41.530Z",
"supporter_name": "moosefan",
"message": "Great stream tonight!",
"tts": null,
"media": null,
"hidden": false
},
"erased_at": null,
"moderation": {
"state": "visible",
"filtered": false,
"at": null
},
"payment": {
"state": "settled",
"billing_txn_id": "txn_01JAB2C3D4E5F6G7H8J9K0MNQ6",
"reversal_txn_ids": [],
"reversed_amount": 0,
"failure": null,
"settled_at": "2026-09-25T09:12:41.530Z",
"reversed_at": null
},
"delivery": {
"state": "delivered",
"delivered_at": "2026-09-25T09:12:43.004Z"
},
"created_at": "2026-09-25T09:12:40.118Z",
"updated_at": "2026-09-25T09:12:43.004Z"
}Rejected: bad-payment-state
{
"id": "tint_01JAB2C3D4E5F6G7H8J9K0MNQ5",
"creator": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"supporter": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPR"
},
"supporter_name": "moosefan",
"kind": "paid_message",
"amount": 500,
"currency": "vibes-bits",
"message": "Great stream tonight!",
"tts": null,
"media": null,
"goal_id": null,
"funding": "credit",
"settlement": "billing",
"origin": "tips",
"test": false,
"privacy": {
"anonymous": false,
"hide_amount": false,
"private_message": false
},
"public": {
"interaction_id": "tint_01JAB2C3D4E5F6G7H8J9K0MNQ5",
"kind": "paid_message",
"amount": 500,
"amount_hidden": false,
"currency": "vibes-bits",
"settlement": "billing",
"test": false,
"at": "2026-09-25T09:12:41.530Z",
"supporter_name": "moosefan",
"message": "Great stream tonight!",
"tts": null,
"media": null,
"hidden": false
},
"erased_at": null,
"moderation": {
"state": "visible",
"filtered": false,
"at": null
},
"payment": {
"state": "paid",
"billing_txn_id": "txn_01JAB2C3D4E5F6G7H8J9K0MNQ6",
"reversal_txn_ids": [],
"reversed_amount": 0,
"failure": null,
"settled_at": "2026-09-25T09:12:41.530Z",
"reversed_at": null
},
"delivery": {
"state": "delivered",
"delivered_at": "2026-09-25T09:12:43.004Z"
},
"created_at": "2026-09-25T09:12:40.118Z",
"updated_at": "2026-09-25T09:12:43.004Z"
}Validate
const contracts = require('openvibe-contracts');
contracts.validate('tips.interaction@1', value); // { valid, errors: [{ path, message }] }