---
title: "billing.vibes-wallet@1 · OpenVibe.Services"
canonical: "https://openvibe.services/docs/contracts/billing.vibes-wallet"
updated: null
---

# billing.vibes-wallet@1 · OpenVibe.Services

HTML: [billing.vibes-wallet@1 · OpenVibe.Services](https://openvibe.services/docs/contracts/billing.vibes-wallet)

# BillingVibesWallet `billing.vibes-wallet@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: billing
- Visibility: public
- Status: active
- Compatibility: backward
- Schema: [`https://openvibe.network/contracts/billing/vibes-wallet.v1.json`](/docs/contracts/billing.vibes-wallet.json)

billing.vibes-wallet@1: a person's own Vibes, answered by GET /api/v1/vibes/me (capability billing.vibes.read) to an app the person approved. credit is Vibes to spend; payable is Vibes the person received as a creator and may cash out under the payout rules (never into Balance); bits\_per\_usd is today's rate. Vibes are whole integers; this is not a Balance and carries no nano-USD.

## Fields

| Field | Type | Required | Description | Constraints |
| --- | --- | --- | --- | --- |
| `subject` | object | yes | The person the app reads for (the approved delegation). Only a user, never an app or a service. | - `no other fields` |
| `subject.type` | const | yes |  | - `= "user"` |
| `subject.id` | string | yes |  | - `pattern ^usr_[0-9A-HJKMNP-TV-Z]{26}$` |
| `currency` | const | yes |  | - `= "vibes-bits"` |
| `credit` | integer | yes | Vibes to spend. | - `minimum 0` |
| `payable` | integer | yes | Vibes received as a creator, to cash out; never Balance. | - `minimum 0` |
| `bits_per_usd` | number | yes | Today's Vibes per USD rate, the same one a pack is priced with. |  |

## Examples

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

 Valid: person

~~~~
{
  "subject": {
    "type": "user",
    "id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
  },
  "currency": "vibes-bits",
  "credit": 1250,
  "payable": 340,
  "bits_per_usd": 100
}
~~~~

Rejected: app-subject

~~~~
{
  "subject": {
    "type": "app",
    "id": "app_01JAB2C3D4E5F6G7H8J9K0MNPQ"
  },
  "currency": "vibes-bits",
  "credit": 0,
  "payable": 0,
  "bits_per_usd": 100
}
~~~~

Rejected: hidden-balance

~~~~
{
  "subject": {
    "type": "user",
    "id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
  },
  "currency": "vibes-bits",
  "credit": 1250,
  "payable": 0,
  "bits_per_usd": 100,
  "balance_nano_usd": "1"
}
~~~~

Rejected: negative-credit

~~~~
{
  "subject": {
    "type": "user",
    "id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
  },
  "currency": "vibes-bits",
  "credit": -1,
  "payable": 0,
  "bits_per_usd": 100
}
~~~~

Rejected: usd

~~~~
{
  "subject": {
    "type": "user",
    "id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
  },
  "currency": "usd-cents",
  "credit": 1250,
  "payable": 0,
  "bits_per_usd": 100
}
~~~~

## Validate

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