/api/v2/asset/* endpoints cover everything about an asset’s lifecycle after it exists: listing, metadata and privacy, share links, versions, access requests, and analytics.
Creating an asset (the file upload itself) happens against the artifacts service directly, authenticated with a per-user access token you mint over REST. The full publish flow is three steps.
1
Mint an access token
Call Generate Asset Access Token with your regular API key:The response contains the plaintext
accessToken (valid ~30 days), its non-secret prefix, and expiresAt. The token is shown only in this response — store it securely; it cannot be retrieved again.2
Upload your files to the artifacts service
POST a multipart request to the artifacts service with the token as a Bearer credential. Send a metadata part (a JSON string) plus either repeated files parts or a single file part containing a zip of the folder:metadatafields:identifier(required, workspace-unique),description(required), and optionaltype(website|storage),entryPoint,privacy(only_me|workspace|public),status(published|unpublished).- Each
filespart’s filename is its path within the asset, so a multi-file site can carry paths likeassets/app.js. - The service enforces a 30 MB total per upload, answers 409 when the identifier is already taken, and 400 on validation failures.
- The response is the created asset, including its
uuid(the id every/api/v2/asset/*endpoint takes) and its URLs.
3
Manage it over REST
Everything else is plain See List Assets for discovery, the share endpoints for email/domain-gated links, and the version endpoints for rollbacks.
api_key REST. For example, make it public and check how it is doing:Token semantics you must handle
One access token is active per user and workspace. Minting a new one rotates out the previous token — and other Octave surfaces acting as the same user (the in-app asset gallery, MCP tools) can rotate yours at any time. Treat a401 from the artifacts service as “mint again and retry once”: call Generate Asset Access Token and repeat the request with the fresh token. With that retry rule the flow is robust; without it you will see intermittent 401s that look random. If the integration can run under a dedicated service user’s API key rather than a person’s, its token churn also stops competing with that person’s own sessions.
Notes
- Skills are managed assets. Skill folders appear in asset listings with
type: "skill", but their files must be edited through the Skill endpoints so the searchable skill registry stays in sync — the generic asset surface refuses to delete them or roll their files back. - Publishing and privacy are independent.
status: "published"does not make an asset public; setprivacy: "public"for that. Non-public assets are reachable for you via the tokenizedpreviewUrlon the asset.