What Runtime Identifiers Actually Do
When Minecraft spawns an entity, it does not just read the JSON file; it instantiates an internal C++ object to represent that entity in the world. If you do not define a runtime_identifier in your entity's description block, the game defaults to a generic base mob class. That generic class comes with basic living-mob assumptions: it has health, it can be pushed, it renders a death animation where it tips over sideways and emits white smoke particles, and it responds to standard AI goals.
By specifying a vanilla entity identifier in the runtime_identifier field, you tell the engine to construct your custom entity on top of that vanilla entity's C++ foundation instead. Your custom JSON components still load and override the data-driven parts of that entity, so you are not simply copying the vanilla mob's behavior pack file. Instead, you are inheriting the non-data-driven engine quirks that are never exposed in JSON.
This is strictly a behavior pack concept. You do not put runtime_identifier in the resource pack client_entity file. However, some runtime identifiers pass special engine values or hard-coded bone transformations down to the client renderer, so your resource pack geometry and animations occasionally need to account for the identifier you chose on the server side.
Syntax and Placement
The runtime_identifier field lives directly inside the description object of your behavior pack entity file, right alongside identifier, is_spawnable, and is_summonable. Its value must always be a valid vanilla entity identifier prefixed with the minecraft: namespace. You cannot point a runtime identifier at another custom entity.
Here is a minimal setup for a custom dummy entity that uses the armor stand runtime identifier so that it does not tip over and emit smoke when killed, behaving more like a non-living prop.
{
"format_version": "1.20.40",
"minecraft:entity": {
"description": {
"identifier": "wiki:training_dummy",
"runtime_identifier": "minecraft:armor_stand",
"is_spawnable": true,
"is_summonable": true
},
"components": {
"minecraft:type_family": {
"family": [ "dummy", "inanimate" ]
},
"minecraft:collision_box": {
"width": 0.6,
"height": 1.8
},
"minecraft:health": {
"value": 20,
"max": 20
},
"minecraft:physics": {
"has_collision": true,
"has_gravity": true
},
"minecraft:pushable": {
"is_pushable": false,
"is_pushable_by_piston": true
}
}
}
}Commonly Used Vanilla Identifiers
While you can technically put almost any vanilla mob into runtime_identifier, most creators only ever use a small handful of them. Most standard animal or monster behaviors are already exposed as JSON components, so borrowing the runtime of a cow or a creeper rarely gives you anything you could not build cleanly yourself.
The table below covers the identifiers that remain useful in modern add-on development because their C++ behavior has no exact JSON equivalent.
| Runtime Identifier | Hard-coded Behavior Inherited | Side Effects and Quirks |
|---|---|---|
| minecraft:armor_stand | Removes the sideways death tilt and death smoke particles; destroys quickly when hit in Creative mode. | Applies hard-coded pose rotations if not overridden; disables standard AI navigation and movement goals. |
| minecraft:snowball | Allows the entity to be rendered using a 2D sprite texture that always faces the player camera. | Expects the minecraft:projectile component; disappears or breaks if treated like a walking mob. |
| minecraft:arrow | Sticks into solid block faces on impact instead of bouncing or vanishing immediately. | Hard-codes specific projectile orientation based on velocity; can sometimes be picked up like a vanilla arrow if not configured carefully. |
| minecraft:boat | Floats on top of water blocks with buoyant physics instead of sinking or bobbing like a swimming mob. | Forces hard-coded rowing controls and camera clamping when ridden; ignores normal walking AI. |
| minecraft:iron_golem | Historically used to add knockback resistance and upward-flinging melee attacks. | Forces a hard-coded walking wobble animation on standard bone names; largely obsolete now that minecraft:knockback_resistance exists. |
| minecraft:shulker | Snaps the entity position to the block grid and provides a solid, block-like collision box that players can stand on. | Cannot move smoothly between coordinates; locks body rotation to cardinal directions. |
| minecraft:ThrownTrident | Behaves like a heavy projectile that sticks into blocks and resists water drag. | Uses a legacy PascalCase identifier string in some older format versions; test carefully with minecraft:trident in modern formats. |
Unwanted Side Effects and Limitations
Because C++ code runs underneath the JSON layer, anything hard-coded into a runtime identifier will stubbornly override or conflict with your behavior components. If you give a custom entity the minecraft:armor_stand or minecraft:boat runtime identifier, you cannot simply drop minecraft:navigation.walk and minecraft:behavior.random_stroll into its components and expect it to walk around. The underlying C++ class for an armor stand does not tick movement AI the way a Mob class does.
Sounds and item interactions are another frequent trap. An entity using minecraft:armor_stand will play wooden hit sounds and let players swap armor onto its slots unless you explicitly lock or override its equipment interaction components. An entity using minecraft:minecart will snap onto rail blocks whether you want it to or not.
On the visual side, several vanilla identifiers manipulate specific bone names in the geometry before your resource pack animations even run. For example, sheep and iron golem runtimes apply hard-coded head or body movements if your model happens to use the exact same bone names as the vanilla geometry (such as body, head, leg0). If you must use a mob runtime identifier and see weird twitching in your custom model, rename the bones in your custom geo file so the hard-coded C++ animator cannot find them.
When to Avoid Runtime Identifiers
Before reaching for a runtime identifier, check whether a modern component or Molang query solves your problem natively. Years ago, creators used minecraft:armor_stand for every piece of custom furniture just to hide the death animation, and used minecraft:ender_crystal or minecraft:shulker for solid hitboxes. Today, custom blocks with custom geometry handle furniture and solid collision cleanly without spawning ticking entities that lag the server.
Similarly, if your only goal in using minecraft:armor_stand is to stop an entity from tipping over and puffing smoke when it dies, you can often avoid the runtime identifier entirely. triggering a custom death event via minecraft:damage_sensor on fatal damage and calling a command or an instant despawn component removes the entity before the vanilla death state ever plays, letting your entity keep full access to standard mob AI and navigation.
Which versions this applies to
Available in all modern Bedrock versions since 1.8.0. Does not require any experimental toggles.
When it does not work
| What you see | Why | The fix |
|---|---|---|
| Custom entity spawns, stands completely still, and ignores all movement and navigation components. | You assigned a non-mob runtime_identifier such as minecraft:armor_stand, minecraft:boat, or minecraft:minecart. Their internal C++ classes do not run the AI goal selector or pathfinding engine. | Remove the runtime_identifier so the entity defaults to the generic mob runtime, and replicate the desired trait (such as no death smoke or knockback immunity) using JSON components like minecraft:knockback_resistance or instant despawn events. |
| Content Log shows an error on world load or the runtime behavior simply fails to apply when pointing to another custom entity. | You placed a custom namespace (for example, "wiki:base_npc") inside runtime_identifier. The engine only has C++ classes for built-in vanilla entities. | Change runtime_identifier to a valid "minecraft:" identifier. If you want multiple custom entities to share JSON configurations, use template files at build time or component groups rather than runtime_identifier. |
| Parts of your custom 3D model twist, bob, or snap to strange angles without any animations playing in your resource pack. | The vanilla runtime identifier you chose has hard-coded C++ bone animations that target standard vanilla bone names like "head", "body", or "rightArm". | Open your model in Blockbench, rename the affected bones to unique names (like "custom_head" or "root_body"), and update your animation files to match the new bone names. |
Reference, straight from the game files
Read out of the game itself, so the ids match the version you are building for.
