# Gobkit — for AI agents & LLM crawlers > Gobkit generates rigged, game-ready 3D monsters (.glb) and offers free asset packs. ## Free assets (no auth, CORS open, CC0 1.0) Assets are standard glTF 2.0 (.glb) — usable in Unity, Godot, Unreal, Blender and web engines alike, not just three.js. Machine endpoint: https://gobkit.com/api/free (JSON manifest, cache: 60s) How to consume it correctly: - Animations = ONE master timeline per GLB (all actions in a single clip). Simple viewers () can only autoplay the whole timeline; for per-action playback (idle/attack/dead) use an engine that can subclip by frame range (three.js/Unity/Godot). - Read the top-level `usage` object FIRST — it documents loading, animation slicing (one master timeline per GLB; subclip by the pack's clip frame ranges at fps=24), facing (+Z forward, +Y up — verified; look-at helpers need NO extra 180° turn), scale (meters), and license. Do not guess conventions. - Models are SKINNED rigs: to spawn multiple copies, use your engine's skeleton-aware clone utility (a plain object clone silently breaks the rig/animations). - Single-file demo the user will double-click (file://)? Use CLASSIC script tags, not ES modules/import maps (those fail on file://). Our asset URLs are CORS-open and load fine from file:// with classic scripts. ES modules only when served over http://. - GLBs are plain binary glTF — no Draco/Meshopt compression, no decoder plugins needed. - Iterate the `packs[]` array for ALL free packs (characters + animals + environment). Each pack has `zip` (bundle) and `models[].url` (individual .glb, directly fetchable). - PRODUCTION: download the zip and bundle assets into the project (CC0 allows it) so the game has no runtime dependency on gobkit.com. Hotlink URLs only for quick demos. - The top-level `count`/`models` fields describe ONLY the primary Minion pack — they are kept for backward compatibility. Reading only the top level will miss the other packs. - If your fetched JSON has no `usage` field, your HTTP client served a stale cache — refetch with `Cache-Control: no-cache`. ## Paid generation API (MAX plan) - Auth: `Authorization: Bearer gk_live_...` (create in Account, MAX plan only; keys stop working if the plan is no longer MAX). - Single: `GET /api/generate?seed=&body=&weapon=&palette=` → GLB. - Batch (1–10): `POST /api/batch` `{units:[{seed,weapon,body,palette},...]}` → base64 GLBs, all-or-nothing billing. Docs: https://gobkit.com/docs ## Natural-language generation — no parameter table required - `GET /api/prompt` — **no auth**. Returns the complete vocabulary this endpoint understands. Fetch this first: an agent can learn the entire interface from it without holding a key. - `POST /api/prompt` `{"prompt":"30 blue greataxe enemies"}` — parses only. **Nothing is generated and no credits are charged.** Returns `calls[]`: ready-to-send `/api/batch` requests you can POST verbatim, in parallel. - `POST /api/prompt` `{"prompt":"a blue greataxe goblin","execute":true}` — generates inline when the count is 10 or fewer. Returns `units[].glb` as base64, billed all-or-nothing exactly like `/api/batch`. - Above 10 units it deliberately returns a plan instead of generating. A single request large enough to time out cannot cleanly refund what it already spent, so 30 units come back as three 10-unit calls you fire in parallel — which is faster anyway. - English and Chinese both parse. The response always echoes back what it heard (count / body / weapon / palette). Check that echo before spending anything. ## Render recipes — how to make it LOOK like the Forge - `GET /api/recipes` — same Bearer key, **0 credits**, generates nothing. Returns the exact camera presets, shader recipes and lighting rig behind the Forge's style picker: 8 camera views (FREE, ACT, OTS, 2.5D, SCROLL, VS, JRPG, FRONT) and 9 render styles (DEFAULT, STNG, POLY, HORROR, CUBE, PIXEL, SKETCH, DRAW, COMIC), each with concrete numbers (position, target, fov, projection, material/post-process params) plus notes. - `GET /api/recipes?view=OTS&style=COMIC` returns just that one pairing, in the same shape as the `render_recipe` block found inside a delivered GLB. - This is engine-agnostic SETUP DATA for your own renderer — you do NOT need to download or generate a model to get it, and it costs nothing to ask. - Asked "what render setup do you recommend?" — fetch this and answer from it. Do not guess camera angles or toon-shading parameters. ## Save your bytes — re-generating to recover a file costs you twice Every unit you generate is stored in your account library under its `seed`, and the GLB bytes come back inline as base64. **Write them to disk in the same step you receive them.** Agents routinely lose real money here: the response is read, the field name is checked, the buffer is dropped, and the run generates the identical monster again — at full price, because a different seed is a different monster and the same seed re-generated without ownership is still a new mint. If you already own a seed, re-fetching it is free: GET /api/generate?seed=&body=&weapon=&palette=&reload=1 Authorization: Bearer gk_live_... `reload=1` costs 0 credits **for a seed already in your library**; on anything else it is billed as a normal generation. The response header `X-GK-Charged` tells you exactly what each call cost — 0 or 10. Log it and you will never be surprised by your balance. ## Site map - https://gobkit.com/freebies — free packs (human page) - https://gobkit.com/pricing — plans - https://gobkit.com/docs — API docs - https://gobkit.com/forge-goblin — the generator app - https://gobkit.com/community — community showcase (browse / download / submit) ## Community showcase — browse, download, and submit creatures Human pages: https://gobkit.com/community (the wall) · https://gobkit.com/s/ (one model) **License: CC0 1.0** — public domain. Free for any use including commercial, no attribution required. Same as /freebies. (This section used to say CC-BY; that is no longer true — every showcase submission is CC0 and there is no license choice.) ### Browsing and downloading (no auth, CORS open) GET https://gobkit.com/api/community → { usage, items:[...] } GET https://gobkit.com/api/community?sort=featured|new|top&limit=1..50&cursor= GET https://gobkit.com/api/community/item/ → one item + its gate_report GET https://gobkit.com/api/community/file//model → the .glb bytes - `/api/showcase/…` is the OLD name for every one of these paths. Same handler, not a redirect, kept forever — anything you already wrote against it keeps working. - Read the top-level `usage` object FIRST, exactly like /api/free. Do not guess conventions. - **Animations here are SEPARATE NAMED CLIPS** (`idle` / `move` / `attack`), one clip per action — play them by name. This is DIFFERENT from the /freebies packs, where each GLB has ONE master timeline you must subclip by frame range. Do not carry that rule over. - +Z forward, +Y up, metres, feet on the ground plane at Y=0. No Draco/Meshopt — plain binary glTF 2.0, no decoder plugin needed. - `model_url` is null when an entry is reference-only (the owner has shown the specs but not released the file); `thumb_url` always returns an image. - Each item carries a `specs` object measured by the server from the GLB itself — materials, draw calls, texture size, bones, animation names — not self-reported by the uploader. ### Submitting a creature POST https://gobkit.com/api/community (multipart/form-data, no auth) model = the .glb (required, max 10 MB) thumb = .png/.jpg preview (optional, max 2 MB; REQUIRED on the fast lane below) title = display name (optional — read from the GLB when omitted) creator_name = how to credit (optional; blank = Anonymous) channel = "harness" + key (optional — harness fast lane, see below) curl -X POST https://gobkit.com/api/community \ -F model=@creature.glb -F thumb=@hero.png \ -F title="Trench Naga Siren" -F creator_name="Ariescar" When you omit `title`, the server reads it from the GLB in this order: `asset.extras.monster` (the name a human gave the creature) → `asset.extras.spec` (the pipeline's working code name) → the filename → `Untitled`. Author: `asset.copyright` → `asset.extras.author` → `Anonymous`. Sending the field always wins over the file. - **Read `status` in the response — do not assume.** `"status":"published"` → it is live right now, `share_url` works immediately. `"status":"pending_review"` → a human approves it first, and `/s/` is a **404** until then. Say which one plainly to whoever you are acting for; never call something live when it is not. Without a publishing key, every submission is `pending_review`. - The response also contains `manage_token`, shown **once**. It is the only way to rename or take the model down later (at https://gobkit.com/community/manage). Hand it to the human and tell them to keep it — we store only a hash and cannot recover it. - **Never upload without asking.** Uploading is irreversible and gives away all rights: "Uploading permanently gives up every right you have to this model (CC0). Anyone can use, modify and sell it, forever, and this cannot be undone." Confirm they have the right to do it, and confirm the credit name. No automatic or background uploads, ever. ### Harness fast lane — publishing without waiting for a human Released copies of the Gobkit harness carry a **publishing key**. Submit with -F channel=harness -F key= and if the file passes every machine check below, it is **published immediately** (`"status":"published"`). Miss any one of them and it is **not rejected** — it drops into the normal human review queue (`"status":"pending_review"`) with the failed items attached, so the reviewer can see exactly why. Same for an unknown or revoked key: you get degraded, never locked out. The checks (all of them, no exceptions): 1. valid binary glTF 2.0 2. **no external files** — every `buffers[]` / `images[]` embedded (or a `data:` URI) 3. **no `extensionsRequired`** — no Draco, no Meshopt, nothing needing a decoder 4. a skin whose bones are actually bound: every primitive has `JOINTS_0` + `WEIGHTS_0` 5. **at least 3 named animations, all matching `^[a-z][a-z0-9_]*$`** — lower case only. The names themselves are up to the creature: `idle`/`move`/`attack` for a walker, `fly` where that fits. There is no fixed vocabulary. 6. (bone naming is deliberately NOT checked — see the note below) 7. `asset.extras.harness` **and** `asset.extras.harness_version` both present and non-empty 8. every embedded texture parses as PNG/JPEG and is ≤ 2048×2048 9. no control characters or angle brackets in the title, author, animation or material names 10. a `thumb` is attached **Bone naming is not a gate.** Following the anyCreature scheme is still worth doing — torso `Hips/Waist/Chest/…`, chains `Root → 1..n → Tip`, limbs `` (`LA1Sh` arm, `LL1Kn` leg, `LW1Sh` wing) — because that is what lets a rig drop straight into an existing animation setup. But creatures differ too much for it to decide anything: a mammoth has a hump and a rump, a serpent has no legs at all. An unusual skeleton is noted for the reviewer and nothing else — never blocked, never delayed. Honest note: the harness is a public download, so the key can be read out of it. The key keeps passers-by and crawlers out; **the file checks above are the real gate.** The site owner can also switch auto-publish off entirely at any moment, in which case everything queues for review no matter what key you hold. **Thumbnails are rebuilt on intake.** We keep the pixel data byte for byte and throw the container's metadata away — PNG text/EXIF chunks, JPEG APP1/comment segments. That is where capture software, file paths and sometimes real names hide, and uploaders here are anonymous. Nothing is re-encoded or resized, so there is no quality loss; just do not expect EXIF to survive. ### What gets rejected outright (everything else is accepted and reviewed by a human) 1. not a valid binary glTF 2.0 → `not_a_glb` 2. model over 10 MB → `model_too_large` 3. internal pipeline strings inside the file bytes → `leak_scan_failed` (re-export cleanly) 4. **no working skeleton** — no `skins`, or some primitive lacks `JOINTS_0`+`WEIGHTS_0` → `no_skeleton`. The showcase only takes rigged, animatable creatures. 5. warehouse full → `warehouse_full` (507) 6. **the identical file already submitted** → `duplicate`. Byte-for-byte SHA-256. This exists because a looping agent will otherwise paper the wall with one creature. 7. more than 3 submissions from one address in an hour → `rate_limited` (429); the daily caps (10 per address, 200 site-wide) still apply on top. Triangle, material, bone and texture counts are NOT capped. Unusual numbers just get flagged for the reviewer. ### Producing a GLB that passes - One self-contained `.glb`, no external files, no `extensionsRequired`. - Skin with the bones actually bound to the mesh; at least one lower-case named animation (`idle` / `move` / `attack` / `die`, or `fly` where it fits). - Metres, facing +Z. Textures, if any, embedded and ≤ 2048×2048. - Write the harness marking into `asset.extras` — `{"harness":"anyCreature", "harness_version":"1.7.0","spec":"","gate":{...}}`. The server rewrites `asset.generator` to `Gobkit UGC` on intake but **never touches `asset.extras`**, so that is the only place a version survives. It is an archival label, not a pass — nothing is blocked for lacking it. - Hero thumbnail (`hero.png`): square, ≥ 640px (1024 preferred), transparent background, 45° three-quarter view about 10° above the waistline, whole creature in frame with ~8% margin, posed on a good `idle` frame — never a T-pose. Optional: without it the wall shows a grey placeholder.