POST /v1/actions/registry/packs
Uploads a pack bundle: a gzip-compressed tar with `b3pack.json` at its root plus the files it references (at most 2,000 files and 16 MiB once decompressed; other organizations are refused before the upload is read). The manifest's `signature` must verify: `sig` is Ed25519 over `b3pack-sig-v1\n<pack>\n<version>\n<contentHash>` with the publisher key `kid`, and `contentHash` covers the bundle with the signature removed. Versions are immutable. In the beta only first-party publishers (`io.b3os`) may publish.

Authentication

Bearer Token (b3os_sk_ API key or b3os_pat_ token) API Key (cookie: __Host-b3os_session)

Request Body required

application/gzip
string (binary)

Responses

201 The published version.
application/json
object string REQUIRED
Enum: registry_pack_version
pack string REQUIRED
version string REQUIRED
content_hash string REQUIRED
signature object REQUIRED
alg string REQUIRED
Enum: ed25519
kid string REQUIRED
sig string REQUIRED
publisher object REQUIRED
id string REQUIRED
name string REQUIRED
verified boolean REQUIRED
size_bytes integer REQUIRED
published_at string (date-time) REQUIRED
yanked boolean REQUIRED
download_url string (uri) REQUIRED
400 The request failed validation (`invalid_request`, `invalid_url`).
401 Missing, malformed, expired or revoked credentials (`unauthorized`).
403 Only first-party publishers may publish in the beta (`publisher_not_allowed`).
409 The version is already published (`pack_version_exists`).
413 The request body exceeds this operation's limit.
415 The Content-Type is not accepted by this operation.
422 The manifest or signature is invalid (`pack_invalid`, `pack_signature_invalid`).
429 A rate, concurrency or quota limit applies (`rate_limited`, `concurrency_limited`, `quota_exceeded`).
500 Something failed inside B3OS (`internal`). Retry with backoff.
503 The node or the product is not available right now (`node_unavailable`, `product_unavailable`, `capacity_unavailable`).
curl -X POST 'https://beta-api.b3os.org/v1/actions/registry/packs' \  -H 'Authorization: Bearer YOUR_API_TOKEN' \  -H 'Content-Type: application/json' \  -d '"string"'
const response = await fetch('https://beta-api.b3os.org/v1/actions/registry/packs', {  method: 'POST',  headers: {      "Authorization": "Bearer YOUR_API_TOKEN",      "Content-Type": "application/json"  },  body: JSON.stringify("string")});const data = await response.json();console.log(data);
import requestsheaders = {    'Authorization': 'Bearer YOUR_API_TOKEN'}response = requests.post('https://beta-api.b3os.org/v1/actions/registry/packs', headers=headers, json="string")print(response.json())
201 Response
{  "object": "registry_pack_version",  "pack": "io.b3os/github",  "version": "1.2.0",  "content_hash": "sha256:9b0d1c6f3e4a5b2c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c",  "signature": {    "alg": "ed25519",    "kid": "io.b3os#release-2026",    "sig": "YjNvcy1leGFtcGxlLXNpZ25hdHVyZWIzb3MtZXhhbXBsZS1zaWduYXR1cmViM29zLWV4YW1wbGUtc2lnbmF0dQ"  },  "publisher": {    "id": "io.b3os",    "name": "B3OS",    "verified": true  },  "size_bytes": 48211,  "published_at": "2026-10-22T16:00:00.000Z",  "yanked": false,  "download_url": "https://beta-api.b3os.org/v1/actions/registry/packs/io.b3os/github/versions/1.2.0/download"}
Ask a question... ⌘I