---
title: "openvibe-sdk/vibes · OpenVibe.Services"
canonical: "https://openvibe.services/docs/sdk/vibes"
updated: null
---

# openvibe-sdk/vibes · OpenVibe.Services

HTML: [openvibe-sdk/vibes · OpenVibe.Services](https://openvibe.services/docs/sdk/vibes)

# `openvibe-sdk/vibes`

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).

From `types/vibes.d.ts` (server only). Declarations are shown verbatim.

## class VibesError

Vibes Pay for developer apps (server only). Money is whole Vibes; a float is refused.

~~~~
export declare class VibesError extends Error {
    constructor(message: string, init?: { status?: number | null; code?: string | null; body?: unknown });
    status: number | null;
    code: string | null;
    body: unknown;
    /** No status, 5xx, 429 or 401. */
    readonly retryable: boolean;
}
~~~~

## type VibesTokenContext

~~~~
export type VibesTokenContext = { service: 'billing'; audience: 'openvibe.billing' };
~~~~

## type VibesToken

~~~~
export type VibesToken = string | Record<string, string>;
~~~~

## type VibesTokenProvider

~~~~
export type VibesTokenProvider =
    | ((ctx: VibesTokenContext) => VibesToken | Promise<VibesToken>)
    | {
        getToken?(ctx: VibesTokenContext): VibesToken | Promise<VibesToken>;
        authHeaders?(ctx: VibesTokenContext): VibesToken | Promise<VibesToken>;
        invalidate?(ctx?: VibesTokenContext): void | Promise<void>;
    };
~~~~

## type VibesOptions

~~~~
export type VibesOptions = {
    /** The app's token (capability billing.vibes.charge). One of appToken or tokenProvider. */
    appToken?: string;
    /** A function, or an SDK token client (getToken / invalidate), for a token that expires. */
    tokenProvider?: VibesTokenProvider;
    /** Billing's origin, e.g. https://billing.openvibe.network. */
    billingUrl: string;
    fetchImpl?: typeof fetch;
    /** Per request, default 10000. */
    timeoutMs?: number;
};
~~~~

## type VibesChargeCreate

~~~~
export type VibesChargeCreate = {
    /** A positive whole number of Vibes. */
    amount: number;
    description: string;
    /** The app's order id; also the idempotency key, so a retry never charges twice. */
    reference: string;
    /** Where the pay sheet sends the person afterwards (http or https). */
    return_url?: string;
};
~~~~

## type VibesCharge

~~~~
export type VibesCharge = {
    id: string;
    pay_url: string;
    status: 'pending' | 'paid' | 'refunded' | 'cancelled' | 'expired' | string;
    expires_at?: string;
    amount?: number;
    description?: string;
    reference?: string;
    [field: string]: unknown;
};
~~~~

## type VibesClient

~~~~
export type VibesClient = {
    charges: {
        create(input: VibesChargeCreate): Promise<VibesCharge>;
        get(chargeId: string): Promise<VibesCharge>;
        refund(chargeId: string, opts?: { reason?: string }): Promise<VibesCharge>;
    };
    webhooks: {
        /** Constant-time check of the RAW body against X-OpenVibe-Signature-V2 (or a legacy sha256= header). */
        verify(rawBody: string | Uint8Array | ArrayBufferView, signatureHeader: string, secret: string, opts?: { toleranceSec?: number; now?: number }): boolean;
    };
    baseUrl(): string;
};
~~~~

## function createVibesClient

~~~~
export declare function createVibesClient(options: VibesOptions): VibesClient;
~~~~

## function verifyWebhook

The same check as vibes.webhooks.verify, for a receiver that only verifies webhooks.

~~~~
export declare function verifyWebhook(rawBody: string | Uint8Array | ArrayBufferView, signatureHeader: string, secret: string, opts?: { toleranceSec?: number; now?: number }): boolean;
~~~~

## const SIGNATURE\_TOLERANCE\_SEC

~~~~
export declare const SIGNATURE_TOLERANCE_SEC: number;
~~~~
