---
title: "ai.offer-pool@1 · OpenVibe.Services"
canonical: "https://openvibe.services/docs/contracts/ai.offer-pool"
updated: null
---

# ai.offer-pool@1 · OpenVibe.Services

HTML: [ai.offer-pool@1 · OpenVibe.Services](https://openvibe.services/docs/contracts/ai.offer-pool)

# AiOfferPool `ai.offer-pool@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: ai
- Visibility: first-party
- Status: active
- Compatibility: backward
- Schema: [`https://openvibe.network/contracts/ai/offer-pool.v1.json`](/docs/contracts/ai.offer-pool.json)

ai.offer-pool@1 (the pooled machines design, 2026-11-06): the \`pool\` part of a community AI offer (ai.offer@1) served by several of one owner's machines together (bot.machine-pool@1). Network adds it from its own approved pool record, never from what a machine reports: the offer is the head's, \`head\` equals the offer's \`machine\_id\`, and while a machine is in a pool it advertises no offer of its own. It names machines only; no address, key or certificate reaches AI. AI routes the request to the head, runs the same verification as for one machine (canaries, the model fingerprint, spot re-runs) on the pool's answers, keys that verification on this exact membership (another member or head is a new, unverified pool), keeps a pool that is new or failed to the free tier only, and labels its answers "Community pool (N machines)".

## Fields

| Field | Type | Required | Description | Constraints |
| --- | --- | --- | --- | --- |
| `machines` | array of string | yes | The pool's machines, head included (Bot device ids), two to eight. | - `minItems 2`<br>- `maxItems 8`<br>- `unique items`<br>- `items: pattern ^dev_[0-9A-HJKMNP-TV-Z]{26}$` |
| `head` | string | yes | The machine that answers: one of \`machines\`, and the offer's own \`machine\_id\`. | - `pattern ^dev_[0-9A-HJKMNP-TV-Z]{26}$` |

## Examples

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

 Valid: three-machines

~~~~
{
  "machines": [
    "dev_01J8Z3Q4R5S6T7V8W9X0Y1Z2D1",
    "dev_01J8Z3Q4R5S6T7V8W9X0Y1Z2D2",
    "dev_01J8Z3Q4R5S6T7V8W9X0Y1Z2D3"
  ],
  "head": "dev_01J8Z3Q4R5S6T7V8W9X0Y1Z2D2"
}
~~~~

Valid: two-machines

~~~~
{
  "machines": [
    "dev_01J8Z3Q4R5S6T7V8W9X0Y1Z2D1",
    "dev_01J8Z3Q4R5S6T7V8W9X0Y1Z2D2"
  ],
  "head": "dev_01J8Z3Q4R5S6T7V8W9X0Y1Z2D1"
}
~~~~

Rejected: address-field

~~~~
{
  "machines": [
    "dev_01J8Z3Q4R5S6T7V8W9X0Y1Z2D1",
    "dev_01J8Z3Q4R5S6T7V8W9X0Y1Z2D2"
  ],
  "head": "dev_01J8Z3Q4R5S6T7V8W9X0Y1Z2D1",
  "address": "192.168.1.20/24"
}
~~~~

Rejected: certificate-field

~~~~
{
  "machines": [
    "dev_01J8Z3Q4R5S6T7V8W9X0Y1Z2D1",
    "dev_01J8Z3Q4R5S6T7V8W9X0Y1Z2D2"
  ],
  "head": "dev_01J8Z3Q4R5S6T7V8W9X0Y1Z2D1",
  "certificates": [
    "-----BEGIN CERTIFICATE-----\nMIIBRDCB96ADAgECAhQ1F6qS8nQmfA4Z1EQWbuTK6c+/CDAFBgMrZXAwGDEWMBQG\nA1UEAwwNT3BlblZpYmUtcG9vbDAeFw0yNjExMDcwMjE1NThaFw0zNjExMDQwMjE1\nNThaMBgxFjAUBgNVBAMMDU9wZW5WaWJlLXBvb2wwKjAFBgMrZXADIQBzzRaEd6ZR\nqYbsbYK3W8CCJPIAbsNTlIXZYgPEC9yf76NTMFEwHQYDVR0OBBYEFPiGTnP9vRST\nUlo0W1Eh0xcOxA49MB8GA1UdIwQYMBaAFPiGTnP9vRSTUlo0W1Eh0xcOxA49MA8G\nA1UdEwEB/wQFMAMBAf8wBQYDK2VwA0EAOlCHoX3ONMZYTHx4GSAlxP4EQase+99L\nGykZvgPSVDs2alKLXW5fBxvn7OcEJ3g/EMmk9iZ+AL+CmLxdcYBLCw==\n-----END CERTIFICATE-----\n"
  ]
}
~~~~

Rejected: duplicate-member

~~~~
{
  "machines": [
    "dev_01J8Z3Q4R5S6T7V8W9X0Y1Z2D1",
    "dev_01J8Z3Q4R5S6T7V8W9X0Y1Z2D1"
  ],
  "head": "dev_01J8Z3Q4R5S6T7V8W9X0Y1Z2D1"
}
~~~~

Rejected: missing-head

~~~~
{
  "machines": [
    "dev_01J8Z3Q4R5S6T7V8W9X0Y1Z2D1",
    "dev_01J8Z3Q4R5S6T7V8W9X0Y1Z2D2"
  ]
}
~~~~

Rejected: one-machine

~~~~
{
  "machines": [
    "dev_01J8Z3Q4R5S6T7V8W9X0Y1Z2D1"
  ],
  "head": "dev_01J8Z3Q4R5S6T7V8W9X0Y1Z2D1"
}
~~~~

## Validate

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