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

FieldTypeRequiredDescriptionConstraints
idstringyes
  • pattern ^tint_[0-9A-HJKMNP-TV-Z]{26}$
creatoridentity.subject-refyes
supporterone ofyesnull for an anonymous supporter (to anyone but them), an erased one, a simulation or an external tip without one.
supporter_namestring | nullyes
kindenumyes
  • one of "tip", "paid_message", "tts", "media_request"
amountintegeryes
  • minimum 1
currencystringyesvibes-bits.
messagestring | nullyes
ttsone ofyes
mediaone ofyes
goal_idstring | nullyesThe goal the supporter picked.
fundingenumyes
  • one of "credit", "checkout", "provider", "external", "none"
settlementenumyes
  • one of "billing", "external", "simulated", "imported"
originenumyes
  • one of "tips", "billing", "billing-external", "external", "import"
testbooleanyesA simulation or Billing test money: never counted.
privacyobjectyes
privacy.anonymousbooleanyes
privacy.hide_amountbooleanyes
privacy.private_messagebooleanyes
publictips.public-interactionyes
erased_atstring | nullyesWhen the supporter erased their data from it.
moderationobjectyes
moderation.stateenumyes
  • one of "visible", "held", "hidden"
moderation.filteredbooleanyes
moderation.atstring | nullyes
paymentobjectyes
payment.stateenumyes
  • one of "pending", "settled", "reversed", "failed"
payment.billing_txn_idstring | nullyes
payment.reversal_txn_idsarray of stringyes
payment.reversed_amountintegeryes
  • minimum 0
payment.failurestring | nullyes
payment.settled_atstring | nullyes
payment.reversed_atstring | nullyes
deliveryobjectyes
delivery.stateenumyes
  • one of "awaiting_payment", "queued", "delivered", "failed", "cancelled"
delivery.delivered_atstring | nullyes
created_atstringyes
updated_atstringyes
checkoutobjectCheckout-funded interactions only.
checkout.urlstring | nullyes
checkout.refstring | nullyes
checkout.providerstring | nullyes
checkout.intent_idstring | nullyes
effectsarray of objectThe creator and services only: the delivery effects.
effects[].effectenumyes
  • one of "chat_line", "paid_message", "tts", "media_request", "overlay_alert"
effects[].adapterstringyes
effects[].stateenumyes
  • one of "queued", "delivered", "failed", "cancelled"
effects[].attemptsintegeryes
  • minimum 0
effects[].last_errorstring | nullyes
effects[].updated_atstringyes
providerstring | null
provider_refstring | null
legacy_sourcestring | 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 }] }