Publishing a volume uses a two-phase upload lifecycle. You first create an upload intent to declare your target release and get back opaque upload instructions. You then PUT theDocumentation Index
Fetch the complete documentation index at: https://agentvolumes.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
.tar.gz archive bytes to the URL in those instructions. Finally, you call the finalize endpoint so the bibliotheca can validate the archive, verify the digest, and make the release available. The bibliotheca derives the target volume identity from the route — not from the request body — so you cannot override the package name by sending a different name in the body.
Endpoints
Upload lifecycle
Create an upload intent
Send a The
POST request to the volume route with the target version and upload constraints. The bibliotheca returns an uploadId, expiration timestamp, and opaque upload instructions.201 Created response:Upload the archive bytes
PUT the
.tar.gz bytes to upload.url using the method in upload.method (default PUT). Send any headers the upload instruction includes. Do not infer release identity or authorization from the upload URL itself — it is an opaque transfer target.Finalize the upload
Call the finalize endpoint with the The
uploadId from step 1. The bibliotheca validates the archive, computes the normalized-file-tree integrity value, and makes the release available.201 Created response includes the uploadId, the published release metadata, and a detailUrl for the
exact-release metadata endpoint:Upload intent request fields
SemVer version string for the release you are publishing. Must not already exist as a
lifecycle-marked version.
Must be
application/gzip. This is the only portable v0.1 hosted archive media type.Optional pre-declared
sha256:<hex> digest of the archive bytes. When provided, the bibliotheca verifies the uploaded bytes match this digest during finalize.Optional declared byte length of the archive. When provided, the bibliotheca verifies the uploaded
size matches.
Optional idempotency key for this intent creation. You can also pass this as the
Idempotency-Key
header. If both are present, they must match exactly.The http-put upload profile
Every write-capable v0.1 bibliotheca that supports release uploads must implement the http-put upload profile. When upload.instructionType is "http-put":
upload.urlis the opaque byte-transfer targetupload.methodis"PUT"when present; default toPUTwhen omittedupload.headerscontains any headers you must include on the PUT request
Upload intent lifecycle states
| State | Meaning |
|---|---|
pending-upload | Intent created; bytes not yet received |
uploading | Bytes transfer in progress |
uploaded | Bytes received; ready to finalize |
expired | Intent expired before finalization |
failed | Upload attempt failed |
Archive format requirements
Your.tar.gz archive must follow the v0.1 hosted archive transport profile:
- The payload is gzip-compressed tar content
- Archive entries are interpreted relative to one volume root
- Absolute paths,
.or..path segments, duplicate normalized paths, and entries that normalize to.are invalid - Only regular files are permitted — symlinks, hardlinks, device nodes, sockets, and other non-regular entries are invalid
- Archive timestamps, ownership, extended attributes, and platform-specific mode bits (other than the executable bit) are not part of the release subject
What the bibliotheca validates at finalize
During finalize, the bibliotheca:- Verifies the uploaded bytes match any declared digest and size constraints
- Validates the archive against the transport profile
- Parses and validates the
volume.tomlmanifest - Confirms the manifest identity matches the route-derived target (name and version)
- Checks that the version is not already lifecycle-marked (no version reuse)
- Confirms the caller remains authorized
- Computes the authoritative normalized-file-tree
integrityvalue - May check for permission escalation; clients must fail before submission when components declare broader permissions than the parent volume, and bibliothecas must block affected artifacts when escalation is discovered
Version immutability
Once a version number has been published, yanked, tombstoned, blocked, or otherwise lifecycle-marked, it cannot be reused for different release content. Attempting to publish the same version again returns a409 Conflict with the version-conflict problem type.
Unpublishing a release
To unpublish a published release, use theDELETE endpoint. Unpublished version numbers should be tombstoned when local policy permits unpublishing. Tombstoned versions preserve the version identity but are not installable in the portable v0.1 baseline.
202 Accepted. The version identity is preserved; its lifecycle state changes according to bibliotheca policy, with tombstoning as the portable unpublish behavior described by the specification.
Idempotency
You can make upload intent creation and finalize requests idempotent by passing anIdempotency-Key header. If a request with the same key has already been processed successfully, the bibliotheca returns the original response rather than creating a duplicate.