A small public HTTP API that lists ready-made Mascotbot avatars (RiveDocumentation Index
Fetch the complete documentation index at: https://docs.mascot.bot/llms.txt
Use this file to discover all available pages before exploring further.
.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
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.<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:
id | use | artboard | stateMachine |
|---|---|---|---|
notion-guy | standalone hosting | Character | InLesson |
notion-guy-widget | embeddable widget | Widget | mascotStateMachine |
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": "..." }:
| Status | code | Meaning |
|---|---|---|
| 404 | avatar_not_found | no such id |
| 404 | version_not_found | id exists, that version doesn’t |
| 404 | avatar_binary_missing | manifest entry exists but the binary is gone — report it |
| 404 | not_found | unknown route |
| 405 | method_not_allowed | non-GET/HEAD on a read route |
| 500 | manifest_corrupt | server-side; surface a friendly retry |
Quick reference
| List | GET /v1/avatars — public, 60 s cache |
| Download latest | GET /v1/avatars/<id>/download |
| Download pinned | GET /v1/avatars/<id>/download?version=x.y.z — immutable |
| Base URL | https://license.mascot.bot |
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>.