Packs
Move or copy assets to another pack
The pack grid's Move to pack and Copy to pack: up to 60 assets, named by the kind and name the asset listing reports, into another pack this key can edit (to) or into a new pack made for them (newPackName, which counts against the pack limit like creating one). A model takes its textures with it; a custom item, its model.
Only the owner of this pack, or an admin of its team, may: taking assets out of a pack is a change to the pack. Each asset reports its own outcome, so one that cannot go (the target already reskins that vanilla block, say) does not stop the rest. replace lets a vanilla reskin overwrite the target's. Free.
/packs/{pack}/transferPath parameters
packstringrequiredThe pack's slug, as returned by the packs endpoints.
Body
assetsarray of objectrequiredmax 60 entriesThe assets, as {kind, name} from the listing.
kindstringrequiredIts kind.
namestringrequiredIts name.
tostringThe slug of the pack they go to. Send this or newPackName.
newPackNamestringmax 100 charactersMake a new pack of this name for them instead.
modestringdefault "move"move takes them out of this pack; copy leaves them in it too.
Options: move, copy
replacebooleandefault falseLet a vanilla reskin replace the target pack's own reskin of the same thing.
Response · 200
Each asset's outcome.
packstringrequiredThe pack they came from.
toobjectrequiredThe pack they went to, as {slug, name}.
resultsarray of objectrequiredOne outcome per asset.
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_json400The request body wasn't a JSON object.
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.
pack_limit_reached403The account is at its plan's pack limit.
plan_required403The key is valid, but its account's plan does not include the API.
not_found404No such pack, asset or job.