API
Render new scenes of a locked mascot from your own scripts, CI jobs and AI agents. One key, one endpoint, and every image is checked against the locked identity before you get it — the same guarantee the app gives you.
1. Get a key
In the app, open Settings → API keys, pick the mascot the key may render, and generate it. The key is shown once; copy it then. Each key renders exactly one mascot, so a key that leaks cannot touch the rest of your library. Revoke it any time from the same screen.
Send the key on every request in an Authorization: Bearer header, or as x-api-key.
2. Render a scene
One request, one image. The call returns when the render is done and has been checked, usually within a minute.
curl -X POST https://app.mascotline.dev/api/v1/render \
-H "Authorization: Bearer mr_your_key" \
-H "Content-Type: application/json" \
-d '{
"characterId": "the mascot this key is scoped to",
"sceneText": "waving from a hot-air balloon over a city at sunrise",
"clientRequestId": "any id you mint, unique per scene"
}'
The answer describes the render:
{
"id": "…",
"status": "gated",
"gateVerdict": "pass",
"gateReasonNote": null,
"storagePath": "renders/….png",
"isDuplicateOf": null,
"sceneText": "…",
"createdAt": "…"
}
- The image is at
https://app.mascotline.dev/api/storage/followed bystoragePath. The link needs no key. - gateVerdict is
passwhen the scene matches the locked identity. Onfail,gateReasonNotesays what drifted. Every call is one image and one check at the stated price: read the findings, adjust, and call again as often as you like — a second try costs about the same as the first, and there is no cap. - Approving a render for reuse as a reference happens in the app, not through the key.
3. Never pay twice
clientRequestId is yours to mint, and it is the safety net: send the same id again — after a timeout, a crash, a retry loop — and you get the same render back, with no new charge. If the response never reached you, fetch it instead of rendering again:
curl "https://app.mascotline.dev/api/v1/render?clientRequestId=the-id-you-sent" \
-H "Authorization: Bearer mr_your_key"
A scene identical to one you already rendered for the same mascot is also answered from the existing render; isDuplicateOf names it, and nothing is charged.
4. Credits
A credit is one cent. Each new image is charged to the account that owns the key — about 10 credits — and the exact charge comes back with the result, so an agent can try, look, and try again. When the balance is empty the call answers 402 and nothing is rendered; top up in the app under Credits.
When a call is refused
401 — no key, or a key we do not recognise
Check the header. A revoked key answers 403.
403 — this key cannot render that mascot
Keys are scoped to one mascot. Generate a key for the mascot you meant, or pass the right characterId.
400 — the mascot is not locked yet
Finish the lock step in the app first; only a locked identity can be rendered against.
402 — out of credits
Top up under Credits and retry with the same clientRequestId.
429 — this key is over 30 calls a minute
Wait the seconds given in Retry-After, then send the same request again.
404 — nothing rendered under that clientRequestId
The lookup only knows ids that reached us. Render, then look up.
5. Connect an AI agent
Agents that speak MCP — Claude Code, Cursor, Claude Desktop and others — connect to one URL with the same key and get your mascots as tools: list_mascots, get_mascot, list_renders, render_scene, get_render, export_render (any size, PNG, WebP or JPEG, transparent background — free), upscale_render (AI ×2/×4, charged in credits), vectorize_render (SVG of flat art — free), and with the account scope also explore_mascot, lock_mascot, list_drafts and project_setup. Nothing to install.
Claude Code, one command:
claude mcp add --transport http mascotline https://app.mascotline.dev/api/mcp \
--header "Authorization: Bearer mr_your_key"
Cursor, Claude Desktop and most others take the same thing as a config entry:
{
"mcpServers": {
"mascotline": {
"url": "https://app.mascotline.dev/api/mcp",
"headers": { "Authorization": "Bearer mr_your_key" }
}
}
}
In the app, a newly issued key comes with Add to Cursor and Add to VS Code buttons that carry the key for you, and the Claude Code command ready to copy.
Claude Desktop, claude.ai and ChatGPT take no key at all: add a custom connector with the URL https://app.mascotline.dev/api/mcp, sign in to Mascotline when asked, pick the mascot it may render, and approve. That approval creates a key named after the app under Settings → API keys; revoke it there to disconnect.
6. Working inside a project
An assistant that builds your product should carry the mascot with the project, not ask you to pick one on the web every time. Two things make that work: the account scope, and a small folder in the repo.
Account scope. When you approve a connector (or issue a key) choose All mascots in this account. The assistant can then list your mascots, read a mascot's locked identity with its pictures, render any of them, and create a new one — in chat, with your say-so at each paid step. A single-mascot key stays right for a CI job or a third party.
The folder. A project that uses a mascot keeps .mascotline/mascotline.json, committed to the repo. It holds ids and roles only, never a key:
{
"version": 1,
"account": "app.mascotline.dev",
"mascots": [
{ "id": "…", "name": "Inky", "role": "primary" }
],
"defaults": { "mascot": "…" }
}
The connector's own instructions teach the assistant the routine, so you do not have to:
- Opening a project: read the file, confirm each mascot with
get_mascot, use those mascots for any image work. - No file yet: list what the account has and offer one, or offer to create one —
explore_mascotshows four candidate looks as images,lock_mascotlocks the one you choose and hands back the file to write.project_setupwrites the file for mascots you already have. - Money: exploring, locking and rendering each say what they cost, and the assistant is told never to spend without you agreeing. Reads are free. Anything it creates is in the app too: drafts under In progress, keys under Settings → API keys.
The folder is yours to grow: scene presets, a brand palette, cached approved renders — whatever your build needs beside the ids.
Then just ask for a scene. render_scene answers with the image itself and the check verdict, so the assistant can look at what it made; it takes the same clientRequestId safety net as the plain call.
What's new for agents
- 1.33.0 — 2026-10-08. Workspaces are shared: invite people, give CI a key, pool credits. A repo's project belongs to a workspace, and a call from outside it is answered with how to ask for access, never a copy.
- 1.32.2 — 2026-10-07. The colour check reads the mascot's own colours: a darker item of a similar hue — headphones the scene names, worn beside the eye rings — no longer fails a picture whose eye rings are the right colour. An outlined sticker with a part held at an angle, like a pencil, now measures as outlined.
- 1.32.1 — 2026-10-07. Asking again for a scene that already passed, in the same words, gives that picture back at no cost — now said where you ask. For a second, independent picture of the same scene, give it a new seed or change the words.
- 1.32.0 — 2026-10-07. What the mascot wears follows one stated rule: anything your scene names — held, stood beside, or worn, like a necktie, a hat or a scarf — belongs to the scene and never fails the identity check, while something added that the scene does not name still does. The try count is now counted per use, so a second try reads 2.
- 1.31.0 — 2026-10-06. Planning where the mascot goes reads each screen's whole description, not just its name: a screen called "Progress" no longer gets a loading picture. Three more moments are proposed — encouragement after a hard or short day, a calm ordinary day, and a nudge toward the next step — and the picture you already made for that exact moment is offered first, at no cost.
- 1.30.0 — 2026-10-05. A project with no mascot yet is no longer told it lacks the brand or layout file when that file simply was not shown: the answer says which files were not handed in. Listing mascots accepts those files too.
- 1.29.0 — 2026-10-05. Checking an explainer brief takes the product's name as well, so every step that works on a project can be given its name instead of its id. A name that has no project yet is answered with how to create it, free, and the check still runs.
- 1.28.0 — 2026-10-05. A project's name can stand in for its id: composing an explainer with the product's name finds or creates that project (free) and files the explainer under it, and listing explainers or mascots by name shows that project's.
- 1.27.0 — 2026-10-05. A project that has no mascot set up yet is answered with what setting one up would do, its price and the next step, plus the mascots you already have and the project files it lacks. You are charged nothing until you say yes. Setting up a project by name works before any mascot is chosen.
- 1.26.4 — 2026-09-29. A picture drawn before the background remover is cut by it on its first transparent export, once, so its edge carries none of the old ground and an outline for a white ground closes round its card at every size. That one cut costs about a credit and the export says so; every later export of it, and every picture drawn since, stays free.
- 1.26.3 — 2026-09-29.
export_renderoutlineForcloses the ring round small accent parts in large files too: at 1024 and 2048 px each confetti dot's outline on a coloured ground broke into arcs where a thin pale rim sat round the dot, and the export failed on the milestone yellow #FFC83D; now every dot and sparkle gets one closed outline at every export size. Files on a white ground are unchanged. - 1.26.2 — 2026-09-29. The identity check reads every new picture part by part against the locked character — body, head, each marking and colour, every prop it always carries — and names any part that changed or went missing. A part left see-through where the character is solid now counts as missing, the same picture always gets the same verdict, and an expression is never a change. The check costs slightly more per try, and the quoted price includes it.
- 1.26.1 — 2026-09-28.
export_renderoutlineForrings small accent parts again: on a coloured ground, every confetti dot and sparkle that fades there gets its own closed outline at every export size, as in 1.25.5 — on the milestone yellow #FFC83D at 144 and 216 px, 1.26.0 ringed only the dots big enough to have a flat middle, and the export failed. A small dot or sparkle is ringed, never filled: its middle keeps its own colour. A glow or halo still gets no outline, and a white card still gets no dark dot inside it. - 1.26.0 — 2026-09-28. A sticker for a centred slot can be centred on the character's body: its props extend to one side and the other side gets matching empty room, so a moon or a card beside the character no longer pushes it off centre. The default still centres everything, file for file, for slots aligned to one side. Give only a height and the width follows, so the character keeps its size. Every export and placement check says how far the body sits from the file's centre, and a sticker can be mirrored so its props face the other way.
- 1.25.9 — 2026-09-28. A sticker is cut from its ground once, when it is drawn, by a dedicated background remover: a soft edge, no pale band of the old ground round it, and ground enclosed by the character removed too, while white parts such as a card stay whole. Transparent exports, placement checks and explainer vignettes all use that cut, and the cut is priced with the render.
- 1.25.8 — 2026-09-28. Every picture is asked for in the shape and size it is for, and comes back checked against it. A render answers a seed only when its image model takes one —
seedis null otherwise, and the same scene is then drawn afresh each time. - 1.25.7 — 2026-09-28.
check_placementandexport_renderoutlineForno longer take the pale halo or glow a picture leaves round a part for a part of its own: at every export size from 32 to 2048 px a halo round the body or a glow beside a confetti dot is measured with the part it surrounds, so a sticker is no longer failed for a near-white rim nobody can see. - 1.25.6 — 2026-09-28. An outline rings only the part that needs it: it no longer leaves a dark dot inside a white card (it did at 64, 96 and 144 px), no longer rings a glow beside a confetti dot (at 420 px), and stops where the card meets the character instead of running up the character's side — the small dark 'ears' at 64 px and the nub at 192 and 280 px are gone. A card whose outline stops against the character is measured with that shared edge, so the file still reads pass.
- 1.25.5 — 2026-09-28. An outline along a straight edge is one straight line: where a card's edge falls between two pixel rows, the outline no longer jogs up and down a row along it (at 264, 216 and 176 px it did in 1.25.4). The outline is at least 2 px wide, so it always has one solid row, and it always fits inside the file, so a small export no longer loses it at the file's edge;
placement.holdsDownTofollows (a 420 px file holds down to 210). - 1.25.4 — 2026-09-27. An outline is one continuous line: along a straight edge — a card's bottom —
export_renderoutlineFordraws it solid at every export size from 32 to 2048 px, where at 420 px it had come out pale and dotted. The measurement reads each part's edge as it looks on the ground, a see-through pixel at its real strength, and an outline broken by pale runs or gaps no longer passes. - 1.25.3 — 2026-09-27. An outlined sticker is outlined only on the part that needs it at every export size: at 264 px a glow beside a confetti dot is no longer taken for the white card and stroked, and a small part's soft rim — a confetti dot a few pixels across — is measured as that part, not listed as a failing part of its own.
- 1.25.2 — 2026-09-27.
export_renderoutlineForholds at every export size: a card whose own edge is a dark rim is outlined in a 600, 400 or 96 px file too, and a part ringed by its outline is measured by that outline, so an outlined file no longer reads as failing at sizes other than 1024. The outline is drawn for the file's own size;placement.holdsDownTosays how small the file may be shown (256 px for a 1024 file) — for a smaller place, export again at that size, free, and its outline is drawn for it. - 1.25.1 — 2026-09-27.
check_placementandexport_renderoutlineForfind the part itself, not its rim. The thin light or dark rim a picture keeps from the ground it was drawn on, and the blend where two colours meet, count as the part they border: a white card is reported where it is ("the lower middle") and only the card gets the outline — the body, confetti and sparkles are left as drawn, and a card whose own edge was a dark rim now gets its outline too. A part drawn in the character's earlier colours (a render from before a re-tint) is named for what it is — "body (earlier colour #4F2AC0; current palette vivid violet #7C3AED)" — never a prop. The shadow fix is measured for every part: a white card on a white page reaches 3:1 at about half opacity, and the note says why. - 1.25.0 — 2026-09-27. A sticker is checked against the place it goes.
check_placementmeasures a cut-out on the colour of its card, page or banner — by hex, or by your brand's colour role or token — part by part along its outline, each with its contrast ratio; a part under 3:1 fails, so a white prop on a white card is caught before it ships. For a ground that fails it proposes the fixes cheapest first, each with the ratio it reaches: an outline on the failing part in the character's own colours (applied and measured), a soft shadow, and a backdrop — and says plainly when no backdrop can separate every part.export_renderwithoutlineFordraws that outline at the file's own size. Free. Mascots now have a world — where they live, the motifs that belong around them, the settings they never appear in — drafted from the description and locked withlock_world;plan_mascot_useproposes backdrops only from that world, fitted to the moment, and a scene set outside it is refused before anything is drawn. - 1.24.0 — 2026-09-27. Scenes in layers.
compose_scenebuilds a picture from one pose of the mascot and small details — hearts, stars, sparkles, dots, an arrow, a moon, a speech bubble, a word — each placed, sized, turned and faded by number in exact colours, over a plain, gradient or transparent ground with a soft shadow. It costs one credit per new picture and the same spec again is free, so a detail is changed by editing one field for a cent, never by drawing the character again; without a character it draws an object.render_scenetakesprops— pictures of the objects the scene names — so the character holds exactly that object in every scene, andseed: every render answers the seed it used, to ask for the same picture again.edit_renderchanges one thing on a render; given the area it belongs in, everything outside stays exactly as it was. About one image's price per change. - 1.23.3 — 2026-09-27.
retint_mascotmeasures the new colours instead of trusting the eye: the body and the accent parts of each new canonical image must come out in the palette's colours, and an image still in the old ones fails with the colour it measures — a re-colour that did not happen is never passed. A flat character is re-coloured exactly in its own drawing, with clean edges, and is charged only for rewriting its description, not for two images. A render on a plain ground for a mascot with a palette is measured the same way.export_renderwith transparent keeps a white prop — a card, a page — whole on a near-white ground. Only room-for-copy words ("room for a headline on the left third", "calm lower half") or the plain areas you pass keep part of a picture plain: where the character or a prop sits or points — "an arrow pointing to the right" — is the scene, never a demand for room. - 1.23.2 — 2026-09-27.
vectorize_renderdraws closer to the picture: small coloured details — pale cheeks, a tail tip in another colour — stay in the SVG, and a character on a transparent cut-out no longer comes back as one flat silhouette. Files are several times smaller with far fewer shapes, and every colour stays within the cap you ask for. Same inputs, same result, still free. - 1.23.1 — 2026-09-26.
plan_mascot_useoffers a render you already have only when it leaves the place plain where the layout or the scene asks for room: a picture made before the place asked is measured there first, and one that falls short is not offered — the note says which area and how plain it is, so you render a new one. Still free. - 1.23.0 — 2026-09-26. Where a picture must stay plain is measured, not judged. Say it in the scene — "room for a headline on the left third", "calm lower half", "character in the right third" — or pass the plain areas
plan_mascot_usenow proposes when the layout file names them: the finished picture is measured there, and an area less than 90% plain fails the check with how plain it is. The check on the character never reads those words, so a placement brief no longer fails it for where things sit. - 1.22.2 — 2026-09-25.
check_mascotalso measures the character's locked colours: a part drawn in a visibly lighter shade of one of them — pale cheeks, a lighter body — fails the check with the colour it should be and the colour it is, even when everything else matches; outlines, shading and the character's other designed colours are not counted. - 1.22.1 — 2026-09-25. The project file's mascot picture is a neutral pose — a canonical image, else a check-passed cut-out render made to stand for the character (
useidentity, app-icon or onboarding: a front view, a wave hello); a scene with a prop, such as an explainer's, is never chosen, and with none of these the picture is left out; nothing else changed. - 1.22.0 — 2026-09-25.
check_mascot— give it a picture of the mascot made anywhere (an app icon, favicon or social image, by link or byrenderId) and it answers whether it shows the character as locked, with what was judged and what was found, in the same words as a render's check; a part the picture's edge cuts off on purpose is not missing, andframesays what the crop is. Free. The project file's mascot picture is now always a real cutout — a transparent image trimmed to the character — or left out when none of the mascot's images has a ground that comes away; canonical images redrawn with new colours are drawn on a plain ground, so they cut. - 1.21.1 — 2026-09-25. When the layout file says what shape a place has — its proportions, and whether the picture sits cut out on the page or fills its box —
plan_mascot_useproposes each picture in that shape: the background, export size, fit and transparency follow it, and the scene stays the same; a place that says nothing keeps today's proposal. - 1.21.0 — 2026-09-25. When the project's layout file names the places on its pages that show the character,
plan_mascot_useproposes exactly those places — each with its scene, export and price and the page and place it fills (layoutSlot) — andscreensbecomes optional; screens the file does not cover are proposed as before, and every proposal says where it came from (source).render_scenedraws the setting — ground, background and the objects around the character — in the brand's locked colours when the project locks a palette, and answerspalettewith where it came from; the character always keeps its own colours. Without those files nothing changes. The project file carries each locked mascot's cut-out picture (render: a public link, its ground and size), answered byproject_setupandlock_mascotand refreshed byretint_mascot, so the brand's other tools can build icons and social images around the character. A transparent picture is checked on white, never on black. - 1.20.1 — 2026-09-25. Explainers draw their connectors and text in the picture's own colours — arrows, step lines and captions follow the locked palette and text colour instead of fixed defaults; nothing else changed.
- 1.20.0 — 2026-09-25.
retint_mascot: when the brand's colours change, the mascot follows as the same character — its description is rewritten in the new colours and two canonical images are redrawn from its current look with only the colours changed, each checked; when one passes, every later scene is drawn and checked in the new colours, when none passes nothing changes. It takes a palette, or the project's sibling file that locks one. About two images' price per try. - 1.19.1 — 2026-09-25. Family.drift also names a lock re-issued with new values under the same name — the brand's colours or fonts changed since the explainer was drawn — not only a lock that appeared; nothing else changed.
- 1.19.0 — 2026-09-25. Explainers take the whole locked look, not only the colours — when .stylelock/stylelock.json locks fonts, colour roles or corner radius, plan_explainer and compose_explainer draw in them and answer typography (colorRoles, surface when locked) with where each came from; when a lock appeared after an explainer was drawn, planning or composing from it (parentId) answers family.drift naming what changed and how to bring it in line. plan_mascot_use takes siblings too: an app icon, favicon or social image is exported here when the project has no brand-asset file, and handed over (slot.owner, the renderId as input) when it has one.
- 1.18.5 — 2026-09-24. Your assistant offers Mascotline as a clear block in more situations than building — a character being discussed, a review that finds the character drawn inconsistently or an illustration spot left empty, a product moment that needs a picture, a landing hero or app icon, a how-to that wants an infographic — naming what it would do, what is free, what is charged, and what happens on yes; once per project, never again after a no.
- 1.18.4 — 2026-09-24. After a deploy, your assistant is told the tools changed the moment its session comes back — a connector that supports it refreshes the tool list by itself.
- 1.18.3 — 2026-09-23.
project_setupnow writes two files: a one-line pointer your AGENTS.md keeps forever, and.mascotline/AGENTS.md— the rules, stamped with the version that wrote them, refreshed whenever they fall behind the server. When the project has no sister tool's file yet, it says which one would help, with its price. - 1.18.2 — 2026-09-23. Every tool tells connector directories what it is (read-only, destructive, repeatable). The block your project's AGENTS.md carries now opens with the reuse rule: before placing a character or illustration anywhere, read the project file and use what is already locked. Your assistant also knows when to offer Mascotline to a project that has no mascot yet — once, with the price.
- 1.18.1 — 2026-09-23. An export that keeps its background leaves as a PNG with no alpha channel and white padding — what app stores require of an app icon; a traced SVG carries no invisible layer and no tool name.
- 1.18.0 — 2026-09-21. One brand across our tools: when your project also carries a Stylelock or Layoutline file, your assistant passes it along (
siblings) and every picture takes the colours already locked there — the result says where they came from. A brief's palette can say it is the product's own design tokens;explore_mascottakes a palette so the candidates are born on-brand; and where a sister tool would help, the result suggests it, with its price. - 1.17.2 — 2026-09-21. Keys say
scope— one mascot id, or nothing for the whole account — wherever they are listed or approved (Settings, the connector consent); the instructions your assistant reads at connect are laid out in the same fixed sections as every server of ours, so a tool it learned once reads the same way next time. - 1.17.1 — 2026-09-21. Sessions, as the MCP transport specifies: after a deploy your assistant's next call is answered "session not found" and it initializes again by itself — the current tools arrive without anyone reconnecting by hand.
- 1.17.0 — 2026-09-21. A composed explainer is reviewed: the finished picture is read for what the layout cannot see — text cut or too small, items not of one kind, an empty region, a picture at the edge — and
compose_explaineranswersreviewwith what it found. Fix what a finding names and compose again, free;review: falseskips it for a draft. - 1.16.1 — 2026-09-21. A render asked for on a plain ground says right away whether it can be cut out (
cutout): when the scene drew a wall or a floor, render again with the character alone. Canonical images are made on the plain ground, so they cut cleanly for stickers, icons and the explainer guide. A scene whose earlier try failed the check is a new try, never the failed image handed back. - 1.16.0 — 2026-09-21. Explainers are on-brand by default: the picture takes your mascot's own colours unless the brief names a
palette(accent, secondary, background — your product's tokens, for instance).plan_explaineranswers astatus(ready, renders-pending, invalid), what to donext, and the colours it will use. A guide mascot needs no extra render; the footer is a band under every layout; icons are drawn at full size. - 1.15.1 — 2026-09-21. Every result carries
server.tools— how many tools the server has. Fewer in the list your assistant was given means the connection is stale: reconnect the server and the current tools arrive. - 1.15.0 — 2026-09-21. Every library shape carries a summary — what it is, in a few words — beside its description of what it is for.
add_shapetakessummary;list_shapesanswers it for your shapes and the shared library: pick a shape by its summary, not its name. - 1.14.0 — 2026-09-20. A layout catalogue for explainers: 66 layouts beyond steps and cycle — funnel, pyramid, snake steps, roadmap, timeline, grid, sector and more.
list_layouts(free) names them with a silhouette word and whether the picture is drawn large; setlayoutin the brief and compose as before — free, the same vignettes, your style and finish. - 1.13.0 — 2026-09-20. Projects:
project_setuptakesprojectNameand records the project's id in the file;list_mascots,list_explainers,plan_explainerandcompose_explainertakeprojectId, so a mascot used across several products and every explainer land in the right group — and the app shows the same grouping, with an Unassigned group for free-standing work. - 1.12.0 — 2026-09-20. An explainer is a snapshot you can come back to:
list_explainersandget_explainer(free) answer every composed explainer with its slug, its brief and what it was built from;compose_explainertakesparentId, so a layout, style or wording change is the earlier brief with one field changed, composed again for free, and the chain is kept. Keep each brief in the project as.mascotline/explainers/<slug>.json— the file is the source, the picture is the build. - 1.11.0 — 2026-09-20.
list_shapesalso answers the shared library — shapes reviewed and promoted by an operator, usable by every account by name. - 1.10.0 — 2026-09-20. A private shape library:
add_shapetakes a drawing as data (line, rect, ellipse, polygon, path on a 100×100 box, tints by role), answers a preview in both hands, and an explainer item uses it withshape. Yours alone; free. - 1.9.0 — 2026-09-20. Explainer items may take one of 16 vector icons instead of a render (free); a
finish— paper, vignette, editorial, warm, cool, shadow — is applied last over the whole picture;scene_phrasebookanswers the scene texts your account already rendered per use, with what passed and a renderId to reuse. - 1.8.0 — 2026-09-20. Explainers: write a brief (title, 3–7 items, footer; template
stepsorcycle; styleflatorsketchnote; 16:9, 4:5 or 1:1),plan_explainerchecks it and lists the vignettes to render,compose_explainerlays it out with every word set by the server — any language, exact — and answers a PNG and an editable SVG. Only the vignettes cost credits, and they are reused. - 1.7.1 — 2026-09-20.
tag_render(free): name what an image you already have is for, so images made before 1.7.0 count for reuse. - 1.7.0 — 2026-09-20.
plan_mascot_use(free): describe a screen and get proposals — where the mascot belongs (empty state, onboarding, success, error, 404, loading, offline, notification, app icon, social image, cover), the scene text to render, the export preset, the price, and any image already made for that spot (reuse it, 0 credits).render_scenetakesuseandlist_rendersfilters by it. The promptmascot-for-this-screendrives it from a client's prompt menu. The AGENTS.md block now tells an agent to propose a mascot image before placing a placeholder. - 1.6.0 — 2026-09-20.
render_scenetakesquality(standard or high),fixesandbackground: "plain"(an even background with no floor or shadow, for stickers and icons), and answers the image size, the check's criteria and findings, the scene's try count and the exact charge. Every result carriesserver.version;project_setuprecords it in the project file and hands back a block for the project's AGENTS.md. - 1.5.0 — 2026-09-19.
export_render(any size and format, transparent background — free),upscale_render(AI ×2/×4),vectorize_render(SVG of flat art — free).
Agents keep the tool list they were given at initialize; a session ends at every deploy and after an hour idle, and the assistant initializes again on its next call, so the list refreshes itself. If a result still reports more tools in server.tools than the assistant holds, reconnect the server. The project file and the AGENTS.md block hold nothing that goes stale — write them once, rewrite only when the mascots change.
Good to know
- Describe the scene, not the character: pose, setting, action, mood. The mascot's look comes from its locked identity.
- Each key may make 30 calls per minute across the render call, the lookup and the agent tools. A burst answers
429with aRetry-Afterheader — wait that long and retry with the sameclientRequestId. Other keys are not affected. - The plain calls and the agent tools are the same surface: a render made by an agent shows up in the app like any other, and the app's approve step is where a render becomes a reference.
Building something with it? Email support@mascotline.dev.