.riv
files) and serves their bytes plus per-version metadata. It is not an npm
registry — just a manifest + binaries. Read access is public; no key
required.
The intended flow: fetch the .riv once, self-host it from your own
CDN/origin, and drive Rive using the per-version metadata.
- Base URL:
https://license.mascot.bot
Concepts
- Avatar — a mascot identified by an
id(e.g.notion-guy), with one or more versions. - Version — an immutable
(id, version)pair whereversionis semverx.y.z. The bytes for a published version never change; publishers ship updates as new versions. Old versions are retained. latest— the highest semver of an avatar. Whatdownloadserves when no version is requested.- Metadata — a freeform JSON object attached to each version, returned
verbatim. There is no fixed schema — different
.rivfiles expose different artboards, state machines, and inputs, so the shape is whatever the publisher set. Mascotbot’s own mascots mirror anartboard/stateMachine/customizationshape; treat any field as optional.
List avatars
Cache-Control: public, max-age=60; an
empty pool is a valid 200 with "avatars": [].
Download a .riv
200→ the raw.riv(application/octet-stream,Content-Disposition: attachment).X-Avatar-Version: <served version>is set on every response.- A pinned
?version=response isCache-Control: public, max-age=31536000, immutable— safe to cache forever. The unversionedlatestresponse ismax-age=300(it can move when a new version ships). HEADis supported.
Recommended integration pattern
1
Fetch the manifest once
Poll on your own cadence (it changes only when a new version ships).
2
Pick the avatar + version
Pin a
version for reproducibility, or follow latest for auto-updates.3
Download the .riv and self-host it
Store it on your own CDN/origin keyed by
id@version (or by sha256).
Pinned versions are immutable — you never need to re-fetch. Do not
serve license.mascot.bot to end users on every page load.4
Drive Rive from the metadata
The freeform
metadata tells your renderer how to wire the file —
artboard, stateMachine, available inputs, customization controls.<Mascot src={…}> and reading md.artboard / md.stateMachine from
the manifest — see Rive co-existence for the
input-ownership contract.
Variants — same character, different .riv
Some characters ship as multiple avatars because the standalone and
embeddable-widget builds are genuinely different files with different Rive
wiring. They are cross-linked in metadata and you pick the one matching how
you render it:
The metadata on each one carries the full customization schema for that
variant; the API doesn’t merge them.
Versioning
A published(id, version) is immutable — to change an avatar, the
publisher ships a new version, and clients that pinned the old one keep
working unchanged. latest is the highest semver; clients that follow it get
updates automatically, clients that pin a version are stable. Pinned
download URLs are immutable and long-cached, so they are safe to bake into
your own CDN keyed by id@version or sha256.
Errors
JSON{ "code": "...", "message": "..." }:
Quick reference
Next
Ready-made mascots
The catalog of characters available through this API.
Rive co-existence
The input-ownership contract once a
.riv is rendered.React SDK intro
Wiring a downloaded
.riv into <Mascot>.