Documentation

Publication pipeline

Submit bytes and metadata; the hosted service validates media, hashes content, writes immutable storage, indexes the version, and returns canonical URLs.

Multipart file upload

const metadata = {
  schema: 'aso/object/v0.1', id: 'studio-chair', version: '1.0.0',
  name: 'Studio chair', description: 'Portable chair mesh', tags: ['furniture'],
  createdAt: new Date().toISOString(), provenance: { adapter: 'my-adapter@1' },
  generator: { provider: 'my-provider', model: 'model-name' },
  representation: { id: 'primary', type: 'mesh', format: 'glb', mediaType: 'model/gltf-binary' }
};
const form = new FormData();
form.set('metadata', JSON.stringify(metadata));
form.set('asset', file);
await fetch('/api/v1/publications', { method: 'POST', headers: { authorization: `Bearer ${firebaseIdToken}` }, body: form });

HTTPS URL source

POST JSON shaped as { metadata, sourceUrl }. Exactly one of sourceUrl or stagedKey is accepted. Sources must be public HTTPS, do not redirect, and are bounded to 100 MiB and 30 seconds.

Auth and errors

Use a Firebase ID token as Bearer auth or a provisioned x-api-key. Expect structured 400, 401, 409, 413, 422, 429, 500, and 503 responses. A 409 means that immutable identity/version already exists.