Asset Catalog API

The LoopLoop Asset Catalog is a searchable index of free game assets from across the web. Use it to find sprites, tilesets, audio, and other assets that match your game’s art direction.

Base URL

All endpoints below are relative to the platform API:

https://api.looploop.dev

For example, GET /api/asset-packs means GET https://api.looploop.dev/api/asset-packs.

Note: looploop.dev (without the api. subdomain) serves developer documentation, not the API. Always use api.looploop.dev for API calls.

Overview

The catalog indexes asset packs from Kenney, OpenGameArt, itch.io, GitHub, and LoopLoop-hosted creators. Every pack includes style metadata — art style, perspective, resolution, palette, and a consistency score — so you can filter for packs that fit your game.

Key concepts:


Browse Packs

GET /api/asset-packs

Browse and search the catalog. No auth required.

Query parameters:

ParamTypeDescription
qstringFull-text search across name, description, tags, art style, style description, author, perspective, resolution, asset item types/categories, and source names. Supports stemming (e.g. “pirates” matches “pirate”) and compound word fragmentation (e.g. “sailboat” matches packs tagged “boat” or “sail”). Multi-word queries use OR logic with relevance ranking.
packTypestringPack type filter: sprites, interface, models, audio, fonts, icon-fonts, kits
tagsstringComma-separated tag filter
categorystringAsset category filter (free-form, e.g. “characters”, “vehicles”, “terrain”)
artStylestringArt style filter (free-form tags, e.g. “soft-shading”, “low-poly”, “cartoonish”)
perspectivestringPerspective filter (top-down, side-scroll, isometric, etc.)
resolutionstringResolution filter (16x16, 32x32, etc.)
enginestringEngine compatibility filter
sourcestringSource filter (kenney, opengameart, itch, github)
sortstringSort order: downloads (default), newest, consistency
limitnumberMax results (default 20, max 100)
offsetnumberPagination offset

Response:

{
  "packs": [
    {
      "id": "uuid",
      "slug": "kenney-1-bit-pack",
      "name": "Kenney 1-Bit Pack",
      "description": "Over 1000 monochrome 1-bit style sprites and tiles",
      "license": "CC0-1.0",
      "tags": ["1-bit", "monochrome", "pixel-art"],
      "sourceUrl": "https://kenney.nl/assets/1-bit-pack",
      "downloadType": "agent",
      "author": "Kenney",
      "licenseTier": "redistributable",
      "packType": "sprites",
      "artStyle": "soft-shading, chunky-geometry, bright-color-palette",
      "perspective": "isometric",
      "resolution": "HD",
      "styleDescription": "The art style combines low-poly, hand-painted textures with...",
      "thumbnailUrl": "/cdn/asset-packs/kenney-1-bit-pack/thumbnail.png",
      "sampleUrls": ["/cdn/asset-packs/kenney-1-bit-pack/samples/sample-001.png"],
      "assetCount": 1024,
      "downloadCount": 150
    }
  ],
  "total": 342,
  "limit": 20,
  "offset": 0
}

Pack Details

GET /api/asset-packs/:slug

Full pack details including all asset items and style analysis.

Response:

{
  "pack": {
    "id": "uuid",
    "slug": "kenney-1-bit-pack",
    "name": "Kenney 1-Bit Pack",
    "...": "all pack fields",
    "styleAnalysis": {
      "artStyle": "soft-shading, chunky-geometry, bright-color-palette",
      "synthesis": "The art style combines low-poly hand-painted textures with...",
      "styleTags": ["soft-shading", "chunky-geometry", "bright-color-palette"],
      "aspects": {
        "shading": "Shadows use soft gradients with smooth light transitions...",
        "edges": "Rounded, beveled edges enhance a friendly appearance...",
        "surfaceDetail": "Minimal surface detail with broad color patches...",
        "color": "Vibrant, saturated palette with smooth transitions...",
        "formLanguage": "Chunky, inflated proportions with exaggerated scale...",
        "materialRendering": "Materials distinguished by color, not reflections...",
        "overallFeel": "Playful, approachable style reminiscent of casual mobile games..."
      },
      "perspective": "isometric",
      "resolution": "HD",
      "palette": ["#3A3A3A", "#FFB873", "#6DD3CE", "#A4B9EF", "#7E7868"]
    }
  },
  "assets": [
    {
      "id": "uuid",
      "assetId": "knight-idle",
      "type": "sprite",
      "category": "characters",
      "path": "Tilemap/Characters/knight_idle.png",
      "description": "Knight character idle pose, 16x16 monochrome",
      "tags": ["knight", "character", "idle"],
      "metadata": { "width": 16, "height": 16 },
      "downloadUrl": "https://kenney.nl/assets/1-bit-pack"
    }
  ]
}

Structured Search (for Agents)

POST /api/asset-packs/search

Designed for AI agents to find assets matching specific needs and style requirements. Returns ranked results with match scores.

Request body:

{
  "needs": [
    { "type": "spritesheet", "category": "enemies", "tags": ["undead"], "minFrames": 4 },
    { "type": "tileset", "category": "environment", "tags": ["dungeon"] },
    { "type": "audio", "category": "sfx", "tags": ["combat"] }
  ],
  "style": {
    "artStyle": "pixel-art",
    "perspective": "top-down",
    "resolution": "16x16"
  },
  "packType": "sprites",
  "limit": 10
}

Response:

