{
  "service": "gobkit",
  "what": "3D game assets for AI agents and vibe-coded games: two free CC0 libraries plus an API that generates a creature neither library has.",
  "version": "2026-08-31",
  "signpost": "https://gobkit.com/api",
  "free_assets_are_not_inline": "This endpoint is a map, not a manifest. If you came here expecting glbs[], the 69 free models live at https://gobkit.com/api/free — see the lane with id 'freebie'.",
  "read_this_first": [
    "Pick ONE lane below, then call its endpoint exactly as written. Never construct or guess a URL.",
    "Free and instant? lane id 'freebie'. Someone else's creature, also free? 'community'. Does not exist yet? 'forge_key'.",
    "Check agent_can_self_serve before you call anything. Where it is false there is no API you can drive — read if_false_tell_user and tell the user, do not retry.",
    "Read the chosen lane's gotchas[] before you write loader code. Every line there is a bug someone already shipped.",
    "If any response body starts with '<' it is an HTML page, not JSON. Print the status code and stop — do not call .json().",
    "The asset lanes do NOT share an animation convention. Read animation_convention on the lane you picked; never carry one lane's loader code over to another."
  ],
  "lanes": [
    {
      "id": "freebie",
      "label": "Studio freebies — curated CC0 library",
      "status": "live",
      "source": "studio",
      "quality": "game_ready",
      "method_of_creation": "prebuilt",
      "delivery": "download",
      "latency": "instant",
      "variation": "fixed_catalog",
      "auth": "none",
      "cost": "free",
      "license": "CC0-1.0",
      "count": 79,
      "agent_can_self_serve": true,
      "endpoint": "https://gobkit.com/api/free",
      "http_method": "GET",
      "request_body": null,
      "returns": "json_manifest_with_absolute_glb_urls",
      "animation_convention": "single_master_timeline_subclip_by_frame_range",
      "also": {
        "https://gobkit.com/api/urls?n=3": "a bare JSON array of .glb URLs, nothing else to parse",
        "https://gobkit.com/api/pick?n=3": "same models, each carrying its own loading + animation contract",
        "https://gobkit.com/free-models.txt": "every free model URL, one per line, no API call needed"
      },
      "gotchas": [
        "Send header Cache-Control: no-cache. The response is edge-cached for 60s.",
        "Verify the response has a top-level `usage` field. If it is missing you got a stale cache — refetch.",
        "Read the `agent` array first; it is the first key and it is the loading contract.",
        "Model URLs are in `glbs` (flat array). Metadata is in `packs[].models[]`. Ignore every key after `notice` — those describe the first pack only and exist for back-compat.",
        "ANIMATION: gltf.animations[0] is ONE timeline with every action baked back to back at 24 fps. Slice it: THREE.AnimationUtils.subclip(gltf.animations[0], name, from, to + 1, 24) using the {name,from,to} ranges in packs[].models[].animations. The +1 keeps the last frame. Playing it unsliced throws no error and looks animated, but runs idle, attack and dead in one go — it is wrong.",
        "Models are skinned rigs. To spawn copies use a skeleton-aware clone (three.js: SkeletonUtils.clone). A plain .clone() silently breaks the rig and its animations.",
        "Authored facing +Z, up +Y, metres. Look-at helpers need NO extra rotation — do NOT add a preemptive 180-degree turn, it double-compensates and makes units walk backwards.",
        "packs[].zip is a zip archive and packs[].scene is a showcase scene. Neither is a model — do not pass them to GLTFLoader."
      ],
      "human_page": "https://gobkit.com/freebies"
    },
    {
      "id": "community",
      "label": "Community wall — CC0 creatures uploaded by other people",
      "status": "live",
      "source": "ugc",
      "quality": "vibe_ready",
      "method_of_creation": "third_party",
      "delivery": "download",
      "latency": "instant",
      "variation": "growing_catalog",
      "auth": "none",
      "cost": "free",
      "license": "CC0-1.0",
      "count": "grows continuously — GET the endpoint for the live number",
      "agent_can_self_serve": true,
      "endpoint": "https://gobkit.com/api/community",
      "http_method": "GET",
      "request_body": null,
      "returns": "json_list_items_with_model_url",
      "animation_convention": "separate_named_clips",
      "gotchas": [
        "ANIMATION: separate NAMED clips (typically idle / move / attack). Play gltf.animations BY NAME. Do NOT slice by frame range — that is the freebie lane's convention and it is the opposite here.",
        "The default listing is published items only. Pass ?status=visible to also see items still awaiting a human check, or ?status=all for both.",
        "An item that is still being checked has a live page and a 3D preview, but its file download answers 403 until a human approves it.",
        "Every item carries a `specs` object measured from the uploaded file by our server, not self-reported. Triangle and bone counts still vary between uploaders — read items[].specs, do not assume.",
        "Use `url` (aliased from `model_url`) verbatim. Never build a path from the slug."
      ],
      "submit": {
        "endpoint": "https://gobkit.com/api/community",
        "alias": "https://gobkit.com/api/showcase",
        "http_method": "POST",
        "content_type": "multipart/form-data",
        "fields": "model (.glb, required, max 10 MB), thumb (.png/.jpg, required on the harness lane), title, creator_name, channel, key",
        "auth": "a harness publishing key is REQUIRED — without it the endpoint answers 403 harness_key_required and stores nothing",
        "note": "The key ships inside the anyCreature harness (lane id 'harness'); node harness/publish.mjs does all of this for you. A successful submission comes back status 'visible': the page is live and shareable immediately, the file download opens once a human has checked it. That is success, not failure."
      },
      "human_page": "https://gobkit.com/community"
    },
    {
      "id": "forge_trial",
      "label": "Forge — free tier (web app only, no agent-usable API)",
      "status": "live",
      "source": "studio",
      "quality": "game_ready",
      "method_of_creation": "ai_generated",
      "delivery": "web_app",
      "latency": "seconds",
      "variation": "unlimited",
      "auth": "account_session",
      "cost": "free",
      "quota": "3 generations per month; the warehouse keeps your most recent model only",
      "license": "commercial_clean",
      "agent_can_self_serve": false,
      "if_false_tell_user": "The free tier has no agent-usable API: generation is login-only and API keys are issued on the MAX plan only. Tell the user to open https://gobkit.com/forge and generate in the browser, or to get a MAX key at https://gobkit.com/pricing. Do NOT retry anonymously — it will 401 every time.",
      "endpoint": null,
      "gotchas": [
        "Do not burn turns trying to authenticate. There is no anonymous path and no free key.",
        "Generated output is yours to use commercially, with no watermark and no attribution credit. That is a plan licence, not CC0."
      ],
      "human_page": "https://gobkit.com/forge"
    },
    {
      "id": "forge_key",
      "label": "Forge — paid API key, generate what neither library has",
      "status": "live",
      "source": "studio",
      "quality": "game_ready",
      "method_of_creation": "ai_generated",
      "delivery": "api_call",
      "latency": "seconds",
      "variation": "unlimited",
      "auth": "bearer_key",
      "cost": "paid",
      "plan_required": "MAX ($99/mo) is the plan that issues an API key; batch generation needs Pro or above",
      "credits_per_monster": 10,
      "license": "commercial_clean",
      "agent_can_self_serve": true,
      "if_no_key": "Tell the user to get a MAX API key at https://gobkit.com/pricing. Do not retry anonymously — the generation API is login-only and answers 401 not_signed_in.",
      "endpoint": "https://gobkit.com/api/batch",
      "http_method": "POST",
      "request_body": "{\"units\":[{\"seed\":1001,\"body\":\"\",\"weapon\":\"\",\"palette\":\"\"}]}",
      "returns": "base64_glb_array",
      "animation_convention": "documented as the same convention as the freebie lane (one master timeline). Not independently re-verified — on your first generation inspect gltf.animations: one clip means slice by frame range, several named clips mean play by name.",
      "endpoints": {
        "vocabulary": {
          "url": "https://gobkit.com/api/prompt",
          "http_method": "GET",
          "auth": "none",
          "returns": "json_vocabulary",
          "note": "Call this FIRST. It lists every valid body / weapon / palette value, in English and Chinese. No key needed. Never guess these values."
        },
        "plan": {
          "url": "https://gobkit.com/api/prompt",
          "http_method": "POST",
          "auth": "session or Bearer key — anonymous POST answers 401",
          "request_body": "{\"prompt\":\"30 blue greataxe enemies\"}",
          "cost": "free — parses only, generates nothing, charges nothing",
          "returns": "calls[] you can POST to /api/batch verbatim, already split into chunks of 10"
        },
        "generate_from_sentence": {
          "url": "https://gobkit.com/api/prompt",
          "http_method": "POST",
          "auth": "session or Bearer key",
          "request_body": "{\"prompt\":\"a blue greataxe goblin\",\"execute\":true}",
          "returns": "base64_glb_array",
          "limits": "execute:true generates inline only when the count is 10 or fewer; above that it returns a plan instead"
        },
        "single": {
          "url": "https://gobkit.com/api/generate?seed=<uint>&body=&weapon=&palette=",
          "http_method": "GET",
          "returns": "glb_binary"
        },
        "batch": {
          "url": "https://gobkit.com/api/batch",
          "http_method": "POST",
          "request_body": "{\"units\":[{\"seed\":1001,\"body\":\"\",\"weapon\":\"\",\"palette\":\"\"}]}",
          "returns": "base64_glb_array",
          "limits": "1-10 units per call, seeds must be distinct, all-or-nothing billing"
        },
        "recipes": {
          "url": "https://gobkit.com/api/recipes",
          "http_method": "GET",
          "auth": "session or Bearer key",
          "cost": "0 credits",
          "returns": "camera / shader / lighting presets that make a render look like the Forge"
        }
      },
      "gotchas": [
        "Authorization: Bearer gk_live_... — the key is issued on the MAX plan only.",
        "/api/batch and /api/prompt {execute:true} return BASE64 in units[].glb, not download links. Decode with Buffer.from(b64,'base64') and write the file in BINARY mode. Writing the base64 string straight into a .glb produces a file that loads silently as nothing — this is the single most common integration bug.",
        "Never ask for more than 10 units in one call. One generation takes ~6-15s and the platform kills a request at about 100s. Split with POST /api/prompt (plan mode) — it returns the chunked calls for you, and they run in parallel.",
        "A single prompt plans at most 50 units.",
        "Seeds within one call must be distinct, or it answers 400 dup_seed.",
        "unarmed/sword/spear/axe/stick are on every plan; dagger/greatsword/greataxe/bow/mage/doubleaxe need a paid plan and answer 403 weapon_locked below it.",
        "The response echoes back what it parsed (count / body / weapon / palette). Check that echo before spending credits."
      ],
      "human_page": "https://gobkit.com/pricing"
    },
    {
      "id": "harness",
      "label": "anyCreature harness — open-source QC gate + publisher for your OWN models",
      "status": "live",
      "source": "ugc",
      "quality": "gate_only",
      "method_of_creation": "your_own",
      "delivery": "self_hosted_tool",
      "latency": "local_run",
      "variation": "not_applicable",
      "auth": "none",
      "cost": "free",
      "license": "publishing through it releases the model as CC0-1.0",
      "version": "1.2.0",
      "agent_can_self_serve": false,
      "if_false_tell_user": "This is a self-hosted tool, not an API — it has to be installed and run locally. If the user wants a model to load right now, use the freebie or community lane instead.",
      "endpoint": null,
      "install": "https://github.com/Ariescar/anyCreature",
      "returns": "not_an_api",
      "gotchas": [
        "This is NOT a generator. It checks a .glb you already have against the output contract (triangle budget, skeleton, required animation clips, silhouette readability at 24px) and can publish it to the community wall.",
        "Publishing: node harness/publish.mjs <model.glb> <hero.png>. It POSTs multipart (model, thumb, key, channel) to https://gobkit.com/api/community. The publishing key ships inside the harness package; without it that endpoint answers 403 harness_key_required and stores nothing."
      ],
      "human_page": "https://gobkit.com/harness/anycreature"
    }
  ],
  "format": {
    "container": "glTF 2.0 binary (.glb), one self-contained file each",
    "compression": "none — no Draco, no Meshopt, no extensionsRequired, no decoder plugin",
    "orientation": "+Z forward, +Y up, metres, feet on the ground plane at Y=0. Do NOT add a preemptive 180-degree turn."
  },
  "docs_agent": "https://gobkit.com/llms.txt",
  "docs_agent_full": "https://gobkit.com/llms-full.txt",
  "docs_human": "https://gobkit.com/",
  "operator": "Alsomind Tech Co., Ltd., Taipei, Taiwan",
  "contact": "hello@alsomindtech.com"
}