Skip to content

JSON structure

Understand BDEngine export JSON, including the content wrapper, Minecraft version, visual entities, event data, metadata, and optional fields.

The JSON describes an export for an external integration. Its fields depend on the scene, export mode, and editor version. First identify how the data was obtained, then read its Minecraft version and available data sections.

The content wrapper

In a successful HTTP response, the export object is inside content:

{
"content": {
"version": "1.21.4",
"type": "modelOnly",
"meta": { "schema": 1, "animations": {}, "sounds": {} }
}
}

This abbreviated example shows the wrapper, not a visual model export.

Source Location of the export object Tag substitution
HTTP Server API The response’s content field [BDESERVERTAG] is replaced with tag
File > Export > JSON (.json) The root of the file [BDESERVERTAG] is retained
editorAPI.exportToJSON() The returned object [BDESERVERTAG] is retained

Local files and the plugin method do not require publication and do not receive a temporary ID. If present, project_id identifies the project, not the Server API publication.

version, type, and project_id

content.version

A string specifying the selected Minecraft version, such as "1.21.4". It determines the target syntax for data and commands. It is not the HTTP API version or the editor build number.

content.type

Value Meaning
"modelOnly" Model export
"full" Animator export, which may include animations and other project data

full does not guarantee every optional field. A project without sounds, for example, contains no sound events. It also does not indicate a complete set of data pack files.

content.project_id

An optional ID of the associated project. The current exporter writes it as a string if the project has an ID. It may be absent when no project is associated with the export. Do not use it in place of the HTTP request’s six-digit id.

passengers

content.passengers

An array of SNBT strings describing visual entities. A single string can contain multiple entities separated by commas. These strings have no outer summon command. See passengers: visual entities.

datapack and events

content.datapack

An object containing event data and related resources. The field name does not mean it contains a ready-to-use data pack archive. In particular, custom .mcfunction files are not included.

datapack.predicates may contain predicate definitions used by export commands. For example, particle_chance holds conditions for probabilistic particle emission. A key corresponds to the resource name referenced by a command, and its value is a predicate JSON object. The HTTP service does not evaluate these conditions.

content.datapack.anim_keyframes

An object arranged as animation name → frame index → array of command strings. Each index is a JSON string key. Use the matching entry in meta.animations to determine timing.

content.datapack.sound_keyframes

An object arranged as sound name → time index → array of command strings. Metadata is in meta.sounds. Intermediate indices may be absent. See anim_keyframes and sound_keyframes for examples and timing rules.

hitbox

content.hitbox

An array of strings containing hitbox creation commands. Unlike passengers, these are complete summon commands with coordinates and SNBT. The field appears when hitboxes are included in the export. See hitbox: additional entities.

Animation and sound metadata

The current value of meta.schema is 1. meta.animations and meta.sounds contain entries with the same keys as their corresponding frame sets:

{
"schema": 1,
"animations": {
"turn": { "name": "Turn", "durationTicks": 100, "stepTicks": 2 }
},
"sounds": {}
}
Entry field Type Meaning
name String Display name in the editor
durationTicks Number Duration in game ticks
stepTicks Number Game ticks per increment of the frame index

The key, such as turn, links the metadata to a frame set. name is for display. An empty object means there are no entries. Older exports may lack meta; you cannot reliably infer the time step from the indices alone.

Static model example

This illustrative example targets Minecraft 1.21.4 with tag=my_model. It demonstrates the data types and intentionally omits a project ID. The SNBT includes an identity transformation matrix.

{
"content": {
"version": "1.21.4",
"type": "modelOnly",
"passengers": [
"{id:\"minecraft:block_display\",block_state:{Name:\"minecraft:stone\"},transformation:[1f,0f,0f,0f,0f,1f,0f,0f,0f,0f,1f,0f,0f,0f,0f,1f],Tags:[\"my_model_0\"]}"
],
"meta": {
"schema": 1,
"animations": {},
"sounds": {}
}
}
}

JSON escaping such as \" belongs to the outer document. After parsing the JSON, passengers[0] contains ordinary SNBT quotation marks. This example explains the format; it is not a saved response for a live ID.

Types and optional fields

Field inside content Type When present
version String In current exports
type String: modelOnly or full In current exports
project_id String When an associated project exists
passengers Array of strings When the export contains visual entities
hitbox Array of strings When hitboxes are included
datapack Object When nested event or resource data exists
datapack.anim_keyframes Object of frame sets When animation frames have been recorded
datapack.sound_keyframes Object of frame sets When sound events exist
datapack.predicates Object of resources When export commands use predicates
meta Object Added by the current exporter; may be absent in older data

An absent optional field is not necessarily replaced with null, [], or {}. The current exporter omits empty string content. Event sets may contain both missing frame indices and explicit empty command arrays.

The outer JSON is not a universal JSON Schema for every Minecraft version. The syntax inside SNBT and command strings depends on the target version.

Put it into practice