PUT /v1/actions/registry/blobs/{digest}
Stores a hosted tool's archive under its sha256, before the pack that names it is published (platformPublishPack). The body is the archive's bytes; Content-Length is required and at most 67108864 (64 MiB), and is checked before the body is read. The edge hashes the body as it streams it to storage: a body whose sha256 is not digest, or whose length is not Content-Length, is deleted and refused with 422 pack_invalid. No Content-Length is 400 invalid_request. A digest already stored answers 200 and stores nothing, so a retry is safe. Needs the actions.tools flag and the scope actions:tools:publish, which * and actions:* never grant; in the beta only B3's organizations may upload.

Authentication

Bearer Token (b3os_sk_ API key or b3os_pat_ token)

Path Parameters

digest string required path
sha256: and the lowercase hex sha256 of the archive, as tool.bundle.archive.sha256 names it.
Pattern ^sha256:[0-9a-f]{64}$
Example: "sha256:edb7bec9998ac7cd5a6aea7700bd35f333a3b4d4edb11e01ca92226d0e52243d"

Request Body required

application/octet-stream
string (binary)

Responses

200 The archive was already stored; nothing was written.
application/json
object string REQUIRED
Values registry_blob
digest string REQUIRED
bytes integer REQUIRED
created_at string (date-time) REQUIRED
201 The archive was stored.
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).
404 The object does not exist or belongs to another project.
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 PUT 'https://beta-api.b3os.org/v1/actions/registry/blobs/sha256:edb7bec9998ac7cd5a6aea7700bd35f333a3b4d4edb11e01ca92226d0e52243d' \  -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/blobs/sha256:edb7bec9998ac7cd5a6aea7700bd35f333a3b4d4edb11e01ca92226d0e52243d', {  method: 'PUT',  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.put('https://beta-api.b3os.org/v1/actions/registry/blobs/sha256:edb7bec9998ac7cd5a6aea7700bd35f333a3b4d4edb11e01ca92226d0e52243d', headers=headers, json="string")print(response.json())
200 Response
{  "object": "registry_blob",  "digest": "sha256:edb7bec9998ac7cd5a6aea7700bd35f333a3b4d4edb11e01ca92226d0e52243d",  "bytes": 10240,  "created_at": "2026-11-11T22:00:00.000Z"}
Ask a question... ⌘I