Packs
Duplicate an asset
A copy of an asset in the same pack, under a new name: the right-click menu's Duplicate. Free, but it is a new asset, so it counts against the pack's asset limit. Something a pack can hold only one of (a vanilla block or item reskin, a HUD, an armour set) answers skipped with the reason rather than an error.
/packs/{pack}/assets/{kind}/{name}/duplicatePath parameters
packstringrequiredThe pack's slug, as returned by the packs endpoints.
kindstringrequiredThe asset's kind from the listing, or emote.
Options: texture, model, font, sound, shader, vfx, emote, emote_group
namestringrequiredThe asset's name from the listing.
Response · 200
What happened to it.
packstringrequiredThe pack.
resultobjectrequiredThe copy.
typestringrequiredWhat the asset is.
idstringrequiredIts id in the pack it came from.
statusstringrequiredtransferred when it went, skipped when it could not (see reason), failed when something went wrong.
Options: transferred, skipped, failed
newIdstringrequiredWhat it is called where it landed: usually its own id, the next free one when that was taken. Null unless transferred.
reasonstringrequiredWhy it didn't go, completing "Couldn't move it: ...". Null when it did.
Error codes
Branch on error.code, never on the message.
invalid_request400Something in the body or query is wrong. message says what.
invalid_api_key401The key isn't one of ours, or it has been revoked.
missing_api_key401No Authorization: Bearer header was sent.
wrong_key_kind401An MCP key sent to the REST API, or an API key sent to the MCP server. Each only opens its own.
account_suspended403The account is suspended, so its keys open nothing. message says until when, if the suspension has an end date.
asset_limit_reached403The pack is at its asset limit.
forbidden403Valid key, but not permitted to do this in this pack.
plan_required403The key is valid, but its account's plan does not include the API.
not_found404No such pack, asset or job.