openvibers/openvibe.contracts Commits

0.287.0: billing.credit.settled event payload (AI Exchange D1/D9) (#296)

OP OpenVibers committed 9 days ago · 1316abb9cc · 62 files, +594 −92

* 0.287.0: billing.credit.settled event payload (AI Exchange D1/D9)

OpenVibe.Billing emits billing.credit.settled from the settle transaction of a Credits hold (server/ops/credits.js settleHold); OpenVibe.Report consumes it for aggregate analytics. The payload carries settlement_id, hold_id, the hold's service, settled_at, the answering attempt's deployment_id (<provider>:<model>, nullable) and provider_access, rate_version, the four usage counts, charge/supply/shortfall/released nano-USD as D1 decimal strings, byok and sandbox.

It deliberately carries no subject, no project_id and no account id: it is for aggregates, and per-person statements are read from Billing. Billing's manifest lists it in eventsProduced; Report's lists it in eventsConsumed. Valid and invalid fixtures cover a managed AI settlement, a BYOK sandbox settlement, a numeric amount and a subject field.

Checked: OV_ALLOW_SUITE=1 node test/run.js (24784 checks passed, generated/ up to date, compat vs v0.285.0 no breaking changes); gitleaks --pre-commit --staged.

* 0.287.0: sandbox field on Credits holds (D10)

Adds an optional sandbox boolean (default false) to billing.credit-hold@1 and billing.credit-hold-create-request@1. A sandbox caller's hold draws on that person's sandbox credit for the project (account kind usd_credit_sandbox, owner subject:project), never on real Credits; a real hold never draws on sandbox credit. billing.credit-sandbox-grant-request@1 now says its grants land in that sandbox account.

Additive, so 0.287.0 stays the version. Valid fixtures cover sandbox: true for both contracts; sandbox: "yes" is invalid in both. Checked: OV_ALLOW_SUITE=1 node test/run.js (24788 checks passed, generated/ up to date, compat vs v0.286.0 no breaking changes); gitleaks --pre-commit --staged.

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 5e687a62..87d14d36 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -1,6 +1,26 @@
# Changelog
++## 0.287.0 — 2026-11-04
++
++- **`billing.credit.settled@1`** (AI Exchange money, D1 and D9).
++ - OpenVibe.Billing emits it from the settle transaction of a Credits hold (`server/ops/credits.js` `settleHold`);
++ OpenVibe.Report consumes it for aggregate analytics.
++ - It carries `settlement_id`, `hold_id`, the hold's `service`, `settled_at`, the answering attempt's
++ `deployment_id` (`<provider>:<model>`, nullable) and `provider_access` (nullable), `rate_version`, the four
++ `usage` token counts, `charge_nano_usd`, `supply_cost_nano_usd`, `shortfall_nano_usd`, `released_nano_usd`,
++ `byok` and `sandbox`.
++ - Deliberately no `subject`, no `project_id` and no account id: the event is for aggregates, while per-person
++ statements are read from Billing.
++ - Money is integer nano-USD as decimal strings (D1); a number amount and a subject field are invalid fixtures.
++ - Billing's manifest lists the event in `eventsProduced`; Report's lists it in `eventsConsumed`.
++- **`sandbox` on Credits holds: `billing.credit-hold@1` and `billing.credit-hold-create-request@1`** (D10, additive).
++ - An optional boolean `sandbox` (default false) says the hold draws on that person's sandbox credit for the project
++ (account kind `usd_credit_sandbox`, owner `subject:project`), never on real Credits; a real hold never draws on
++ sandbox credit.
++ - `billing.credit-sandbox-grant-request@1` now says its grants land in that sandbox account.
++ - Valid fixtures cover `sandbox: true`; `sandbox: "yes"` is invalid.
++
## 0.286.0 — 2026-11-04
- **Provider-rate evidence events: `watch.rate.changed@1`, `watch.rate.approved@1`, `watch.rate.rejected@1`**
ddiff --git a/README.md b/README.md
iindex d7bbc9cb..94e9d5ae 100644
---- a/README.md
++++ b/README.md
@@@ -2,7 +2,7 @@
> Machine-readable contracts for the whole OpenVibe network.
--**Status:** alpha (first released in Wave 1; the release is package.json's `version`, tagged). At v0.286.0: 974 schemas in `contracts/catalog.json`, 45 service manifests, 440 capability manifests, 13 namespace manifests and the staff capability map. Service repositories run `openvibe-contracts-check` and the pin-drift check in CI, and deployed services verify service and app tokens with `serviceAuth` in production. Consumers pin release tags (each repository's `STATUS.json` names its pin). `node scripts/docs-currency.js <root>` checks every checkout's README and `STATUS.json` against its code: the pins and versions they name, a library's consumer list, the deployed flag against the manifest, README links, and the paths and migrations they name. `node scripts/estate.js` generates `docs/ESTATE.md` and `manifests/repositories/` from the estate checkouts, and `--check` fails on drift (plan T1 step 3).
++**Status:** alpha (first released in Wave 1; the release is package.json's `version`, tagged). At v0.287.0: 975 schemas in `contracts/catalog.json`, 45 service manifests, 440 capability manifests, 13 namespace manifests and the staff capability map. Service repositories run `openvibe-contracts-check` and the pin-drift check in CI, and deployed services verify service and app tokens with `serviceAuth` in production. Consumers pin release tags (each repository's `STATUS.json` names its pin). `node scripts/docs-currency.js <root>` checks every checkout's README and `STATUS.json` against its code: the pins and versions they name, a library's consumer list, the deployed flag against the manifest, README links, and the paths and migrations they name. `node scripts/estate.js` generates `docs/ESTATE.md` and `manifests/repositories/` from the estate checkouts, and `--check` fails on drift (plan T1 step 3).
**Plan:** OpenVibe Development Roadmap, Wave 1 (implementation plan rev 3, §3.1 and §18.11).
**License:** AGPL-3.0 (same as every OpenVibe service).
ddiff --git a/contracts/billing/credit-hold-create-request.v1.json b/contracts/billing/credit-hold-create-request.v1.json
iindex 122fa6c0..b6698918 100644
---- a/contracts/billing/credit-hold-create-request.v1.json
++++ b/contracts/billing/credit-hold-create-request.v1.json
@@@ -53,6 +53,11 @@
"type": "string",
"pattern": "^[a-z][a-z0-9-]{0,39}$",
"description": "Which metered service spends the credit (D9): ai, run, ... Defaults to ai."
++ },
++ "sandbox": {
++ "type": "boolean",
++ "default": false,
++ "description": "D10. A sandbox caller's hold draws on that person's sandbox credit for the project (account kind usd_credit_sandbox, owner subject:project), never on real Credits, and a real hold never draws on sandbox credit. Sandbox grants (billing.credit-sandbox-grant-request@1) land in that sandbox account. Optional; defaults to false."
}
}
}
ddiff --git a/contracts/billing/credit-hold.v1.json b/contracts/billing/credit-hold.v1.json
iindex e216cc87..b60af6e8 100644
---- a/contracts/billing/credit-hold.v1.json
++++ b/contracts/billing/credit-hold.v1.json
@@@ -81,6 +81,11 @@
"type": "string",
"pattern": "^[a-z][a-z0-9-]{0,39}$",
"description": "Which metered service spends the credit (D9): ai, run, ... Defaults to ai."
++ },
++ "sandbox": {
++ "type": "boolean",
++ "default": false,
++ "description": "D10. A sandbox caller's hold draws on that person's sandbox credit for the project (account kind usd_credit_sandbox, owner subject:project), never on real Credits, and a real hold never draws on sandbox credit. Sandbox grants (billing.credit-sandbox-grant-request@1) land in that sandbox account. Optional; defaults to false."
}
}
}
ddiff --git a/contracts/billing/credit-sandbox-grant-request.v1.json b/contracts/billing/credit-sandbox-grant-request.v1.json
iindex 01f3aa20..21ba7271 100644
---- a/contracts/billing/credit-sandbox-grant-request.v1.json
++++ b/contracts/billing/credit-sandbox-grant-request.v1.json
@@@ -2,7 +2,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/billing/credit-sandbox-grant-request.v1.json",
"title": "BillingCreditSandboxGrantRequest",
-- "description": "billing.credit-sandbox-grant-request@1: POST /internal/credits/sandbox/grants, synthetic credit for tests and staging. Billing answers only when BILLING_CREDITS_SANDBOX=1; the grant is a test transaction (D9).",
++ "description": "billing.credit-sandbox-grant-request@1: POST /internal/credits/sandbox/grants, synthetic credit for tests and staging. Billing answers only when BILLING_CREDITS_SANDBOX=1; the grant is a test transaction (D9). D10: the grant lands in the subject's sandbox credit account for the project (account kind usd_credit_sandbox, owner subject:project), and only a sandbox hold (billing.credit-hold-create-request@1 sandbox: true) draws on it; real Credits are never touched.",
"type": "object",
"required": [
"subject",
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex 9fc09517..bbbdb421 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -2223,6 +2223,15 @@
"status": "active",
"adr": "ADR-012"
},
++ {
++ "id": "billing.credit.settled",
++ "version": "1.0.0",
++ "owner": "billing",
++ "schema": "events/payloads/billing.credit.settled.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
{
"id": "billing.admin-request",
"version": "1.0.0",
ddiff --git a/contracts/events/payloads/billing.credit.settled.v1.json b/contracts/events/payloads/billing.credit.settled.v1.json
nnew file mode 100644
iindex 00000000..6694d57c
---- /dev/null
++++ b/contracts/events/payloads/billing.credit.settled.v1.json
@@@ -0,0 +1,97 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/billing.credit.settled.v1.json",
++ "title": "BillingCreditSettledPayload",
++ "description": "billing.credit.settled v1 (OpenVibe.Billing server/ops/credits.js settleHold(); written with the settlement row in the settle transaction): a Credits hold was settled once. It is AGGREGATE-ONLY on purpose: it carries no subject, no project_id and no account id, so a consumer can count services, routes and money but cannot reconstruct a person's statement; per-person statements are read from Billing's own ledger. OpenVibe.Report consumes it for aggregate analytics. Money is integer nano-USD as decimal strings (D1: never a float). Envelope: subject { type: credit-settlement, id: stl_… }, visibility internal, priority important, actor service:billing.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": ["settlement_id", "hold_id", "service", "settled_at", "deployment_id", "provider_access", "rate_version", "usage", "charge_nano_usd", "supply_cost_nano_usd", "shortfall_nano_usd", "released_nano_usd", "byok", "sandbox"],
++ "properties": {
++ "settlement_id": {
++ "type": "string",
++ "pattern": "^stl_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "ULID settlement id, the same one the settle result and Billing's statement use."
++ },
++ "hold_id": {
++ "type": "string",
++ "pattern": "^hld_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "The settled hold."
++ },
++ "service": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{0,39}$",
++ "description": "The hold's service (D9): which metered service spent the credit, e.g. ai. Read from the hold; the settle request does not carry it."
++ },
++ "settled_at": {
++ "type": "string",
++ "format": "date-time",
++ "description": "When the settlement committed (the settlement row's created_at)."
++ },
++ "deployment_id": {
++ "type": ["string", "null"],
++ "maxLength": 256,
++ "description": "The answering attempt's deployment id, '<provider>:<model>' as sent in the settle request's attempts[].deployment_id; null when no attempt answered (a cache hit or a BYOK call with no managed attempt)."
++ },
++ "provider_access": {
++ "type": ["string", "null"],
++ "enum": ["OWN_DEPLOYMENT", "AUTHORIZED_WHOLESALE", "CUSTOMER_BYOK", "RESTRICTED", "UNVERIFIED", null],
++ "description": "The answering attempt's commercial route (D3); null when no attempt answered or its route did not state one."
++ },
++ "rate_version": {
++ "type": "string",
++ "description": "The retail rate-card version the usage was priced against (the settle request's retail.version)."
++ },
++ "usage": {
++ "type": "object",
++ "description": "The measured token counts, the same shape as billing.credit-hold-settle-request@1's usage.",
++ "required": ["input_tokens", "cached_read_tokens", "cache_write_tokens", "output_tokens"],
++ "additionalProperties": false,
++ "properties": {
++ "input_tokens": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "cached_read_tokens": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "cache_write_tokens": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "output_tokens": {
++ "type": "integer",
++ "minimum": 0
++ }
++ }
++ },
++ "charge_nano_usd": {
++ "type": "string",
++ "pattern": "^[0-9]{1,19}$",
++ "description": "The charge the settlement recorded, integer nano-USD (D1). Usage beyond the hold and free balance is separately shortfall_nano_usd."
++ },
++ "supply_cost_nano_usd": {
++ "type": "string",
++ "pattern": "^[0-9]{1,19}$",
++ "description": "What the route cost OpenVibe at supply, integer nano-USD (D1); 0 for BYOK."
++ },
++ "shortfall_nano_usd": {
++ "type": "string",
++ "pattern": "^[0-9]{1,19}$",
++ "description": "Usage beyond the hold and the free balance: owed, not collected (nano-USD, D1)."
++ },
++ "released_nano_usd": {
++ "type": "string",
++ "pattern": "^[0-9]{1,19}$",
++ "description": "Hold amount returned to the account, integer nano-USD (D1)."
++ },
++ "byok": {
++ "type": "boolean",
++ "description": "True when the caller supplied their own provider key; the retail charge is 0."
++ },
++ "sandbox": {
++ "type": "boolean",
++ "description": "True when the hold was funded from usd_credit_sandbox (BILLING_CREDITS_SANDBOX), never paid credit."
++ }
++ }
++}
ddiff --git a/fixtures/billing.credit-hold-create-request/invalid/sandbox-string.json b/fixtures/billing.credit-hold-create-request/invalid/sandbox-string.json
nnew file mode 100644
iindex 00000000..c43b3ec5
---- /dev/null
++++ b/fixtures/billing.credit-hold-create-request/invalid/sandbox-string.json
@@@ -0,0 +1,10 @@
++{
++ "idempotency_key": "hold-key-sandbox-002",
++ "subject": { "type": "app", "id": "app_01JAB2C3D4E5F6G7H8J9K0MNPQ" },
++ "project_id": "prj_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "max_nano_usd": "50000000",
++ "rate_version": "rr-2026-11-03-001",
++ "request_fingerprint": "fp-chat-sandbox-002",
++ "service": "ai",
++ "sandbox": "yes"
++}
ddiff --git a/fixtures/billing.credit-hold-create-request/valid/sandbox.json b/fixtures/billing.credit-hold-create-request/valid/sandbox.json
nnew file mode 100644
iindex 00000000..8fd909ad
---- /dev/null
++++ b/fixtures/billing.credit-hold-create-request/valid/sandbox.json
@@@ -0,0 +1,10 @@
++{
++ "idempotency_key": "hold-key-sandbox-001",
++ "subject": { "type": "app", "id": "app_01JAB2C3D4E5F6G7H8J9K0MNPQ" },
++ "project_id": "prj_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "max_nano_usd": "50000000",
++ "rate_version": "rr-2026-11-03-001",
++ "request_fingerprint": "fp-chat-sandbox-001",
++ "service": "ai",
++ "sandbox": true
++}
ddiff --git a/fixtures/billing.credit-hold/invalid/sandbox-string.json b/fixtures/billing.credit-hold/invalid/sandbox-string.json
nnew file mode 100644
iindex 00000000..22a117ca
---- /dev/null
++++ b/fixtures/billing.credit-hold/invalid/sandbox-string.json
@@@ -0,0 +1,15 @@
++{
++ "hold_id": "hld_01JAB2C3D4E5F6G7H8J9K0MNP2",
++ "subject": { "type": "app", "id": "app_01JAB2C3D4E5F6G7H8J9K0MNPQ" },
++ "project_id": "prj_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "held_nano_usd": "100000000",
++ "available_nano_usd": "50000000",
++ "max_nano_usd": "100000000",
++ "rate_version": "rr-2026-11-03-001",
++ "request_fingerprint": "fp-chat-sandbox-002",
++ "lease_expires_at": "2026-11-04T01:00:00.000Z",
++ "status": "active",
++ "created_at": "2026-11-04T00:00:00.000Z",
++ "service": "ai",
++ "sandbox": "yes"
++}
ddiff --git a/fixtures/billing.credit-hold/valid/sandbox.json b/fixtures/billing.credit-hold/valid/sandbox.json
nnew file mode 100644
iindex 00000000..a70a5c44
---- /dev/null
++++ b/fixtures/billing.credit-hold/valid/sandbox.json
@@@ -0,0 +1,15 @@
++{
++ "hold_id": "hld_01JAB2C3D4E5F6G7H8J9K0MNP1",
++ "subject": { "type": "app", "id": "app_01JAB2C3D4E5F6G7H8J9K0MNPQ" },
++ "project_id": "prj_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "held_nano_usd": "100000000",
++ "available_nano_usd": "50000000",
++ "max_nano_usd": "100000000",
++ "rate_version": "rr-2026-11-03-001",
++ "request_fingerprint": "fp-chat-sandbox-001",
++ "lease_expires_at": "2026-11-04T01:00:00.000Z",
++ "status": "active",
++ "created_at": "2026-11-04T00:00:00.000Z",
++ "service": "ai",
++ "sandbox": true
++}
ddiff --git a/fixtures/billing.credit.settled/invalid/money-number.json b/fixtures/billing.credit.settled/invalid/money-number.json
nnew file mode 100644
iindex 00000000..46c68914
---- /dev/null
++++ b/fixtures/billing.credit.settled/invalid/money-number.json
@@@ -0,0 +1,21 @@
++{
++ "settlement_id": "stl_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "hold_id": "hld_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "service": "ai",
++ "settled_at": "2026-11-04T12:00:05.000Z",
++ "deployment_id": "deepinfra:Qwen/Qwen3-Coder-30B-A3B-Instruct",
++ "provider_access": "AUTHORIZED_WHOLESALE",
++ "rate_version": "rr-2026-11-03-001",
++ "usage": {
++ "input_tokens": 1000,
++ "cached_read_tokens": 0,
++ "cache_write_tokens": 0,
++ "output_tokens": 500
++ },
++ "charge_nano_usd": 11,
++ "supply_cost_nano_usd": "9",
++ "shortfall_nano_usd": "0",
++ "released_nano_usd": "9999989",
++ "byok": false,
++ "sandbox": false
++}
ddiff --git a/fixtures/billing.credit.settled/invalid/subject-included.json b/fixtures/billing.credit.settled/invalid/subject-included.json
nnew file mode 100644
iindex 00000000..f0919aa1
---- /dev/null
++++ b/fixtures/billing.credit.settled/invalid/subject-included.json
@@@ -0,0 +1,25 @@
++{
++ "settlement_id": "stl_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "hold_id": "hld_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "service": "ai",
++ "settled_at": "2026-11-04T12:00:05.000Z",
++ "deployment_id": "deepinfra:Qwen/Qwen3-Coder-30B-A3B-Instruct",
++ "provider_access": "AUTHORIZED_WHOLESALE",
++ "rate_version": "rr-2026-11-03-001",
++ "usage": {
++ "input_tokens": 1000,
++ "cached_read_tokens": 0,
++ "cache_write_tokens": 0,
++ "output_tokens": 500
++ },
++ "charge_nano_usd": "11",
++ "supply_cost_nano_usd": "9",
++ "shortfall_nano_usd": "0",
++ "released_nano_usd": "9999989",
++ "byok": false,
++ "sandbox": false,
++ "subject": {
++ "type": "user",
++ "id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
++ }
++}
ddiff --git a/fixtures/billing.credit.settled/valid/byok-sandbox.json b/fixtures/billing.credit.settled/valid/byok-sandbox.json
nnew file mode 100644
iindex 00000000..d965dd20
---- /dev/null
++++ b/fixtures/billing.credit.settled/valid/byok-sandbox.json
@@@ -0,0 +1,21 @@
++{
++ "settlement_id": "stl_01JAB2C3D4E5F6G7H8J9K0MNP1",
++ "hold_id": "hld_01JAB2C3D4E5F6G7H8J9K0MNP2",
++ "service": "ai",
++ "settled_at": "2026-11-04T12:00:07.000Z",
++ "deployment_id": null,
++ "provider_access": null,
++ "rate_version": "rr-2026-11-03-001",
++ "usage": {
++ "input_tokens": 0,
++ "cached_read_tokens": 0,
++ "cache_write_tokens": 0,
++ "output_tokens": 0
++ },
++ "charge_nano_usd": "0",
++ "supply_cost_nano_usd": "0",
++ "shortfall_nano_usd": "0",
++ "released_nano_usd": "500000",
++ "byok": true,
++ "sandbox": true
++}
ddiff --git a/fixtures/billing.credit.settled/valid/managed-ai.json b/fixtures/billing.credit.settled/valid/managed-ai.json
nnew file mode 100644
iindex 00000000..1a12bd39
---- /dev/null
++++ b/fixtures/billing.credit.settled/valid/managed-ai.json
@@@ -0,0 +1,21 @@
++{
++ "settlement_id": "stl_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "hold_id": "hld_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "service": "ai",
++ "settled_at": "2026-11-04T12:00:05.000Z",
++ "deployment_id": "deepinfra:Qwen/Qwen3-Coder-30B-A3B-Instruct",
++ "provider_access": "AUTHORIZED_WHOLESALE",
++ "rate_version": "rr-2026-11-03-001",
++ "usage": {
++ "input_tokens": 1000,
++ "cached_read_tokens": 0,
++ "cache_write_tokens": 0,
++ "output_tokens": 500
++ },
++ "charge_nano_usd": "11",
++ "supply_cost_nano_usd": "9",
++ "shortfall_nano_usd": "0",
++ "released_nano_usd": "9999989",
++ "byok": false,
++ "sandbox": false
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex 81f4fe56..d5323e60 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -25315,6 +25315,141 @@
}
}
},
++ "billing.credit.settled": {
++ "version": "1.0.0",
++ "owner": "billing",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/billing.credit.settled.v1.json",
++ "title": "BillingCreditSettledPayload",
++ "description": "billing.credit.settled v1 (OpenVibe.Billing server/ops/credits.js settleHold(); written with the settlement row in the settle transaction): a Credits hold was settled once. It is AGGREGATE-ONLY on purpose: it carries no subject, no project_id and no account id, so a consumer can count services, routes and money but cannot reconstruct a person's statement; per-person statements are read from Billing's own ledger. OpenVibe.Report consumes it for aggregate analytics. Money is integer nano-USD as decimal strings (D1: never a float). Envelope: subject { type: credit-settlement, id: stl_… }, visibility internal, priority important, actor service:billing.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "settlement_id",
++ "hold_id",
++ "service",
++ "settled_at",
++ "deployment_id",
++ "provider_access",
++ "rate_version",
++ "usage",
++ "charge_nano_usd",
++ "supply_cost_nano_usd",
++ "shortfall_nano_usd",
++ "released_nano_usd",
++ "byok",
++ "sandbox"
++ ],
++ "properties": {
++ "settlement_id": {
++ "type": "string",
++ "pattern": "^stl_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "ULID settlement id, the same one the settle result and Billing's statement use."
++ },
++ "hold_id": {
++ "type": "string",
++ "pattern": "^hld_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "The settled hold."
++ },
++ "service": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{0,39}$",
++ "description": "The hold's service (D9): which metered service spent the credit, e.g. ai. Read from the hold; the settle request does not carry it."
++ },
++ "settled_at": {
++ "type": "string",
++ "format": "date-time",
++ "description": "When the settlement committed (the settlement row's created_at)."
++ },
++ "deployment_id": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 256,
++ "description": "The answering attempt's deployment id, '<provider>:<model>' as sent in the settle request's attempts[].deployment_id; null when no attempt answered (a cache hit or a BYOK call with no managed attempt)."
++ },
++ "provider_access": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "enum": [
++ "OWN_DEPLOYMENT",
++ "AUTHORIZED_WHOLESALE",
++ "CUSTOMER_BYOK",
++ "RESTRICTED",
++ "UNVERIFIED",
++ null
++ ],
++ "description": "The answering attempt's commercial route (D3); null when no attempt answered or its route did not state one."
++ },
++ "rate_version": {
++ "type": "string",
++ "description": "The retail rate-card version the usage was priced against (the settle request's retail.version)."
++ },
++ "usage": {
++ "type": "object",
++ "description": "The measured token counts, the same shape as billing.credit-hold-settle-request@1's usage.",
++ "required": [
++ "input_tokens",
++ "cached_read_tokens",
++ "cache_write_tokens",
++ "output_tokens"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "input_tokens": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "cached_read_tokens": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "cache_write_tokens": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "output_tokens": {
++ "type": "integer",
++ "minimum": 0
++ }
++ }
++ },
++ "charge_nano_usd": {
++ "type": "string",
++ "pattern": "^[0-9]{1,19}$",
++ "description": "The charge the settlement recorded, integer nano-USD (D1). Usage beyond the hold and free balance is separately shortfall_nano_usd."
++ },
++ "supply_cost_nano_usd": {
++ "type": "string",
++ "pattern": "^[0-9]{1,19}$",
++ "description": "What the route cost OpenVibe at supply, integer nano-USD (D1); 0 for BYOK."
++ },
++ "shortfall_nano_usd": {
++ "type": "string",
++ "pattern": "^[0-9]{1,19}$",
++ "description": "Usage beyond the hold and the free balance: owed, not collected (nano-USD, D1)."
++ },
++ "released_nano_usd": {
++ "type": "string",
++ "pattern": "^[0-9]{1,19}$",
++ "description": "Hold amount returned to the account, integer nano-USD (D1)."
++ },
++ "byok": {
++ "type": "boolean",
++ "description": "True when the caller supplied their own provider key; the retail charge is 0."
++ },
++ "sandbox": {
++ "type": "boolean",
++ "description": "True when the hold was funded from usd_credit_sandbox (BILLING_CREDITS_SANDBOX), never paid credit."
++ }
++ }
++ }
++ },
"billing.admin-request": {
"version": "1.0.0",
"owner": "billing",
@@@ -27454,6 +27589,11 @@
"type": "string",
"pattern": "^[a-z][a-z0-9-]{0,39}$",
"description": "Which metered service spends the credit (D9): ai, run, ... Defaults to ai."
++ },
++ "sandbox": {
++ "type": "boolean",
++ "default": false,
++ "description": "D10. A sandbox caller's hold draws on that person's sandbox credit for the project (account kind usd_credit_sandbox, owner subject:project), never on real Credits, and a real hold never draws on sandbox credit. Sandbox grants (billing.credit-sandbox-grant-request@1) land in that sandbox account. Optional; defaults to false."
}
}
}
@@@ -27705,6 +27845,11 @@
"type": "string",
"pattern": "^[a-z][a-z0-9-]{0,39}$",
"description": "Which metered service spends the credit (D9): ai, run, ... Defaults to ai."
++ },
++ "sandbox": {
++ "type": "boolean",
++ "default": false,
++ "description": "D10. A sandbox caller's hold draws on that person's sandbox credit for the project (account kind usd_credit_sandbox, owner subject:project), never on real Credits, and a real hold never draws on sandbox credit. Sandbox grants (billing.credit-sandbox-grant-request@1) land in that sandbox account. Optional; defaults to false."
}
}
}
@@@ -100477,7 +100622,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/billing/credit-sandbox-grant-request.v1.json",
"title": "BillingCreditSandboxGrantRequest",
-- "description": "billing.credit-sandbox-grant-request@1: POST /internal/credits/sandbox/grants, synthetic credit for tests and staging. Billing answers only when BILLING_CREDITS_SANDBOX=1; the grant is a test transaction (D9).",
++ "description": "billing.credit-sandbox-grant-request@1: POST /internal/credits/sandbox/grants, synthetic credit for tests and staging. Billing answers only when BILLING_CREDITS_SANDBOX=1; the grant is a test transaction (D9). D10: the grant lands in the subject's sandbox credit account for the project (account kind usd_credit_sandbox, owner subject:project), and only a sandbox hold (billing.credit-hold-create-request@1 sandbox: true) draws on it; real Credits are never touched.",
"type": "object",
"required": [
"subject",
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex ef3be171..7503a6a4 100644
---- a/generated/openapi/actor.json
++++ b/generated/openapi/actor.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Actor API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/ai.json b/generated/openapi/ai.json
iindex edd28395..8d8b53b5 100644
---- a/generated/openapi/ai.json
++++ b/generated/openapi/ai.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.AI API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/bench.json b/generated/openapi/bench.json
iindex f390e9ed..8c858b47 100644
---- a/generated/openapi/bench.json
++++ b/generated/openapi/bench.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bench API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/billing.json b/generated/openapi/billing.json
iindex f44a6778..5301a7a6 100644
---- a/generated/openapi/billing.json
++++ b/generated/openapi/billing.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Billing API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
@@@ -3104,6 +3104,11 @@
"type": "string",
"pattern": "^[a-z][a-z0-9-]{0,39}$",
"description": "Which metered service spends the credit (D9): ai, run, ... Defaults to ai."
++ },
++ "sandbox": {
++ "type": "boolean",
++ "default": false,
++ "description": "D10. A sandbox caller's hold draws on that person's sandbox credit for the project (account kind usd_credit_sandbox, owner subject:project), never on real Credits, and a real hold never draws on sandbox credit. Sandbox grants (billing.credit-sandbox-grant-request@1) land in that sandbox account. Optional; defaults to false."
}
}
},
@@@ -3369,7 +3374,7 @@
},
"billing.credit-sandbox-grant-request.v1": {
"title": "BillingCreditSandboxGrantRequest",
-- "description": "billing.credit-sandbox-grant-request@1: POST /internal/credits/sandbox/grants, synthetic credit for tests and staging. Billing answers only when BILLING_CREDITS_SANDBOX=1; the grant is a test transaction (D9).",
++ "description": "billing.credit-sandbox-grant-request@1: POST /internal/credits/sandbox/grants, synthetic credit for tests and staging. Billing answers only when BILLING_CREDITS_SANDBOX=1; the grant is a test transaction (D9). D10: the grant lands in the subject's sandbox credit account for the project (account kind usd_credit_sandbox, owner subject:project), and only a sandbox hold (billing.credit-hold-create-request@1 sandbox: true) draws on it; real Credits are never touched.",
"type": "object",
"required": [
"subject",
ddiff --git a/generated/openapi/blog.json b/generated/openapi/blog.json
iindex da160b12..d037c657 100644
---- a/generated/openapi/blog.json
++++ b/generated/openapi/blog.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Blog API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/bot.json b/generated/openapi/bot.json
iindex 21e86786..bc0d95d3 100644
---- a/generated/openapi/bot.json
++++ b/generated/openapi/bot.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bot API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/chat.json b/generated/openapi/chat.json
iindex db615e9e..9d525e41 100644
---- a/generated/openapi/chat.json
++++ b/generated/openapi/chat.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Chat API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/codes.json b/generated/openapi/codes.json
iindex 3ef7a2a8..b5b66942 100644
---- a/generated/openapi/codes.json
++++ b/generated/openapi/codes.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Codes API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/community.json b/generated/openapi/community.json
iindex 4abd8d64..d8cf7c81 100644
---- a/generated/openapi/community.json
++++ b/generated/openapi/community.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Community API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/coupons.json b/generated/openapi/coupons.json
iindex aaa3f12b..526ae780 100644
---- a/generated/openapi/coupons.json
++++ b/generated/openapi/coupons.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Coupons API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/deals.json b/generated/openapi/deals.json
iindex 31aaafe6..5e90d98a 100644
---- a/generated/openapi/deals.json
++++ b/generated/openapi/deals.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Deals API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/domains.json b/generated/openapi/domains.json
iindex 19157751..94176f0f 100644
---- a/generated/openapi/domains.json
++++ b/generated/openapi/domains.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Domains API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/events.json b/generated/openapi/events.json
iindex 549593f6..2da0b410 100644
---- a/generated/openapi/events.json
++++ b/generated/openapi/events.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Events API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/food.json b/generated/openapi/food.json
iindex 3e0ebdc7..666caaa2 100644
---- a/generated/openapi/food.json
++++ b/generated/openapi/food.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Food API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/games.json b/generated/openapi/games.json
iindex 3b2cfa55..0223c1ee 100644
---- a/generated/openapi/games.json
++++ b/generated/openapi/games.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Games API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/host.json b/generated/openapi/host.json
iindex 98d00a9d..8ca15140 100644
---- a/generated/openapi/host.json
++++ b/generated/openapi/host.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Host API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex 0bc3fa42..c3d24580 100644
---- a/generated/openapi/inventory.json
++++ b/generated/openapi/inventory.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Inventory API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/live.json b/generated/openapi/live.json
iindex 99b37478..e6acccd5 100644
---- a/generated/openapi/live.json
++++ b/generated/openapi/live.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Live API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/media-hub.json b/generated/openapi/media-hub.json
iindex 213e515b..e2cf44e8 100644
---- a/generated/openapi/media-hub.json
++++ b/generated/openapi/media-hub.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.MediaHub API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/media.json b/generated/openapi/media.json
iindex 25979519..c3d11f6b 100644
---- a/generated/openapi/media.json
++++ b/generated/openapi/media.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Media API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/network.json b/generated/openapi/network.json
iindex 163f59c8..53b3b919 100644
---- a/generated/openapi/network.json
++++ b/generated/openapi/network.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Network API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/news.json b/generated/openapi/news.json
iindex e609b6cd..53594957 100644
---- a/generated/openapi/news.json
++++ b/generated/openapi/news.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.News API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/openre.json b/generated/openapi/openre.json
iindex c7bb8625..c4b03d07 100644
---- a/generated/openapi/openre.json
++++ b/generated/openapi/openre.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenRestream API",
-- "version": "0.286.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/play.json b/generated/openapi/play.json
iindex 78064d36..9756e2fd 100644
---- a/generated/openapi/play.json
++++ b/generated/openapi/play.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Play API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/quest.json b/generated/openapi/quest.json
iindex 16bc68bb..cbcc413d 100644
---- a/generated/openapi/quest.json
++++ b/generated/openapi/quest.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Quest API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/report.json b/generated/openapi/report.json
iindex 90642cba..ea7268b1 100644
---- a/generated/openapi/report.json
++++ b/generated/openapi/report.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Report API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/reviews.json b/generated/openapi/reviews.json
iindex ecae30f5..eb3aceca 100644
---- a/generated/openapi/reviews.json
++++ b/generated/openapi/reviews.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Reviews API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/run.json b/generated/openapi/run.json
iindex 9ff598ca..94e8b67e 100644
---- a/generated/openapi/run.json
++++ b/generated/openapi/run.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Run API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/search.json b/generated/openapi/search.json
iindex 5bd93f00..7e4a258d 100644
---- a/generated/openapi/search.json
++++ b/generated/openapi/search.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Search API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/services.json b/generated/openapi/services.json
iindex ebb9fe82..b41a933f 100644
---- a/generated/openapi/services.json
++++ b/generated/openapi/services.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Services API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/sources.json b/generated/openapi/sources.json
iindex 4d0795f5..702aefef 100644
---- a/generated/openapi/sources.json
++++ b/generated/openapi/sources.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Sources API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/space.json b/generated/openapi/space.json
iindex 11ee367c..9536a278 100644
---- a/generated/openapi/space.json
++++ b/generated/openapi/space.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Space API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/tips.json b/generated/openapi/tips.json
iindex 75f36ee8..ddb00997 100644
---- a/generated/openapi/tips.json
++++ b/generated/openapi/tips.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tips API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/today.json b/generated/openapi/today.json
iindex dd035752..58f451ba 100644
---- a/generated/openapi/today.json
++++ b/generated/openapi/today.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Today API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/tools.json b/generated/openapi/tools.json
iindex 76e7a61a..be84a9ff 100644
---- a/generated/openapi/tools.json
++++ b/generated/openapi/tools.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tools API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/trade.json b/generated/openapi/trade.json
iindex ef4c8263..078903da 100644
---- a/generated/openapi/trade.json
++++ b/generated/openapi/trade.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Trade API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/vip.json b/generated/openapi/vip.json
iindex 5eb4fd71..26165b4c 100644
---- a/generated/openapi/vip.json
++++ b/generated/openapi/vip.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.VIP API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/vision.json b/generated/openapi/vision.json
iindex 14b49bc2..6b452f8f 100644
---- a/generated/openapi/vision.json
++++ b/generated/openapi/vision.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Vision API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/watch.json b/generated/openapi/watch.json
iindex 8c46f14f..e82c4b82 100644
---- a/generated/openapi/watch.json
++++ b/generated/openapi/watch.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Watch API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/wiki.json b/generated/openapi/wiki.json
iindex 0b2270c2..d5271c11 100644
---- a/generated/openapi/wiki.json
++++ b/generated/openapi/wiki.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Wiki API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/work.json b/generated/openapi/work.json
iindex fabb0462..97d743b2 100644
---- a/generated/openapi/work.json
++++ b/generated/openapi/work.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Work API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/zone.json b/generated/openapi/zone.json
iindex b60f2faf..1a22ee7d 100644
---- a/generated/openapi/zone.json
++++ b/generated/openapi/zone.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Zone API",
-- "version": "0.286.0",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.286.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.287.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.287.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/typescript/index.d.ts b/generated/typescript/index.d.ts
iindex d2fcea3b..847a2998 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -163890,6 +163890,74 @@ export interface BillingReceiptExternalPayload {
};
}
++/** [email protected] (owner: billing) */
++/**
++ * billing.credit.settled v1 (OpenVibe.Billing server/ops/credits.js settleHold(); written with the settlement row in the settle transaction): a Credits hold was settled once. It is AGGREGATE-ONLY on purpose: it carries no subject, no project_id and no account id, so a consumer can count services, routes and money but cannot reconstruct a person's statement; per-person statements are read from Billing's own ledger. OpenVibe.Report consumes it for aggregate analytics. Money is integer nano-USD as decimal strings (D1: never a float). Envelope: subject { type: credit-settlement, id: stl_… }, visibility internal, priority important, actor service:billing.
++ */
++export interface BillingCreditSettledPayload {
++ /**
++ * ULID settlement id, the same one the settle result and Billing's statement use.
++ */
++ settlement_id: string;
++ /**
++ * The settled hold.
++ */
++ hold_id: string;
++ /**
++ * The hold's service (D9): which metered service spent the credit, e.g. ai. Read from the hold; the settle request does not carry it.
++ */
++ service: string;
++ /**
++ * When the settlement committed (the settlement row's created_at).
++ */
++ settled_at: string;
++ /**
++ * The answering attempt's deployment id, '<provider>:<model>' as sent in the settle request's attempts[].deployment_id; null when no attempt answered (a cache hit or a BYOK call with no managed attempt).
++ */
++ deployment_id: string | null;
++ /**
++ * The answering attempt's commercial route (D3); null when no attempt answered or its route did not state one.
++ */
++ provider_access: "OWN_DEPLOYMENT" | "AUTHORIZED_WHOLESALE" | "CUSTOMER_BYOK" | "RESTRICTED" | "UNVERIFIED" | null;
++ /**
++ * The retail rate-card version the usage was priced against (the settle request's retail.version).
++ */
++ rate_version: string;
++ /**
++ * The measured token counts, the same shape as billing.credit-hold-settle-request@1's usage.
++ */
++ usage: {
++ input_tokens: number;
++ cached_read_tokens: number;
++ cache_write_tokens: number;
++ output_tokens: number;
++ };
++ /**
++ * The charge the settlement recorded, integer nano-USD (D1). Usage beyond the hold and free balance is separately shortfall_nano_usd.
++ */
++ charge_nano_usd: string;
++ /**
++ * What the route cost OpenVibe at supply, integer nano-USD (D1); 0 for BYOK.
++ */
++ supply_cost_nano_usd: string;
++ /**
++ * Usage beyond the hold and the free balance: owed, not collected (nano-USD, D1).
++ */
++ shortfall_nano_usd: string;
++ /**
++ * Hold amount returned to the account, integer nano-USD (D1).
++ */
++ released_nano_usd: string;
++ /**
++ * True when the caller supplied their own provider key; the retail charge is 0.
++ */
++ byok: boolean;
++ /**
++ * True when the hold was funded from usd_credit_sandbox (BILLING_CREDITS_SANDBOX), never paid credit.
++ */
++ sandbox: boolean;
++}
++
/** [email protected] (owner: billing) */
/**
* billing.admin-request@1: bodies of billing.ledger.admin on OpenVibe.Billing (operators). POST /api/v1/admin/freeze: { on, reason? } (unfreezing processes the provider deliveries stored meanwhile; allowed while frozen). POST /api/v1/admin/adjustments: { from, to, amount, reason, relates_to? } moves value between two accounts of one currency. POST /api/v1/purchases/settle: { provider, provider_ref, subject?, amount_cents, bits, intent_id?, test? } books a provider receipt. POST /api/v1/admin/provider-events/:id/reprocess, POST /api/v1/admin/sweep and the GETs (freeze, reconcile, provider-events, import-holds) take no body. Adjustments and settlements need an Idempotency-Key and are refused while frozen.
@@@ -164631,6 +164699,10 @@ export interface BillingCreditHold {
* Which metered service spends the credit (D9): ai, run, ... Defaults to ai.
*/
service?: string;
++ /**
++ * D10. A sandbox caller's hold draws on that person's sandbox credit for the project (account kind usd_credit_sandbox, owner subject:project), never on real Credits, and a real hold never draws on sandbox credit. Sandbox grants (billing.credit-sandbox-grant-request@1) land in that sandbox account. Optional; defaults to false.
++ */
++ sandbox?: boolean;
}
/** [email protected] (owner: billing) */
@@@ -164723,6 +164795,10 @@ export interface BillingCreditHoldCreateRequest {
* Which metered service spends the credit (D9): ai, run, ... Defaults to ai.
*/
service?: string;
++ /**
++ * D10. A sandbox caller's hold draws on that person's sandbox credit for the project (account kind usd_credit_sandbox, owner subject:project), never on real Credits, and a real hold never draws on sandbox credit. Sandbox grants (billing.credit-sandbox-grant-request@1) land in that sandbox account. Optional; defaults to false.
++ */
++ sandbox?: boolean;
}
/** [email protected] (owner: billing) */
@@@ -285250,7 +285326,7 @@ export interface TodayAgenda {
/** [email protected] (owner: billing) */
/**
-- * billing.credit-sandbox-grant-request@1: POST /internal/credits/sandbox/grants, synthetic credit for tests and staging. Billing answers only when BILLING_CREDITS_SANDBOX=1; the grant is a test transaction (D9).
++ * billing.credit-sandbox-grant-request@1: POST /internal/credits/sandbox/grants, synthetic credit for tests and staging. Billing answers only when BILLING_CREDITS_SANDBOX=1; the grant is a test transaction (D9). D10: the grant lands in the subject's sandbox credit account for the project (account kind usd_credit_sandbox, owner subject:project), and only a sandbox hold (billing.credit-hold-create-request@1 sandbox: true) draws on it; real Credits are never touched.
*/
export interface BillingCreditSandboxGrantRequest {
subject: SubjectRef;
ddiff --git a/manifests/services/billing.json b/manifests/services/billing.json
iindex 1807301b..08bc824f 100644
---- a/manifests/services/billing.json
++++ b/manifests/services/billing.json
@@@ -46,7 +46,8 @@
"billing.cashout.paid",
"billing.cashout.denied",
"billing.staff.action",
-- "billing.receipt.external"
++ "billing.receipt.external",
++ "billing.credit.settled"
],
"eventsConsumed": [],
"namespacesOwned": [
ddiff --git a/manifests/services/report.json b/manifests/services/report.json
iindex ab7cb879..90b8cba0 100644
---- a/manifests/services/report.json
++++ b/manifests/services/report.json
@@@ -23,7 +23,8 @@
"report.index_document.upserted"
],
"eventsConsumed": [
-- "ai.call.recorded"
++ "ai.call.recorded",
++ "billing.credit.settled"
],
"namespacesOwned": [
"report.*"
ddiff --git a/package.json b/package.json
iindex 7e9e2e90..47bd71cc 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.286.0",
++ "version": "0.287.0",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"main": "index.js",
"types": "generated/typescript/index.d.ts",