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 theapi.subdomain) serves developer documentation, not the API. Always useapi.looploop.devfor 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:
- Reference-only by default: Metadata + source link + sample images. Full files are stored only for promoted packs.
- License tiers:
redistributable(CC0, MIT, CC-BY, etc.) vsreference_only(NC, ND, ambiguous) - Download types:
agent(auto-downloadable),manual,donate,paid - Style analysis: Each pack is scored across 7 aspects (shading, edges, surface detail, color, form language, material rendering, overall feel) with a consistency score
Browse Packs
GET /api/asset-packs
Browse and search the catalog. No auth required.
Query parameters:
| Param | Type | Description |
|---|---|---|
q | string | Full-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. |
packType | string | Pack type filter: sprites, interface, models, audio, fonts, icon-fonts, kits |
tags | string | Comma-separated tag filter |
category | string | Asset category filter (free-form, e.g. “characters”, “vehicles”, “terrain”) |
artStyle | string | Art style filter (free-form tags, e.g. “soft-shading”, “low-poly”, “cartoonish”) |
perspective | string | Perspective filter (top-down, side-scroll, isometric, etc.) |
resolution | string | Resolution filter (16x16, 32x32, etc.) |
engine | string | Engine compatibility filter |
source | string | Source filter (kenney, opengameart, itch, github) |
sort | string | Sort order: downloads (default), newest, consistency |
limit | number | Max results (default 20, max 100) |
offset | number | Pagination 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:
| Param | Type | Description |
|---|---|---|
status | string | Filter 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:
| Param | Type | Description |
|---|---|---|
all | string | Set 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
- Search the catalog via
POST /api/asset-packs/searchwith your style constraints and asset needs - Evaluate results — check
styleDescription,styleAnalysis.aspects, sample images, andscore - Download via
POST /api/asset-packs/:slug/downloadwith the asset IDs you want — passgameSlugto link the download to a game - Track — the
downloadPackAssets()client helper auto-callsPOST /api/games/:slug/assets/track; or call it manually - Mark used — after wiring an asset into game code, call
PUT /api/games/:slug/assets/mark-usedwith the source files that reference it - Generate credits — call
GET /api/games/:slug/creditsbefore shipping to get a formatted attribution list
License compliance
- Packs with
downloadType: 'agent'can be fetched automatically - Packs with
manual,donate, orpaiddownload types appear in search results but require human action to acquire - Only
redistributabletier packs should be downloaded into games;reference_onlyandunknownpacks are for inspiration only - For packs where
attributionRequiredistrue, add the pack’sattributionTextto your credits - Call
GET /api/games/:slug/creditsto auto-generate the full attribution list from tracked usage - When removing an asset, call
mark-usedwithstatus: "removed"to preserve audit history