mirrored listing x402 eip155:8453

Normalise a glTF 2

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.

Do you run asset.api.williamrobinson.dev? This listing was mirrored from Coinbase's public Bazaar. Claim it in 30 seconds — no account required — and it becomes verified, permanently overriding the mirrored copy.

Claim this listing
100000 (raw units)
price
1
calls / 30d
1
unique payers
2026-09-11
updated

Provider

asset.api.williamrobinson.dev · discovered, not yet claimed by its owner

Payment (x402 accepts[])

[
  {
    "scheme": "exact",
    "network": "eip155:8453",
    "payTo": "0x26026370fe8b2bb17af9092a17691c76519366da",
    "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "amount": "100000",
    "maxTimeoutSeconds": 300
  }
]

Output schema

{
  "bazaar": {
    "info": {
      "input": {
        "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"
      },
      "output": {
        "example": {
          "artifacts": [
            {
              "href": "https://asset.api.williamrobinson.dev/v1/asset/artifacts/0123456789abcdef0123456789abcdef0123456789abcdef/asset.glb",
              "mediaType": "model/gltf-binary",
              "name": "asset.glb",
              "sha256": "2a0a6c99a17389b01c396387e77314d0e310b051a9d678615cf93466265a67f3",
              "sizeBytes": 2192
            },
            {
              "href": "https://asset.api.williamrobinson.dev/v1/asset/artifacts/0123456789abcdef0123456789abcdef0123456789abcdef/asset-lod1.glb",
              "mediaType": "model/gltf-binary",
              "name": "asset-lod1.glb",
              "sha256": "2a0a6c99a17389b01c396387e77314d0e310b051a9d678615cf93466265a67f3",
              "sizeBytes": 2192
            },
            {
              "href": "https://asset.api.williamrobinson.dev/v1/asset/artifacts/0123456789abcdef0123456789abcdef0123456789abcdef/asset-lod2.glb",
              "mediaType": "model/gltf-binary",
              "name": "asset-lod2.glb",
              "sha256": "2a0a6c99a17389b01c396387e77314d0e310b051a9d678615cf93466265a67f3",
              "sizeBytes": 2192
            },
            {
              "href": "https://asset.api.williamrobinson.dev/v1/asset/artifacts/0123456789abcdef0123456789abcdef0123456789abcdef/collision.json",
              "mediaType": "application/json",
              "name": "collision.json",
              "sha256": "fdd3b75d3487097c27178cdca98bcac4eb4f11a543a4bcdd6ffc5be5344501a7",
              "sizeBytes": 734
            },
            {
              "href": "https://asset.api.williamrobinson.dev/v1/asset/artifacts/0123456789abcdef0123456789abcdef0123456789abcdef/godot-scene.tscn",
              "mediaType": "text/plain; charset=utf-8",
              "name": "godot-scene.tscn",
              "sha256": "c1fb2c48896dad0573523724f75dccae20ee908ce9b4b781da13fa5d6008da49",
              "sizeBytes": 718
            },
            {
              "href": "https://asset.api.williamrobinson.dev/v1/asset/artifacts/0123456789abcdef0123456789abcdef0123456789abcdef/preview.png",
              "mediaType": "image/png",
              "name": "preview.png",
              "sha256": "47b2fd78499eaa90802e7b6cb6975eb768d9265aa4e09f2f44b8e2b0dd265cb8",
              "sizeBytes": 58228
            },
            {
              "href": "https://asset.api.williamrobinson.dev/v1/asset/artifacts/0123456789abcdef0123456789abcdef0123456789abcdef/report.json",
              "mediaType": "application/json",
              "name": "report.json",
              "sha256": "a0cbca1d625aa46f23af80b57a8b98db3e1f77d424cce01643d0b8aec80ad853",
              "sizeBytes": 5351
            }
          ],
          "checks": [
            {
              "code": "structure_valid",
              "detail": "The glTF binary passed header, JSON, and gltf-validator structural checks.",
              "status": "passed"
            },
            {
              "code": "no_external_uris",
              "detail": "No buffer or image referenced an external (non-data:) URI.",
              "status": "passed"
            },
            {
              "code": "within_limits",
              "detail": "Triangle, material, texture, texture-pixel, and node counts are within configured limits.",
              "status": "passed"
            },
            {
              "code": "bounds_expected",
              "detail": "Expected extent along 'y' of 1.5 m; output measures 1.5000 m.",
              "status": "passed"
            },
            {
              "code": "rigged_expected",
              "detail": "No expect.rigged was declared.",
              "status": "not_checked"
            },
            {
              "code": "animations_expected",
              "detail": "No expect.minAnimations was declared.",
              "status": "not_checked"
            },
            {
              "code": "engine_loaded",
              "detail": "The output asset loaded and instantiated in Godot 4 headless.",
              "status": "passed"
            },
            {
              "code": "textures_within_budget",
              "detail": "Largest output texture edge is 64px against a 2048px budget.",
              "status": "passed"
            },
            {
              "code": "power_of_two_textures",
              "detail": "All output textures have power-of-two dimensions.",
              "status": "passed"
            },
            {
              "code": "lods_generated",
              "detail": "LOD1/LOD2 are identical to LOD0; the geometry is already below the simplifier's useful reduction threshold.",
              "status": "passed"
            },
            {
              "code": "collision_generated",
              "detail": "Convex hull has 8 vertices.",
              "status": "passed"
            }
          ],
          "collision": {
            "convexHullVertices": 8,
            "kind": "convex",
            "trimeshTriangles": 0
          },
          "engineLoad": {
            "animations": [],
            "engine": "4.7.2.stable.official.ed1daf0bf",
            "errors": [],
            "loaded": true,
            "materials": 1,
            "meshInstances": 1,
            "nodes": 2,
            "skeletons": 0
          },
          "expiresAt": "2026-01-04T03:04:05.000Z",
          "limitations": [
            "No Unity or Unreal import is executed; for those engines the asset is normalised to standard glTF conventions their importers expect, not verified by running an actual Unity/Unreal import.",
            "Draco, EXT_meshopt_compression, and KTX2 (KHR_texture_basisu) inputs are rejected in v1; only embedded, uncompressed glTF geometry and PNG/JPEG textures are accepted.",
            "Normal-map and other non-colour texture colour space is not verified; textures are resized without reinterpreting their intended colour space.",
            "LOD error is the meshoptimizer geometric error bound actually reached (as a fraction of mesh radius), not a measure of visual/perceptual difference, and is not a proof the LODs are optimal.",
            "Godot's collision generation operates on the LOD0 mesh merged into one shape; per-part or compound collision shapes are not produced."
          ],
          "lods": [
            {
              "bytes": 2192,
              "error": 0,
              "name": "asset.glb",
              "ratio": 1,
              "triangles": 12,
              "vertices": 24
            },
            {
              "bytes": 2192,
              "error": 0,
              "name": "asset-lod1.glb",
              "ratio": 0.5,
              "triangles": 12,
              "vertices": 24
            },
            {
              "bytes": 2192,
              "error": 0,
              "name": "asset-lod2.glb",
              "ratio": 0.25,
              "triangles": 12,
              "vertices": 24
            }
          ],
          "normalization": {
            "rotationXDegrees": 0,
            "scale": 1.5,
            "translation": [
              0,
              0.75,
              0
            ]
          },
          "output": {
            "animations": 0,
            "bones": 0,
            "bounds": {
              "max": [
                0.75,
                1.5,
                0.75
              ],
              "min": [
                -0.75,
                0,
                -0.75
              ],
              "size": [
                1.5,
                1.5,
                1.5
              ]
            },
            "bytes": 2192,
            "materials": 1,
            "maxTextureEdge": 64,
            "meshes": 1,
            "nodes": 1,
            "primitives": 1,
            "skins": 0,
            "textures": 1,
            "triangles": 12,
            "vertices": 24
          },
          "repairs": [],
          "source": {
            "animations": 0,
            "bones": 0,
            "bounds": {
              "max": [
                0.5,
                0.5,
                0.5
              ],
              "min": [
                -0.5,
                -0.5,
                -0.5
              ],
              "size": [
                1,
                1,
                1
              ]
            },
            "bytes": 2192,
            "materials": 1,
            "maxTextureEdge": 64,
            "meshes": 1,
            "nodes": 1,
            "primitives": 1,
            "skins": 0,
            "textures": 1,
            "triangles": 12,
            "validatorErrors": 0,
            "validatorWarnings": 0,
            "vertices": 24
          },
          "status": "passed",
          "target": {
            "collision": "convex",
            "engine": "godot4",
            "maxTextureSize": 2048,
            "origin": "floor",
            "platform": "desktop",
            "size": {
              "axis": "y",
              "metres": 1.5
            },
            "sourceUp": "y"
          },
          "tools": {
            "engine": "4.7.2.stable.official.ed1daf0bf",
            "transform": "@gltf-transform/[email protected] [email protected] [email protected] [email protected]",
            "validator": "[email protected]"
          },
          "truncated": false,
          "validator": [],
          "warnings": [
            "LOD simplifier could not reduce a mesh primitive below its LOD0 triangle count (12 triangles); the geometry is likely already below the simplifier's useful reduction threshold.",
            "LOD simplifier could not reduce a mesh primitive below its LOD0 triangle count (12 triangles); the geometry is likely already below the simplifier's useful reduction threshold."
          ]
        },
        "type": "json"
      }
    },
    "schema": {
      "$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": [
            "type",
            "method",
            "bodyType",
            "body"
          ],
          "type": "object"
        },
        "output": {
          "properties": {
            "example": {
              "$defs": {
                "artifact": {
                  "additionalProperties": false,
                  "properties": {
                    "href": {
                      "format": "uri",
                      "type": "string"
                    },
                    "mediaType": {
                      "maxLength": 128,
                      "minLength": 1,
                      "type": "string"
                    },
                    "name": {
                      "enum": [
                        "asset.glb",
                        "asset-lod1.glb",
                        "asset-lod2.glb",
                        "collision.json",
                        "godot-scene.tscn",
                        "preview.png",
                        "report.json"
                      ],
                      "type": "string"
                    },
                    "sha256": {
                      "pattern": "^[a-f0-9]{64}$",
                      "type": "string"
                    },
                    "sizeBytes": {
                      "minimum": 0,
                      "type": "integer"
                    }
                  },
                  "required": [
                    "name",
                    "mediaType",
                    "sizeBytes",
                    "sha256",
                    "href"
                  ],
                  "type": "object"
                },
                "bounds": {
                  "additionalProperties": false,
                  "properties": {
                    "max": {
                      "$ref": "#/properties/output/properties/example/$defs/vector3"
                    },
                    "min": {
                      "$ref": "#/properties/output/properties/example/$defs/vector3"
                    },
                    "size": {
                      "$ref": "#/properties/output/properties/example/$defs/vector3"
                    }
                  },
                  "required": [
                    "min",
                    "max",
                    "size"
                  ],
                  "type": "object"
                },
                "check": {
                  "additionalProperties": false,
                  "properties": {
                    "code": {
                      "type": "string"
                    },
                    "detail": {
                      "maxLength": 2048,
                      "type": "string"
                    },
                    "status": {
                      "enum": [
                        "passed",
                        "failed",
                        "not_checked"
                      ],
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "status",
                    "detail"
                  ],
                  "type": "object"
                },
                "collision": {
                  "enum": [
                    "none",
                    "convex",
                    "convex+trimesh"
                  ],
                  "type": "string"
                },
                "lod": {
                  "additionalProperties": false,
                  "properties": {
                    "bytes": {
                      "minimum": 0,
                      "type": "integer"
                    },
                    "error": {
                      "minimum": 0,
                      "type": "number"
                    },
                    "name": {
                      "enum": [
                        "asset.glb",
                        "asset-lod1.glb",
                        "asset-lod2.glb"
                      ],
                      "type": "string"
                    },
                    "ratio": {
                      "maximum": 1,
                      "minimum": 0,
                      "type": "number"
                    },
                    "triangles": {
                      "maximum": 250000,
                      "minimum": 0,
                      "type": "integer"
                    },
                    "vertices": {
                      "minimum": 0,
                      "type": "integer"
                    }
                  },
                  "required": [
                    "name",
                    "ratio",
                    "triangles",
                    "vertices",
                    "bytes",
                    "error"
                  ],
                  "type": "object"
                },
                "target": {
                  "additionalProperties": false,
                  "properties": {
                    "collision": {
                      "$ref": "#/properties/output/properties/example/$defs/collision"
                    },
                    "engine": {
                      "enum": [
                        "godot4",
                        "unity",
                        "unreal",
                        "gltf"
                      ],
                      "type": "string"
                    },
                    "maxTextureSize": {
                      "maximum": 8192,
                      "minimum": 1,
                      "type": "integer"
                    },
                    "origin": {
                      "enum": [
                        "keep",
                        "center",
                        "floor"
                      ],
                      "type": "string"
                    },
                    "platform": {
                      "enum": [
                        "mobile",
                        "desktop"
                      ],
                      "type": "string"
                    },
                    "size": {
                      "additionalProperties": false,
                      "properties": {
                        "axis": {
                          "enum": [
                            "x",
                            "y",
                            "z",
                            "max"
                          ],
                          "type": "string"
                        },
                        "metres": {
                          "exclusiveMinimum": 0,
                          "maximum": 1000,
                          "type": "number"
                        }
                      },
                      "required": [
                        "axis",
                        "metres"
                      ],
                      "type": "object"
                    },
                    "sourceUp": {
                      "enum": [
                        "y",
                        "z"
                      ],
                      "type": "string"
                    }
                  },
                  "required": [
                    "engine",
                    "platform",
                    "sourceUp",
                    "origin",
                    "collision"
                  ],
                  "type": "object"
                },
                "vector3": {
                  "items": {
                    "type": "number"
                  },
                  "maxItems": 3,
                  "minItems": 3,
                  "type": "array"
                }
              },
              "$schema": "https://json-schema.org/draft/2020-12/schema",
              "additionalProperties": false,
              "properties": {
                "artifacts": {
                  "items": {
                    "$ref": "#/properties/output/properties/example/$defs/artifact"
                  },
                  "maxItems": 7,
                  "type": "array"
                },
                "checks": {
                  "items": {
                    "$ref": "#/properties/output/properties/example/$defs/check"
                  },
                  "maxItems": 32,
                  "type": "array"
                },
                "collision": {
                  "additionalProperties": false,
                  "properties": {
                    "convexHullVertices": {
                      "minimum": 0,
                      "type": "integer"
                    },
                    "kind": {
                      "$ref": "#/properties/output/properties/example/$defs/collision"
                    },
                    "trimeshTriangles": {
                      "minimum": 0,
                      "type": "integer"
                    }
                  },
                  "required": [
                    "kind",
                    "convexHullVertices",
                    "trimeshTriangles"
                  ],
                  "type": "object"
                },
                "engineLoad": {
                  "additionalProperties": false,
                  "properties": {
                    "animations": {
                      "items": {
                        "maxLength": 256,
                        "type": "string"
                      },
                      "maxItems": 256,
                      "type": "array"
                    },
                    "engine": {
                      "type": "string"
                    },
                    "errors": {
                      "items": {
                        "maxLength": 2048,
                        "type": "string"
                      },
                      "maxItems": 64,
                      "type": "array"
                    },
                    "loaded": {
                      "type": "boolean"
                    },
                    "materials": {
                      "minimum": 0,
                      "type": "integer"
                    },
                    "meshInstances": {
                      "minimum": 0,
                      "type": "integer"
                    },
                    "nodes": {
                      "minimum": 0,
                      "type": "integer"
                    },
                    "skeletons": {
                      "minimum": 0,
                      "type": "integer"
                    }
                  },
                  "required": [
                    "engine",
                    "loaded",
                    "nodes",
                    "meshInstances",
                    "materials",
                    "skeletons",
                    "animations",
                    "errors"
                  ],
                  "type": "object"
                },
                "expiresAt": {
                  "format": "date-time",
                  "type": "string"
                },
                "limitations": {
                  "items": {
                    "maxLength": 4096,
                    "type": "string"
                  },
                  "maxItems": 16,
                  "type": "array"
                },
                "lods": {
                  "items": {
                    "$ref": "#/properties/output/properties/example/$defs/lod"
                  },
                  "maxItems": 3,
                  "minItems": 1,
                  "type": "array"
                },
                "normalization": {
                  "additionalProperties": false,
                  "properties": {
                    "rotationXDegrees": {
                      "type": "number"
                    },
                    "scale": {
                      "type": "number"
                    },
                    "translation": {
                      "$ref": "#/properties/output/properties/example/$defs/vector3"
                    }
                  },
                  "required": [
                    "scale",
                    "rotationXDegrees",
                    "translation"
                  ],
                  "type": "object"
                },
                "output": {
                  "additionalProperties": false,
                  "properties": {
                    "animations": {
                      "minimum": 0,
                      "type": "integer"
                    },
                    "bones": {
                      "minimum": 0,
                      "type": "integer"
                    },
                    "bounds": {
                      "$ref": "#/properties/output/properties/example/$defs/bounds"
                    },
                    "bytes": {
                      "minimum": 0,
                      "type": "integer"
                    },
                    "materials": {
                      "maximum": 32,
                      "minimum": 0,
                      "type": "integer"
                    },
                    "maxTextureEdge": {
                      "minimum": 0,
                      "type": "integer"
                    },
                    "meshes": {
                      "minimum": 0,
                      "type": "integer"
                    },
                    "nodes": {
                      "maximum": 2000,
                      "minimum": 0,
                      "type": "integer"
                    },
                    "primitives": {
                      "minimum": 0,
                      "type": "integer"
                    },
                    "skins": {
                      "minimum": 0,
                      "type": "integer"
                    },
                    "textures": {
                      "maximum": 32,
                      "minimum": 0,
                      "type": "integer"
                    },
                    "triangles": {
                      "maximum": 250000,
                      "minimum": 0,
                      "type": "integer"
                    },
                    "vertices": {
                      "minimum": 0,
                      "type": "integer"
                    }
                  },
                  "required": [
                    "triangles",
                    "vertices",
                    "primitives",
                    "meshes",
                    "nodes",
                    "materials",
                    "textures",
                    "maxTextureEdge",
                    "skins",
                    "bones",
                    "animations",
                    "bytes",
                    "bounds"
                  ],
                  "type": "object"
                },
                "repairs": {
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "code": {
                        "maxLength": 128,
                        "type": "string"
                      },
                      "detail": {
                        "maxLength": 2048,
                        "type": "string"
                      }
                    },
                    "required": [
                      "code",
                      "detail"
                    ],
                    "type": "object"
                  },
                  "maxItems": 100,
                  "type": "array"
                },
                "source": {
                  "additionalProperties": false,
                  "properties": {
                    "animations": {
                      "minimum": 0,
                      "type": "integer"
                    },
                    "bones": {
                      "minimum": 0,
                      "type": "integer"
                    },
                    "bounds": {
                      "$ref": "#/properties/output/properties/example/$defs/bounds"
                    },
                    "bytes": {
                      "minimum": 0,
                      "type": "integer"
                    },
                    "materials": {
                      "maximum": 32,
                      "minimum": 0,
                      "type": "integer"
                    },
                    "maxTextureEdge": {
                      "minimum": 0,
                      "type": "integer"
                    },
                    "meshes": {
                      "minimum": 0,
                      "type": "integer"
                    },
                    "nodes": {
                      "maximum": 2000,
                      "minimum": 0,
                      "type": "integer"
                    },
                    "primitives": {
                      "minimum": 0,
                      "type": "integer"
                    },
                    "skins": {
                      "minimum": 0,
                      "type": "integer"
                    },
                    "textures": {
                      "maximum": 32,
                      "minimum": 0,
                      "type": "integer"
                    },
                    "triangles": {
                      "maximum": 250000,
                      "minimum": 0,
                      "type": "integer"
                    },
                    "validatorErrors": {
                      "minimum": 0,
                      "type": "integer"
                    },
                    "validatorWarnings": {
                      "minimum": 0,
                      "type": "integer"
                    },
                    "vertices": {
                      "minimum": 0,
                      "type": "integer"
                    }
                  },
                  "required": [
                    "triangles",
                    "vertices",
                    "primitives",
                    "meshes",
                    "nodes",
                    "materials",
                    "textures",
                    "maxTextureEdge",
                    "skins",
                    "bones",
                    "animations",
                    "bytes",
                    "bounds",
                    "validatorErrors",
                    "validatorWarnings"
                  ],
                  "type": "object"
                },
                "status": {
                  "enum": [
                    "passed",
                    "failed"
                  ],
                  "type": "string"
                },
                "target": {
                  "$ref": "#/properties/output/properties/example/$defs/target"
                },
                "tools": {
                  "additionalProperties": false,
                  "properties": {
                    "engine": {
                      "type": "string"
                    },
                    "transform": {
                      "type": "string"
                    },
                    "validator": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "validator",
                    "transform",
                    "engine"
                  ],
                  "type": "object"
                },
                "truncated": {
                  "type": "boolean"
                },
                "validator": {
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "code": {
                        "maxLength": 128,
                        "type": "string"
                      },
                      "message": {
                        "maxLength": 2048,
                        "type": "string"
                      },
                      "pointer": {
                        "maxLength": 512,
                        "type": "string"
                      },
                      "severity": {
                        "enum": [
                          "error",
                          "warning",
                          "info"
                        ],
                        "type": "string"
                      }
                    },
                    "required": [
                      "severity",
                      "code",
                      "message",
                      "pointer"
                    ],
                    "type": "object"
                  },
                  "maxItems": 100,
                  "type": "array"
                },
                "warnings": {
                  "items": {
                    "maxLength": 4096,
                    "type": "string"
                  },
                  "maxItems": 100,
                  "type": "array"
                }
              },
              "required": [
                "status",
                "tools",
                "target",
                "source",
                "output",
                "normalization",
                "lods",
                "collision",
                "engineLoad",
                "repairs",
                "checks",
                "validator",
                "warnings",
                "limitations",
                "truncated",
                "expiresAt",
                "artifacts"
              ],
              "type": "object"
            },
            "type": {
              "type": "string"
            }
          },
          "required": [
            "type"
          ],
          "type": "object"
        }
      },
      "required": [
        "input"
      ],
      "type": "object"
    }
  },
  "builder-code": {
    "info": {
      "s": [
        "cdp_sdk_server"
      ]
    },
    "schema": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": false,
      "properties": {
        "a": {
          "description": "App builder code",
          "pattern": "^[a-z0-9_]{1,32}$",
          "type": "string"
        },
        "s": {
          "description": "Service builder codes",
          "items": {
            "pattern": "^[a-z0-9_]{1,32}$",
            "type": "string"
          },
          "maxItems": 11,
          "type": "array"
        },
        "w": {
          "description": "Wallet builder code",
          "pattern": "^[a-z0-9_]{1,32}$",
          "type": "string"
        }
      },
      "type": "object"
    }
  },
  "eip2612GasSponsoring": {},
  "erc20ApprovalGasSponsoring": {},
  "payment-identifier": {
    "info": {
      "required": true
    },
    "schema": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "id": {
          "maxLength": 128,
          "minLength": 16,
          "pattern": "^[a-zA-Z0-9_-]+$",
          "type": "string"
        },
        "required": {
          "type": "boolean"
        }
      },
      "required": [
        "required"
      ],
      "type": "object"
    }
  }
}

Use it

curl

curl "https://asset.api.williamrobinson.dev/v1/asset/prepare"
# -> 402 Payment Required, accepts[] lists how to pay
# retry with a PAYMENT-SIGNATURE (or PAYMENT header) once paid

JavaScript

const res = await fetch("https://asset.api.williamrobinson.dev/v1/asset/prepare");
if (res.status === 402) {
  const { accepts } = await res.json();
  // pay one of accepts[] via an x402 client, then retry with the payment header
}

Python

import httpx
res = httpx.get("https://asset.api.williamrobinson.dev/v1/asset/prepare")
if res.status_code == 402:
    accepts = res.json()["accepts"]
    # pay one of accepts[] via an x402 client, then retry with the payment header

Machine-readable

Everything on this page is also available as clean JSON at /resources/8216.json, and this resource appears in /discovery/resources and /discovery/search.