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.