Start every integration at v1.
https://www.palmods.gg/api/v1The unversioned /api alias is deprecated. Auth and upload routes are website internals and are excluded from the v1 rewrite.
Search the catalog, inspect safe release metadata, check compatibility, and connect community actions through a stable JSON API designed for Palworld tooling.
No API key is required for public reads. Responses use JSON unless an endpoint explicitly documents a redirect or RSS payload.
curl --get 'https://www.palmods.gg/api/v1/mods' \
--data-urlencode 'q=inventory' \
--data-urlencode 'loader_types=lua,pak' \
--data-urlencode 'platforms=steam' \
--data-urlencode 'sort=most_downloaded' \
--data-urlencode 'page_size=3'{
"mods": [
{
"id": "7fb3c6a8-1ac5-4e9a-8db1-cc7e66e4ad70",
"slug": "example-inventory-mod",
"title": "Example Inventory Mod",
"summary": "A representative search result.",
"category_slug": "gameplay",
"author_handle": "example-author",
"loader_type": "lua",
"platforms": ["steam"],
"download_count": 12480,
"likely_broken": false,
"newest_supported_version": "1.0"
}
],
"total": 18,
"page": 1,
"page_size": 3,
"facets": {
"categories": { "gameplay": 11, "utilities": 7 },
"sides": { "client": 15, "both": 3 },
"tags": { "inventory": 18 }
}
}Example records and UUIDs are illustrative. Production responses include the complete DTO fields documented by the typed client.
Versioning, credentials, filtering, and install capability negotiation are part of the public contract.
https://www.palmods.gg/api/v1The unversioned /api alias is deprecated. Auth and upload routes are website internals and are excluded from the v1 rewrite.
Send a Supabase access token as Authorization: Bearer …, or use the signed-in website cookie session for same-origin browser requests. Release automation instead uses a mod-scoped publish token from the author setup guide.
List filters accept comma-separated values; category and side also accept repeated query keys. Boolean filters accept 1 or true.
Send supported package contracts on detail and file requests. Unknown clients receive conservative auto_install_ready values.
Supported values are palmods_game_root_v1 and pocketpair_info_v1. Even after the API marks a file auto-install ready, clients must revalidate the downloaded archive, paths, checksums, and install rules before writing into the game directory.
Each example pairs the request with the shape your integration should be prepared to consume.
Pass the player’s exact environment and keep the returned reason available to explain the verdict.
curl 'https://www.palmods.gg/api/v1/mods/example-inventory-mod/compatibility?game_version=1.0&platform=steam'{
"mod_id": "7fb3c6a8-1ac5-4e9a-8db1-cc7e66e4ad70",
"verdict": "compatible",
"reason": "Supports Palworld 1.0 on Steam.",
"checked_against": {
"game_version": "1.0",
"platform": "steam",
"is_known_version": true
}
}The response combines scan state, supported game versions, normalized package metadata, and a download handoff URL.
curl --get 'https://www.palmods.gg/api/v1/mods/example-inventory-mod/files' \
--data-urlencode 'install_contracts=palmods_game_root_v1,pocketpair_info_v1'[
{
"id": "4ad74fb0-0f26-4613-bfd3-308c10b606fb",
"version": "2.1.0",
"release_channel": "release",
"loader_type": "lua",
"game_versions_supported": ["1.0"],
"virus_scan_status": "clean",
"download_ready": true,
"auto_install_ready": true,
"package_format": "pocketpair_info_v1",
"package_name": "ExampleInventoryMod",
"package_version": "2.1.0",
"official_dependencies": ["UE4SS"],
"download_url": "https://www.palmods.gg/api/download/4ad74fb0-0f26-4613-bfd3-308c10b606fb"
}
]The reviewer must have downloaded the mod, may submit only one review, and cannot be an author or co-author of that mod.
curl -X POST 'https://www.palmods.gg/api/v1/mods/example-inventory-mod/reviews' \
-H 'Authorization: Bearer YOUR_SUPABASE_ACCESS_TOKEN' \
-H 'Content-Type: application/json' \
--data '{
"rating": 5,
"title": "Works on my server",
"body": "Tested with four players and a clean save backup.",
"test_game_version": "1.0"
}'{
"id": "5ec2a1b5-a32b-4013-b092-51629ed4507d",
"mod_id": "7fb3c6a8-1ac5-4e9a-8db1-cc7e66e4ad70",
"rating": 5,
"title": "Works on my server",
"body": "Tested with four players and a clean save backup.",
"user_handle": "sample-user",
"test_game_version": "1.0",
"helpful_score": 0,
"author_response": null,
"created_at": "2026-07-15T20:14:00.000Z"
}Open any route to see its parameters, authentication boundary, response type, and important behavioral notes.
The core read path for browsers, launchers, desktop clients, and update checkers.
/api/v1/modsSearch and browse mods with faceted filters, sorting, and pagination.
SearchResult — mods, total, page, page_size, and category/side/tag facets.
qstringFull-text search across mod titles and summaries.
categorystring | CSVOne or more category slugs. Repeated values also work.
loader_typesCSVFilter by loader, such as lua or pak.
sidestring | CSVFilter by client_only, server_only, or both.
platformsCSVSupported game platforms.
game_versionstringDefaults to the current registered Palworld version.
tagsCSVRequire matching public tags.
dedicated_server_onlybooleanUse 1 or true to restrict results.
auto_installable_onlybooleanOnly return mods with a compatible one-click file.
include_nsfwbooleanNSFW results are excluded unless explicitly enabled.
sortenumrelevance, trending, newest, recently_updated, name, and other supported sorts.
time_windowenumtoday, week, month, or all for time-sensitive sorts.
pageintegerOne-based page number. Defaults to 1.
page_sizeintegerResults per page. Defaults to 24.
/api/v1/mods/{idOrSlug}Resolve one mod by UUID or slug, including author, requirements, gallery, and a primary file after install-contract negotiation.
ModDetailDTO with a capability-gated primary_file.
idOrSlugpathrequiredPublic mod UUID or URL slug.
install_contractsCSVPackage formats the installer understands.
/api/v1/mods/{idOrSlug}/filesList downloadable releases and their scan status, compatibility, and installation metadata.
ModFileDTO[] ordered by the repository file listing.
idOrSlugpathrequiredPublic mod UUID or slug.
include_oldbooleanUse 1 to include archived releases.
install_contractsCSVPackage formats the installer understands.
Public callers only receive downloadable files. Authors may see pending or rejected files in their own authenticated response.
/api/v1/mods/{idOrSlug}/compatibilityCheck whether the clean releases for a mod match a game version and platform.
Compatibility verdict, plain-language reason, and the environment checked.
idOrSlugpathrequiredPublic mod UUID or slug.
game_versionstringDefaults to the current registered version.
platformenumDefaults to steam.
Public feedback and aggregate activity without exposing private user data.
/api/v1/mods/{idOrSlug}/reviewsRead paginated ratings, written reviews, test versions, and author responses.
Paginated<ReviewDTO>.
pageintegerOne-based results page.
sortenumSupported review ordering.
ratingintegerRestrict to one rating from 1 through 5.
game_versionstringRestrict to a tested game version.
/api/v1/mods/{idOrSlug}/bugsRead public bug reports with status and priority filters.
Paginated<BugDTO>.
pageintegerOne-based results page.
statusenumRestrict reports by workflow status.
priorityenumRestrict reports by reported priority.
/api/v1/mods/{idOrSlug}/statsRead daily downloads, unique downloads, endorsements, views, and release breakdowns.
daily, files, and game_versions arrays. No personally identifiable data.
daysintegerWindow from 1 through 90 days. Defaults to 30.
Taxonomies, authors, collections, feeds, landing rails, and download handoff.
/api/v1/categoriesList the category taxonomy and public mod counts.
CategoryDTO[].
No query parameters or request body.
/api/v1/game-versionsList the Palworld version registry and identify the current release.
GameVersionDTO[].
No query parameters or request body.
/api/v1/authors/{handle}Resolve an author profile by handle together with their public mods.
Author profile fields plus a mods array.
handlepathrequiredCase-normalized public author handle.
/api/v1/collections/{idOrSlug}Resolve a collection, its pinned releases, notes, and load order.
Collection detail with ordered entries.
idOrSlugpathrequiredCollection UUID or slug.
/api/v1/landingLoad a curated public discovery rail.
Up to 12 public mod summaries.
sectionenumtrending, hot, newest, recently_updated, most_endorsed, or editors_picks.
/feedSubscribe to newly published and updated mods as RSS.
application/rss+xml rather than JSON.
categorystringOptional category slug.
game_versionstringOptional compatibility version.
The feed is intentionally unversioned and lives outside /api/v1.
/api/v1/download/{fileId}Record a valid download and redirect to a short-lived signed file URL.
HTTP redirect. Only clean, downloadable files are eligible.
fileIdpathrequiredFile UUID returned by a mod or files request.
Session-bound mutations for endorsements, follows, reviews, and bug reports.
/api/v1/mods/{idOrSlug}/endorseEndorse a mod after the authenticated user has downloaded it.
{ "ok": true }. Repeating the request is safe.
No query parameters or request body.
/api/v1/mods/{idOrSlug}/endorseRemove the current user’s endorsement.
{ "ok": true }. Repeating the request is safe.
No query parameters or request body.
/api/v1/mods/{idOrSlug}/followFollow a mod to receive release notifications.
{ "ok": true }. Repeating the request is safe.
No query parameters or request body.
/api/v1/mods/{idOrSlug}/followStop receiving release notifications for a mod.
{ "ok": true }. Repeating the request is safe.
No query parameters or request body.
/api/v1/mods/{idOrSlug}/reviewsCreate one review for a downloaded mod. Authors and co-authors cannot review their own work.
201 Created with the new ReviewDTO.
ratingintegerrequiredWhole number from 1 through 5.
titlestringOptional title, up to 200 characters.
bodystringOptional review body, up to 10,000 characters.
test_game_versionstringOptional version tested by the reviewer.
/api/v1/mods/{idOrSlug}/bugsCreate a public bug report against a mod.
201 Created with the new BugDTO.
titlestringrequiredShort issue title, up to 300 characters.
descriptionstringrequiredReproduction details, up to 20,000 characters.
priorityenumOptional domain priority.
affected_versionstringAffected mod release.
game_versionstringPalworld version used.
platformenumPlatform used during reproduction.
Durable, idempotent publishing for the first-party GitHub Action and CI clients.
/api/v1/publish/releasesCreate or replay an idempotent release job and receive a short-lived upload URL.
201 Created (or 200 replay) with job, upload, finalize_url, and status_url.
AuthorizationheaderrequiredBearer pmp_v1_ publish token bound to the target mod.
Idempotency-KeyheaderrequiredStable printable key, up to 200 characters, reused for workflow retries.
bodyJSONrequiredStrict release metadata, changelog, archive size, content type, and SHA-256.
Publish-token authentication only. Store the token as an encrypted CI secret and follow the author setup guide.
/api/v1/publish/releases/{jobId}/finalizeQueue an uploaded archive for durable verification and scanning.
202 Accepted while processing, or the current terminal job state on a replay.
jobIdpathrequiredJob UUID returned by release creation.
Safe to retry. The worker verifies the signed upload before creating a downloadable file.
/api/v1/publish/releases/{jobId}Read the safe status projection for a release job owned by the token.
Job status, author-safe error, and file/download links when ready.
jobIdpathrequiredJob UUID returned by release creation.
Nonterminal responses include Retry-After. Storage keys and raw scanner reports are never returned.
Display both the verdict and its reason. A single color or icon is not enough context for an install decision.
compatibleAn eligible release explicitly supports the requested game version and platform.
likely_brokenThe newest declared support predates the requested version, so breakage is likely but not proven.
unknownNo usable game-version declaration is available for a confident result.
incompatibleThe platform or execution-side requirements do not match the requested environment.
Non-2xx JSON responses return an { "error": "…" } object. Redirect endpoints are the exception.
400Bad requestInvalid JSON, unknown fields, or invalid values.401Authentication requiredMissing, invalid, or expired credentials.403ForbiddenSuspension, origin rejection, or a domain rule violation.404Not foundThe requested mod, author, collection, or file does not exist.409ConflictA non-idempotent resource already exists.429Rate limitedBack off before retrying the user action.500Server errorThe request could not be completed.{
"error": "Field \"rating\" must be an integer from 1 to 5."
}We are preparing @palmods/api-client as a public package with typed filters and DTOs, bearer authentication, install-format negotiation, and structured errors. Until it is released, use the HTTP examples and response contracts above.
// Coming soon — planned API
import { PalModsClient } from '@palmods/api-client';
const client = new PalModsClient({
baseUrl: 'https://www.palmods.gg/api/v1',
installContracts: ['pocketpair_info_v1'],
});
const result = await client.checkCompatibility(
'example-inventory-mod',
{ game_version: '1.0', platform: 'steam' },
);
if (result.verdict === 'compatible') {
const files = await client.listModFiles('example-inventory-mod');
console.log(files.filter((file) => file.auto_install_ready));
}