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.