{
  "results": [
    {
      "score": 72.5,
      "pack": {
        "slug": "kenney-1-bit-pack",
        "name": "Kenney 1-Bit Pack",
        "artStyle": "pixel-art",
        "styleConsistencyScore": 62,
        "downloadType": "agent",
        "attributionRequired": false
      },
      "matchingAssets": [
        {
          "assetId": "skeleton-walk",
          "type": "spritesheet",
          "category": "enemies",
          "path": "Spritesheets/skeleton_walk.png",
          "downloadUrl": "..."
        }
      ]
    }
  ],
  "total": 5
}

Download Assets

POST /api/asset-packs/:slug/download

Record a download event and get download URLs. For promoted packs, returns CDN URLs. For non-promoted packs, returns the source download URL.

Request body:

{
  "assetIds": ["skeleton-walk", "dungeon-tileset"],
  "gameSlug": "my-game",
  "gameId": "optional-game-uuid"
}

Response:

{
  "packSlug": "kenney-1-bit-pack",
  "packName": "Kenney 1-Bit Pack",
  "downloadType": "agent",
  "licenseTier": "redistributable",
  "attributionRequired": false,
  "source": "external",
  "sourceDownloadUrl": "https://kenney.nl/content/3-Assets/kenney_1-bit-pack.zip",
  "assets": [
    {
      "assetId": "skeleton-walk",
      "type": "spritesheet",
      "category": "enemies",
      "path": "Spritesheets/skeleton_walk.png",
      "downloadUrl": "https://kenney.nl/content/3-Assets/kenney_1-bit-pack.zip"
    }
  ]
}

Single Asset

GET /api/asset-packs/:slug/assets/:assetId

Get metadata and download URL for a single asset.


Per-Game Asset Tracking

Track which assets each game has downloaded, which are actively used in code, and generate attribution/credits lists. All data is stored server-side in D1.

POST /api/games/:slug/assets/track

Record assets downloaded into a game. Called automatically by the downloadPackAssets() client when gameSlug is provided, or manually by agents after acquiring files.

Request body:

{
  "packSlug": "kenney-1-bit-pack",
  "assets": [
    {
      "assetId": "skeleton-walk",
      "localPath": "public/assets/packs/kenney-1-bit-pack/Spritesheets/skeleton_walk.png",
      "category": "enemies"
    }
  ]
}

Response:

{ "tracked": 1 }

PUT /api/games/:slug/assets/mark-used

Mark tracked assets as actively used in game code. Agents call this after wiring an asset into a config file, source import, or other reference. Also supports marking assets as removed when they are no longer referenced.

Request body:

{
  "assets": [
    {
      "assetId": "skeleton-walk",
      "referencedBy": ["src/scenes/GameScene.ts", "config/enemies.json"]
    }
  ]
}

To mark an asset as removed:

{
  "assets": [
    {
      "assetId": "skeleton-walk",
      "referencedBy": [],
      "status": "removed"
    }
  ]
}

Response:

{ "updated": 1 }

GET /api/games/:slug/assets

List all tracked assets for a game. Joins with asset_packs to include license info.

Query parameters:

ParamTypeDescription
statusstringFilter by status: downloaded, in_use, or removed

Response:

{
  "assets": [
    {
      "assetId": "skeleton-walk",
      "localPath": "public/assets/packs/kenney-1-bit-pack/Spritesheets/skeleton_walk.png",
      "status": "in_use",
      "referencedBy": ["src/scenes/GameScene.ts", "config/enemies.json"],
      "downloadedAt": "2026-03-20T12:00:00Z",
      "pack": {
        "slug": "kenney-1-bit-pack",
        "name": "Kenney 1-Bit Pack",
        "license": "CC0-1.0",
        "licenseTier": "redistributable",
        "attributionRequired": false,
        "attributionText": null,
        "author": "Kenney",
        "authorUrl": "https://kenney.nl",
        "sourceUrl": "https://kenney.nl/assets/1-bit-pack"
      }
    }
  ]
}

GET /api/games/:slug/credits

Generate an attribution/credits list for all in_use assets in a game, grouped by pack.

Query parameters:

ParamTypeDescription
allstringSet to true to include all packs (including those that don’t require attribution like CC0). Default: only packs where attributionRequired is true.

Response:

{
  "gameSlug": "my-game",
  "generatedAt": "2026-03-20T12:00:00Z",
  "packs": [
    {
      "name": "Kenney Tiny Town",
      "author": "Kenney",
      "authorUrl": "https://kenney.nl",
      "license": "CC-BY-4.0",
      "sourceUrl": "https://kenney.nl/assets/tiny-town",
      "attributionText": "Kenney (https://kenney.nl) — CC-BY-4.0",
      "assetsUsed": ["tiles/grass.png", "tiles/road.png", "buildings/house.png"]
    }
  ],
  "markdown": "## Third-Party Assets\n\n**Kenney Tiny Town** by Kenney (https://kenney.nl) -- CC-BY-4.0\nSource: https://kenney.nl/assets/tiny-town\nCredit: Kenney (https://kenney.nl) — CC-BY-4.0\nAssets: tiles/grass.png, tiles/road.png, buildings/house.png\n"
}

The markdown field is ready to embed in a credits screen or write to an ATTRIBUTION.md file.


Usage Guide

Search → Download → Track → Credit

  1. Search the catalog via POST /api/asset-packs/search with your style constraints and asset needs
  2. Evaluate results — check styleDescription, styleAnalysis.aspects, sample images, and score
  3. Download via POST /api/asset-packs/:slug/download with the asset IDs you want — pass gameSlug to link the download to a game
  4. Track — the downloadPackAssets() client helper auto-calls POST /api/games/:slug/assets/track; or call it manually
  5. Mark used — after wiring an asset into game code, call PUT /api/games/:slug/assets/mark-used with the source files that reference it
  6. Generate credits — call GET /api/games/:slug/credits before shipping to get a formatted attribution list

License compliance