Normalise a glTF 2.0 binary (.glb) for a target engine and platform (scale, orie
Normalise a glTF 2.0 binary (.glb) for a target engine and platform (scale, orientation, origin), generate two simplified LODs and convex/trimesh collision, and prove the result loads via a real Godot 4 headless import. Returns a report plus artifacts: normalised .glb LODs, collision data, a Godot scene, a multi-view preview, and the full JSON report. Claims are scoped to the Godot 4 import; Unity/Unreal receive glTF-convention output without import proof.
Paid test badge: not yet. The checks above are free: we call the tool without paying and read the payment request it sends back. The Verified badge needs paid calls whose answers match the promised output, and nobody can buy a badge.
Endpoint
POST https://asset.api.williamrobinson.dev/v1/asset/prepare
| Category | Everything else |
|---|---|
| Provider host | asset.api.williamrobinson.dev |
| Networks | eip155:8453 |
| Payment schemes | exact |
| Self-reported calls, 30 days | 1 from 1 payers (the provider's figure, not ours) |
Our checks, last 30 days
| Day | Result | HTTP | Asked | Time |
|---|---|---|---|---|
| 2026-09-24 | valid payment request | 402 | $0.1 | 610 ms |
Example input (from the provider)
{
"body": {
"asset": "Z2xURgIAAACQCAAAlAQAAEpTT057ImFzc2V0Ijp7ImdlbmVyYXRvciI6ImdsVEYtVHJhbnNmb3JtIHY0LjUuMCIsInZlcnNpb24iOiIyLjAifSwiYWNjZXNzb3JzIjpbeyJ0eXBlIjoiVkVDMyIsImNvbXBvbmVudFR5cGUiOjUxMjYsImNvdW50IjoyNCwibWF4IjpbMC41LDAuNSwwLjVdLCJtaW4iOlstMC41LC0wLjUsLTAuNV0sImJ1ZmZlclZpZXciOjEsImJ5dGVPZmZzZXQiOjB9LHsidHlwZSI6IlZFQzMiLCJjb21wb25lbnRUeXBlIjo1MTI2LCJjb3VudCI6MjQsImJ1ZmZlclZpZXciOjEsImJ5dGVPZmZzZXQiOjEyfSx7InR5cGUiOiJWRUMyIiwiY29tcG9uZW50VHlwZSI6NTEyNiwiY291bnQiOjI0LCJidWZmZXJWaWV3IjoxLCJieXRlT2Zmc2V0IjoyNH0seyJ0eXBlIjoiU0NBTEFSIiwiY29tcG9uZW50VHlwZSI6NTEyMywiY291bnQiOjM2LCJidWZmZXJWaWV3IjoyLCJieXRlT2Zmc2V0IjowfV0sImJ1ZmZlclZpZXdzIjpbeyJidWZmZXIiOjAsImJ5dGVPZmZzZXQiOjg0MCwiYnl0ZUxlbmd0aCI6MTUyfSx7ImJ1ZmZlciI6MCwiYnl0ZU9mZnNldCI6MCwiYnl0ZUxlbmd0aCI6NzY4LCJieXRlU3RyaWRlIjozMiwidGFyZ2V0IjozNDk2Mn0seyJidWZmZXIiOjAsImJ5dGVPZmZzZXQiOjc2OCwiYnl0ZUxlbmd0aCI6NzIsInRhcmdldCI6MzQ5NjN9XSwic2FtcGxlcnMiOlt7IndyYXBTIjoxMDQ5Nywid3JhcFQiOjEwNDk3fV0sInRleHR1cmVzIjpbeyJzb3VyY2UiOjAsInNhbXBsZXIiOjB9XSwiaW1hZ2VzIjpbeyJuYW1lIjoiY2hlY2tlciIsIm1pbWVUeXBlIjoiaW1hZ2UvcG5nIiwiYnVmZmVyVmlldyI6MH1dLCJidWZmZXJzIjpbeyJieXRlTGVuZ3RoIjo5OTJ9XSwibWF0ZXJpYWxzIjpbeyJuYW1lIjoiY3ViZS1tYXRlcmlhbCIsInBick1ldGFsbGljUm91Z2huZXNzIjp7InJvdWdobmVzc0ZhY3RvciI6MC44LCJtZXRhbGxpY0ZhY3RvciI6MCwiYmFzZUNvbG9yVGV4dHVyZSI6eyJpbmRleCI6MH19fV0sIm1lc2hlcyI6W3sibmFtZSI6ImN1YmUiLCJwcmltaXRpdmVzIjpbeyJhdHRyaWJ1dGVzIjp7IlBPU0lUSU9OIjowLCJOT1JNQUwiOjEsIlRFWENPT1JEXzAiOjJ9LCJtb2RlIjo0LCJtYXRlcmlhbCI6MCwiaW5kaWNlcyI6M31dfV0sIm5vZGVzIjpbeyJuYW1lIjoiY3ViZSIsIm1lc2giOjB9XSwic2NlbmVzIjpbeyJuYW1lIjoic2NlbmUiLCJub2RlcyI6WzBdfV0sInNjZW5lIjowfSAgIOADAABCSU4AAAAAPwAAAL8AAAC/AACAPwAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAPwAAAL8AAIA/AAAAAAAAAAAAAIA/AAAAAAAAAD8AAAA/AAAAPwAAgD8AAAAAAAAAAAAAgD8AAIA/AAAAPwAAAL8AAAA/AACAPwAAAAAAAAAAAAAAAAAAgD8AAAC/AAAAvwAAAL8AAIC/AAAAAAAAAAAAAAAAAAAAAAAAAL8AAAA/AAAAvwAAgL8AAAAAAAAAAAAAgD8AAAAAAAAAvwAAAD8AAAA/AACAvwAAAAAAAAAAAACAPwAAgD8AAAC/AAAAvwAAAD8AAIC/AAAAAAAAAAAAAAAAAACAPwAAAL8AAAA/AAAAvwAAAAAAAIA/AAAAAAAAAAAAAAAAAAAAvwAAAD8AAAA/AAAAAAAAgD8AAAAAAACAPwAAAAAAAAA/AAAAPwAAAD8AAAAAAACAPwAAAAAAAIA/AACAPwAAAD8AAAA/AAAAvwAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAvwAAAL8AAAC/AAAAAAAAgL8AAAAAAAAAAAAAAAAAAAC/AAAAvwAAAD8AAAAAAACAvwAAAAAAAIA/AAAAAAAAAD8AAAC/AAAAPwAAAAAAAIC/AAAAAAAAgD8AAIA/AAAAPwAAAL8AAAC/AAAAAAAAgL8AAAAAAAAAAAAAgD8AAAC/AAAAvwAAAD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAAD8AAAC/AAAAPwAAAAAAAAAAAACAPwAAgD8AAAAAAAAAPwAAAD8AAAA/AAAAAAAAAAAAAIA/AACAPwAAgD8AAAC/AAAAPwAAAD8AAAAAAAAAAAAAgD8AAAAAAACAPwAAAL8AAAC/AAAAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAPwAAAL8AAAC/AAAAAAAAAAAAAIC/AACAPwAAAAAAAAA/AAAAPwAAAL8AAAAAAAAAAAAAgL8AAIA/AACAPwAAAL8AAAA/AAAAvwAAAAAAAAAAAACAvwAAAAAAAIA/AAABAAIAAAACAAMABAAFAAYABAAGAAcACAAJAAoACAAKAAsADAANAA4ADAAOAA8AEAARABIAEAASABMAFAAVABYAFAAWABcAiVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAABlBMVEXWxKhcbHrpdFJRAAAACXBIWXMAAAPoAAAD6AG1e1JrAAAAOElEQVR42u3UoQ0AAAgDMPj/aQyCIHEknZupmFhEJzvXDvgNGA8wYwt/YDyALQD+AOAPAP4AsIACFA8IAXCt1BQAAAAASUVORK5CYII=",
"expect": {
"size": {
"axis": "y",
"metres": 1.5,
"tolerance": 0.05
}
},
"target": {
"collision": "convex",
"engine": "godot4",
"origin": "floor",
"platform": "desktop",
"size": {
"axis": "y",
"metres": 1.5
}
}
},
"bodyType": "json",
"method": "POST",
"type": "http"
}
Promised output schema (from the provider)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"input": {
"additionalProperties": false,
"properties": {
"body": {
"$defs": {
"axis": {
"enum": [
"y",
"z"
],
"type": "string"
},
"collision": {
"enum": [
"none",
"convex",
"convex+trimesh"
],
"type": "string"
},
"size": {
"additionalProperties": false,
"properties": {
"axis": {
"$ref": "#/properties/input/properties/body/$defs/sizeAxis"
},
"metres": {
"exclusiveMinimum": 0,
"maximum": 1000,
"type": "number"
}
},
"required": [
"axis",
"metres"
],
"type": "object"
},
"sizeAxis": {
"enum": [
"x",
"y",
"z",
"max"
],
"type": "string"
},
"target": {
"additionalProperties": false,
"properties": {
"collision": {
"$ref": "#/properties/input/properties/body/$defs/collision",
"default": "convex",
"description": "Generate collision: none, a convex hull, or a convex hull plus a static trimesh."
},
"engine": {
"enum": [
"godot4",
"unity",
"unreal",
"gltf"
],
"type": "string"
},
"maxTextureSize": {
"description": "Maximum texture edge in pixels; defaults per platform (mobile 1024, desktop 2048) when omitted.",
"maximum": 8192,
"minimum": 1,
"type": "integer"
},
"origin": {
"default": "keep",
"description": "Where the origin ends up: unchanged, the bounds centre, or the centre of the bottom face.",
"enum": [
"keep",
"center",
"floor"
],
"type": "string"
},
"platform": {
"enum": [
"mobile",
"desktop"
],
"type": "string"
},
"size": {
"$ref": "#/properties/input/properties/body/$defs/size",
"description": "Desired extent in metres along `axis` after normalisation; omitted keeps the source scale."
},
"sourceUp": {
"$ref": "#/properties/input/properties/body/$defs/axis",
"default": "y",
"description": "The source's up axis when known to be Z-up (Blender/Max exports); glTF is Y-up by default."
}
},
"required": [
"engine",
"platform"
],
"type": "object"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"asset": {
"contentEncoding": "base64",
"description": "Base64-encoded glTF 2.0 binary (.glb) with embedded textures only (external URIs are rejected); decoded size must not exceed 4194304 bytes.",
"maxLength": 5592408,
"minLength": 1,
"type": "string"
},
"expect": {
"additionalProperties": false,
"properties": {
"minAnimations": {
"maximum": 64,
"minimum": 0,
"type": "integer"
},
"rigged": {
"description": "Require a skeleton (skinned character) to be present.",
"type": "boolean"
},
"size": {
"additionalProperties": false,
"description": "Expected extent in metres along `axis`, checked within `tolerance` (a fraction).",
"properties": {
"axis": {
"$ref": "#/properties/input/properties/body/$defs/sizeAxis"
},
"metres": {
"exclusiveMinimum": 0,
"maximum": 1000,
"type": "number"
},
"tolerance": {
"default": 0.05,
"maximum": 0.5,
"minimum": 0,
"type": "number"
}
},
"required": [
"axis",
"metres"
],
"type": "object"
}
},
"type": "object"
},
"target": {
"$ref": "#/properties/input/properties/body/$defs/target"
}
},
"required": [
"asset",
"target"
],
"type": "object"
},
"bodyType": {
"enum": [
"json",
"form-data",
"text"
],
"type": "string"
},
"method": {
"enum": [
"POST"
],
"type": "string"
},
"type": {
"const": "http",
"type": "string"
}
},
"required": [