The ROMs API is the core of RomM’s programmatic interface, providing full CRUD access to your game library. Endpoints cover everything from browsing and filtering to metadata editing, file downloads, patch application, and bulk deletion.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/rommapp/romm/llms.txt
Use this file to discover all available pages before exploring further.
GET /api/roms
Retrieve a paginated, filtered, and sorted list of ROMs. This is the primary browse endpoint and powers the web UI’s game library view. Required scope:roms.read
Pagination
Number of ROMs per page (1–10 000).
Zero-based page offset.
Filters
Filter by one or more platform IDs. Repeat the parameter for multiple values.
Full-text search across ROM names.
Filter to ROMs in a specific collection.
Filter to ROMs in a virtual collection.
Filter to ROMs in a smart collection.
true returns only ROMs matched to at least one metadata source; false returns unmatched ROMs only.Filter by the current user’s favourite flag.
Filter ROMs flagged as duplicates.
true returns ROMs the current user has played before.Filter to ROMs that can be launched in the browser emulator.
Filter ROMs that are absent from the filesystem.
Filter ROMs with RetroAchievements data.
Filter ROMs the current user has saves for.
Filter ROMs the current user has save states for.
Filter ROMs verified by Hasheous.
Filter by genre tags (repeat for multiple). Logic controlled by
genres_logic.Filter by franchise. Logic controlled by
franchises_logic.Filter by collection name. Logic controlled by
collections_logic.Filter by associated company. Logic controlled by
companies_logic.Filter by age rating. Logic controlled by
age_ratings_logic.Filter by region tag (e.g.
USA, EUR). Logic controlled by regions_logic.Filter by language tag. Logic controlled by
languages_logic.Filter by custom filename tags (e.g.
Proto, Beta). Logic controlled by tags_logic.Filter by matched provider:
igdb, moby, ss, ra, launchbox, hasheous, flashpoint, hltb, gamelist, libretro. Logic controlled by metadata_providers_logic.Filter by user-set play status. Logic controlled by
statuses_logic.Filter by player count. Logic controlled by
player_counts_logic.Logic Operators
Each multi-value filter has a corresponding_logic parameter that accepts any (OR), all (AND), or none (NOT). For example: genres_logic=all returns only ROMs that match every listed genre.
Sorting
Field to sort by (e.g.
name, updated_at). Leave empty to sort by search relevance when a search_term is given (MySQL/MariaDB only; other databases fall back to name).Sort direction:
asc or desc.Incremental Sync
ISO 8601 datetime. Returns only ROMs updated after this timestamp.
Other Options
Group sibling ROMs (same game, multiple files) by their shared metadata ID.
Include each ROM’s file entries in the response.
Include a character index mapping for the AlphaStrip UI component.
Include the set of available filter values (genres, regions, etc.) for the filter sidebar.
GET /api/roms/identifiers
Retrieve only the IDs of all ROMs visible to the current user. Lightweight alternative to the full list. Required scope:roms.read
[101, 102, 103, ...]
GET /api/roms/download
Download multiple ROMs as a single zip file. Required scope:roms.read
Comma-separated list of ROM IDs (e.g.
1,2,3).Custom name for the output zip file (optional).
GET /api/roms/by-metadata-provider
Look up a single ROM by its external metadata ID. At least one ID parameter must be provided. Required scope:roms.read (unless DISABLE_DOWNLOAD_ENDPOINT_AUTH=true)
IGDB game ID.
MobyGames game ID.
ScreenScraper game ID.
RetroAchievements game ID.
LaunchBox game ID.
Hasheous game ID.
TheGamesDB game ID.
Flashpoint game ID.
HowLongToBeat game ID.
GET /api/roms/by-hash
Look up a single ROM by its file hash. At least one hash parameter must be provided. Required scope:roms.read (unless DISABLE_DOWNLOAD_ENDPOINT_AUTH=true)
CRC32 hash value.
MD5 hash value.
SHA1 hash value.
RetroAchievements hash value.
GET /api/roms/
Retrieve full details for a single ROM, including metadata, file list, platform info, and user-specific data. Required scope:roms.read (unless DISABLE_DOWNLOAD_ENDPOINT_AUTH=true)
ROM internal ID.
GET /api/roms//content/
Download a ROM file. For single-file ROMs the file is served directly; for multi-file ROMs a zip archive is returned. Required scope:roms.read (unless DISABLE_DOWNLOAD_ENDPOINT_AUTH=true)
ROM internal ID.
Used as the output filename (or zip filename). The actual file(s) served are determined by the database record.
Comma-separated list of file IDs to include for multi-part ROMs. If omitted, all files are included.
PUT /api/roms/
Update a ROM’s metadata. Acceptsmultipart/form-data so that cover artwork can be uploaded in the same request.
Required scope: roms.write
ROM internal ID.
DetailedRomSchema with updated fields.
POST /api/roms//patch
Apply a ROM patch file server-side and download the patched output. Both the base ROM file and the patch file must already exist in your library. Required scope:roms.read
ROM file ID of the base game file to patch.
ROM file ID of the patch file (
.ips, .bps, .xdelta, etc.).Custom name for the patched output file. If omitted, RomM derives one from the ROM and patch filenames.
application/octet-stream). The X-Patch-Validated response header is true when the patch’s source checksum matched the base ROM, or false when it did not (the output may still be usable).
There is a maximum file size for patching controlled by
ROM_PATCHER_MAX_FILE_SIZE_BYTES. Oversized files return 400 Bad Request.PUT /api/roms//props
Update ROM properties specific to the current user — play status, ratings, backlog flag, hidden flag, etc. Required scope:roms.user.write
ROM internal ID.
Set the last-played timestamp to now.
Clear the last-played timestamp.
POST /api/roms/delete
Delete one or more ROMs. Optionally also remove the files from disk. Required scope:roms.write
List of ROM IDs to delete from the database.
Subset of
roms IDs to also delete from the filesystem. Defaults to an empty list (database-only deletion).