{
  "openapi": "3.1.0",
  "info": {
    "title": "NoJunk QR",
    "version": "1.0.0",
    "description": "Pay-per-call QR Code generation for agents: turn any text, URL, Wi-Fi string or payment URI (up to 1500 characters) into a standards-compliant QR Code as crisp SVG, real PNG or a JSON module matrix; batch up to 25 codes in one call. Full ISO/IEC 18004 encoder (versions 1-40, ECC L/M/Q/H) computed in the Worker, no upstream services. You are only charged when a valid QR code is returned.",
    "x-guidance": "Two endpoints paid per call in USDC on Base via x402 (you are only charged when a valid QR code is returned; every 4xx/5xx is free). Both accept POST with a JSON body or GET with the same fields as query parameters. POST /qr {text (1-1500 chars), format?: \"svg\"|\"png\"|\"json\" (default svg), size?: 128-2048 px (default 512), margin?: 0-8 modules (default 4), ecc?: \"L\"|\"M\"|\"Q\"|\"H\" (default M), dark?: hex (default #000000), light?: hex (default #FFFFFF)} costs $0.001; with format=svg the 200 body IS the SVG document (Content-Type image/svg+xml), with format=png the body IS the PNG (image/png), with format=json you get {version, ecc, modules, mask, mode, matrix (array of \"0/1\" strings per row), svg}; every response carries X-QR-Version and X-QR-Modules. POST /qr/batch {items: [{text, label?}] (1-25), format?: \"svg\"|\"json\", same options} costs $0.005 and returns {count, ecc, format, items: [{label, text, version, modules, svg or matrix}]}. The encoder is a full ISO/IEC 18004 implementation (versions 1-40, numeric/alphanumeric/byte mode selection, Reed-Solomon, all 8 masks) running inside the Worker, so results are deterministic and there is no upstream to fail. Request bodies over 65536 bytes are rejected with 413 before any payment work. Free: GET /sample.svg shows the QR for https://nojunkcrypto.com. Best for: links on receipts, invoices, tickets and posters, Wi-Fi join codes, crypto payment URIs, vCards, 2FA/otpauth URIs, app deep links, batch label printing."
  },
  "servers": [
    {
      "url": "https://nojunk-qr.mick8511.workers.dev"
    }
  ],
  "paths": {
    "/qr": {
      "post": {
        "operationId": "createQr",
        "summary": "Encode text as a QR Code (SVG, PNG or JSON)",
        "tags": [
          "QR",
          "Image",
          "Encoding"
        ],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.001000"
          },
          "protocols": [
            {
              "x402": {}
            }
          ]
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "text": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 1500,
                    "description": "Content to encode, UTF-8. Digits-only text uses numeric mode and A-Z 0-9 space $%*+-./: uses alphanumeric mode automatically (smaller codes); everything else is byte mode (UTF-8, no ECI). Must fit version 40 at the chosen ecc (byte mode: 2953 bytes at L, 2331 at M, 1663 at Q, 1273 at H)."
                  },
                  "format": {
                    "type": "string",
                    "enum": [
                      "svg",
                      "png",
                      "json"
                    ],
                    "default": "svg",
                    "description": "svg: the response body is an SVG document (image/svg+xml). png: the body is a PNG image (image/png, 1-bit palette). json: {version, ecc, modules, mask, mode, matrix, svg}."
                  },
                  "size": {
                    "type": "integer",
                    "minimum": 128,
                    "maximum": 2048,
                    "default": 512,
                    "description": "Output width and height in pixels. SVG: width/height attributes (scales losslessly). PNG: image dimensions; each module is drawn with a whole number of pixels and the code is centred, so sizes that are a multiple of (modules + 2*margin) fill the image exactly."
                  },
                  "margin": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 8,
                    "default": 4,
                    "description": "Quiet zone around the code, in modules"
                  },
                  "ecc": {
                    "type": "string",
                    "enum": [
                      "L",
                      "M",
                      "Q",
                      "H"
                    ],
                    "default": "M",
                    "description": "Error correction level: L recovers ~7% damage, M ~15%, Q ~25%, H ~30%. Higher levels need a bigger version for the same text."
                  },
                  "dark": {
                    "type": "string",
                    "pattern": "^#?([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$",
                    "default": "#000000",
                    "description": "Hex color of the dark modules"
                  },
                  "light": {
                    "type": "string",
                    "pattern": "^#?([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$",
                    "default": "#FFFFFF",
                    "description": "Hex color of the light modules / background (must differ from dark)"
                  }
                },
                "required": [
                  "text"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The QR code. format=svg (default): the body is the SVG document; format=png: the body is the PNG image; format=json: a JSON object with the module matrix and the SVG.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "description": "Base64 x402 settlement receipt",
                "schema": {
                  "type": "string"
                }
              },
              "X-QR-Version": {
                "description": "QR version 1-40",
                "schema": {
                  "type": "integer"
                }
              },
              "X-QR-Modules": {
                "description": "Modules per side (17 + 4*version)",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "image/svg+xml": {
                "schema": {
                  "type": "string"
                }
              },
              "image/png": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "version": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 40,
                      "description": "QR version (symbol size = 17 + 4*version modules)"
                    },
                    "ecc": {
                      "type": "string",
                      "enum": [
                        "L",
                        "M",
                        "Q",
                        "H"
                      ]
                    },
                    "modules": {
                      "type": "integer",
                      "description": "Modules per side"
                    },
                    "mask": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 7,
                      "description": "Mask pattern that was chosen (lowest penalty)"
                    },
                    "mode": {
                      "type": "string",
                      "enum": [
                        "numeric",
                        "alphanumeric",
                        "byte"
                      ],
                      "description": "Encoding mode selected for the text"
                    },
                    "matrix": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "pattern": "^[01]+$"
                      },
                      "description": "One string per row, one character per module: 1 = dark, 0 = light, without the quiet zone"
                    },
                    "svg": {
                      "type": "string",
                      "description": "The same code as an SVG document (with quiet zone and colors applied)"
                    }
                  },
                  "required": [
                    "version",
                    "ecc",
                    "modules",
                    "mask",
                    "mode",
                    "matrix",
                    "svg"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input: empty or too-long text, text that does not fit version 40 at the chosen ecc, bad size/margin/ecc/color, too many items, or PNG size smaller than the module count (no charge)"
          },
          "402": {
            "description": "Payment Required: the PAYMENT-REQUIRED header carries the base64 x402 requirements; also returned when payment verification or settlement fails (no charge)"
          },
          "413": {
            "description": "Request body (or URL) larger than 65536 bytes (no charge)"
          },
          "502": {
            "description": "Encoder failure (no charge)"
          }
        }
      },
      "get": {
        "operationId": "createQrGet",
        "summary": "Encode text as a QR Code via query parameters",
        "tags": [
          "QR",
          "Image",
          "Encoding"
        ],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.001000"
          },
          "protocols": [
            {
              "x402": {}
            }
          ]
        },
        "parameters": [
          {
            "name": "text",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 1500,
              "description": "Content to encode, UTF-8. Digits-only text uses numeric mode and A-Z 0-9 space $%*+-./: uses alphanumeric mode automatically (smaller codes); everything else is byte mode (UTF-8, no ECI). Must fit version 40 at the chosen ecc (byte mode: 2953 bytes at L, 2331 at M, 1663 at Q, 1273 at H)."
            },
            "description": "Content to encode, UTF-8. Digits-only text uses numeric mode and A-Z 0-9 space $%*+-./: uses alphanumeric mode automatically (smaller codes); everything else is byte mode (UTF-8, no ECI). Must fit version 40 at the chosen ecc (byte mode: 2953 bytes at L, 2331 at M, 1663 at Q, 1273 at H)."
          },
          {
            "name": "format",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "svg",
                "png",
                "json"
              ],
              "default": "svg",
              "description": "svg: the response body is an SVG document (image/svg+xml). png: the body is a PNG image (image/png, 1-bit palette). json: {version, ecc, modules, mask, mode, matrix, svg}."
            },
            "description": "svg: the response body is an SVG document (image/svg+xml). png: the body is a PNG image (image/png, 1-bit palette). json: {version, ecc, modules, mask, mode, matrix, svg}."
          },
          {
            "name": "size",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 128,
              "maximum": 2048,
              "default": 512,
              "description": "Output width and height in pixels. SVG: width/height attributes (scales losslessly). PNG: image dimensions; each module is drawn with a whole number of pixels and the code is centred, so sizes that are a multiple of (modules + 2*margin) fill the image exactly."
            },
            "description": "Output width and height in pixels. SVG: width/height attributes (scales losslessly). PNG: image dimensions; each module is drawn with a whole number of pixels and the code is centred, so sizes that are a multiple of (modules + 2*margin) fill the image exactly."
          },
          {
            "name": "margin",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 8,
              "default": 4,
              "description": "Quiet zone around the code, in modules"
            },
            "description": "Quiet zone around the code, in modules"
          },
          {
            "name": "ecc",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "L",
                "M",
                "Q",
                "H"
              ],
              "default": "M",
              "description": "Error correction level: L recovers ~7% damage, M ~15%, Q ~25%, H ~30%. Higher levels need a bigger version for the same text."
            },
            "description": "Error correction level: L recovers ~7% damage, M ~15%, Q ~25%, H ~30%. Higher levels need a bigger version for the same text."
          },
          {
            "name": "dark",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^#?([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$",
              "default": "#000000",
              "description": "Hex color of the dark modules"
            },
            "description": "Hex color of the dark modules"
          },
          {
            "name": "light",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^#?([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$",
              "default": "#FFFFFF",
              "description": "Hex color of the light modules / background (must differ from dark)"
            },
            "description": "Hex color of the light modules / background (must differ from dark)"
          }
        ],
        "responses": {
          "200": {
            "description": "The QR code. format=svg (default): the body is the SVG document; format=png: the body is the PNG image; format=json: a JSON object with the module matrix and the SVG.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "description": "Base64 x402 settlement receipt",
                "schema": {
                  "type": "string"
                }
              },
              "X-QR-Version": {
                "description": "QR version 1-40",
                "schema": {
                  "type": "integer"
                }
              },
              "X-QR-Modules": {
                "description": "Modules per side (17 + 4*version)",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "image/svg+xml": {
                "schema": {
                  "type": "string"
                }
              },
              "image/png": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "version": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 40,
                      "description": "QR version (symbol size = 17 + 4*version modules)"
                    },
                    "ecc": {
                      "type": "string",
                      "enum": [
                        "L",
                        "M",
                        "Q",
                        "H"
                      ]
                    },
                    "modules": {
                      "type": "integer",
                      "description": "Modules per side"
                    },
                    "mask": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 7,
                      "description": "Mask pattern that was chosen (lowest penalty)"
                    },
                    "mode": {
                      "type": "string",
                      "enum": [
                        "numeric",
                        "alphanumeric",
                        "byte"
                      ],
                      "description": "Encoding mode selected for the text"
                    },
                    "matrix": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "pattern": "^[01]+$"
                      },
                      "description": "One string per row, one character per module: 1 = dark, 0 = light, without the quiet zone"
                    },
                    "svg": {
                      "type": "string",
                      "description": "The same code as an SVG document (with quiet zone and colors applied)"
                    }
                  },
                  "required": [
                    "version",
                    "ecc",
                    "modules",
                    "mask",
                    "mode",
                    "matrix",
                    "svg"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input: empty or too-long text, text that does not fit version 40 at the chosen ecc, bad size/margin/ecc/color, too many items, or PNG size smaller than the module count (no charge)"
          },
          "402": {
            "description": "Payment Required: the PAYMENT-REQUIRED header carries the base64 x402 requirements; also returned when payment verification or settlement fails (no charge)"
          },
          "413": {
            "description": "Request body (or URL) larger than 65536 bytes (no charge)"
          },
          "502": {
            "description": "Encoder failure (no charge)"
          }
        }
      }
    },
    "/qr/batch": {
      "post": {
        "operationId": "createQrBatch",
        "summary": "Encode up to 25 texts as QR Codes in one call",
        "tags": [
          "QR",
          "Image",
          "Encoding",
          "Batch"
        ],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.005000"
          },
          "protocols": [
            {
              "x402": {}
            }
          ]
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "items": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 25,
                    "items": {
                      "type": "object",
                      "properties": {
                        "text": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 1500
                        },
                        "label": {
                          "type": "string",
                          "description": "Optional: echoed back to help you match results (max 200 chars)"
                        }
                      },
                      "required": [
                        "text"
                      ]
                    }
                  },
                  "format": {
                    "type": "string",
                    "enum": [
                      "svg",
                      "json"
                    ],
                    "default": "svg",
                    "description": "svg: each item has an svg string; json: each item has a matrix (array of 0/1 strings)"
                  },
                  "size": {
                    "type": "integer",
                    "minimum": 128,
                    "maximum": 2048,
                    "default": 512,
                    "description": "Output width and height in pixels. SVG: width/height attributes (scales losslessly). PNG: image dimensions; each module is drawn with a whole number of pixels and the code is centred, so sizes that are a multiple of (modules + 2*margin) fill the image exactly."
                  },
                  "margin": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 8,
                    "default": 4,
                    "description": "Quiet zone around the code, in modules"
                  },
                  "ecc": {
                    "type": "string",
                    "enum": [
                      "L",
                      "M",
                      "Q",
                      "H"
                    ],
                    "default": "M",
                    "description": "Error correction level: L recovers ~7% damage, M ~15%, Q ~25%, H ~30%. Higher levels need a bigger version for the same text."
                  },
                  "dark": {
                    "type": "string",
                    "pattern": "^#?([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$",
                    "default": "#000000",
                    "description": "Hex color of the dark modules"
                  },
                  "light": {
                    "type": "string",
                    "pattern": "^#?([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$",
                    "default": "#FFFFFF",
                    "description": "Hex color of the light modules / background (must differ from dark)"
                  }
                },
                "required": [
                  "items"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "One result per item, in input order",
            "headers": {
              "PAYMENT-RESPONSE": {
                "description": "Base64 x402 settlement receipt",
                "schema": {
                  "type": "string"
                }
              },
              "X-QR-Count": {
                "description": "Number of codes returned",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer"
                    },
                    "ecc": {
                      "type": "string",
                      "enum": [
                        "L",
                        "M",
                        "Q",
                        "H"
                      ]
                    },
                    "format": {
                      "type": "string",
                      "enum": [
                        "svg",
                        "json"
                      ]
                    },
                    "items": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "label": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "text": {
                            "type": "string"
                          },
                          "version": {
                            "type": "integer"
                          },
                          "modules": {
                            "type": "integer"
                          },
                          "svg": {
                            "type": "string"
                          },
                          "matrix": {
                            "type": "array",
                            "items": {
                              "type": "string",
                              "pattern": "^[01]+$"
                            },
                            "description": "One string per row, one character per module: 1 = dark, 0 = light, without the quiet zone"
                          }
                        },
                        "required": [
                          "label",
                          "text",
                          "version",
                          "modules"
                        ]
                      }
                    }
                  },
                  "required": [
                    "count",
                    "ecc",
                    "format",
                    "items"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input: empty or too-long text, text that does not fit version 40 at the chosen ecc, bad size/margin/ecc/color, too many items, or PNG size smaller than the module count (no charge)"
          },
          "402": {
            "description": "Payment Required: the PAYMENT-REQUIRED header carries the base64 x402 requirements; also returned when payment verification or settlement fails (no charge)"
          },
          "413": {
            "description": "Request body (or URL) larger than 65536 bytes (no charge)"
          },
          "502": {
            "description": "Encoder failure (no charge)"
          }
        }
      },
      "get": {
        "operationId": "createQrBatchGet",
        "summary": "Batch encode via query parameters (items as JSON, or repeated text=)",
        "tags": [
          "QR",
          "Image",
          "Encoding",
          "Batch"
        ],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.005000"
          },
          "protocols": [
            {
              "x402": {}
            }
          ]
        },
        "parameters": [
          {
            "name": "items",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "description": "JSON-encoded array of {text, label?}; alternatively repeat text= (and label=) parameters"
            }
          },
          {
            "name": "format",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "svg",
                "json"
              ],
              "default": "svg",
              "description": "svg: each item has an svg string; json: each item has a matrix (array of 0/1 strings)"
            },
            "description": "svg: each item has an svg string; json: each item has a matrix (array of 0/1 strings)"
          },
          {
            "name": "size",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 128,
              "maximum": 2048,
              "default": 512,
              "description": "Output width and height in pixels. SVG: width/height attributes (scales losslessly). PNG: image dimensions; each module is drawn with a whole number of pixels and the code is centred, so sizes that are a multiple of (modules + 2*margin) fill the image exactly."
            },
            "description": "Output width and height in pixels. SVG: width/height attributes (scales losslessly). PNG: image dimensions; each module is drawn with a whole number of pixels and the code is centred, so sizes that are a multiple of (modules + 2*margin) fill the image exactly."
          },
          {
            "name": "margin",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 8,
              "default": 4,
              "description": "Quiet zone around the code, in modules"
            },
            "description": "Quiet zone around the code, in modules"
          },
          {
            "name": "ecc",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "L",
                "M",
                "Q",
                "H"
              ],
              "default": "M",
              "description": "Error correction level: L recovers ~7% damage, M ~15%, Q ~25%, H ~30%. Higher levels need a bigger version for the same text."
            },
            "description": "Error correction level: L recovers ~7% damage, M ~15%, Q ~25%, H ~30%. Higher levels need a bigger version for the same text."
          },
          {
            "name": "dark",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^#?([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$",
              "default": "#000000",
              "description": "Hex color of the dark modules"
            },
            "description": "Hex color of the dark modules"
          },
          {
            "name": "light",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^#?([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$",
              "default": "#FFFFFF",
              "description": "Hex color of the light modules / background (must differ from dark)"
            },
            "description": "Hex color of the light modules / background (must differ from dark)"
          }
        ],
        "responses": {
          "200": {
            "description": "One result per item, in input order",
            "headers": {
              "PAYMENT-RESPONSE": {
                "description": "Base64 x402 settlement receipt",
                "schema": {
                  "type": "string"
                }
              },
              "X-QR-Count": {
                "description": "Number of codes returned",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer"
                    },
                    "ecc": {
                      "type": "string",
                      "enum": [
                        "L",
                        "M",
                        "Q",
                        "H"
                      ]
                    },
                    "format": {
                      "type": "string",
                      "enum": [
                        "svg",
                        "json"
                      ]
                    },
                    "items": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "label": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "text": {
                            "type": "string"
                          },
                          "version": {
                            "type": "integer"
                          },
                          "modules": {
                            "type": "integer"
                          },
                          "svg": {
                            "type": "string"
                          },
                          "matrix": {
                            "type": "array",
                            "items": {
                              "type": "string",
                              "pattern": "^[01]+$"
                            },
                            "description": "One string per row, one character per module: 1 = dark, 0 = light, without the quiet zone"
                          }
                        },
                        "required": [
                          "label",
                          "text",
                          "version",
                          "modules"
                        ]
                      }
                    }
                  },
                  "required": [
                    "count",
                    "ecc",
                    "format",
                    "items"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input: empty or too-long text, text that does not fit version 40 at the chosen ecc, bad size/margin/ecc/color, too many items, or PNG size smaller than the module count (no charge)"
          },
          "402": {
            "description": "Payment Required: the PAYMENT-REQUIRED header carries the base64 x402 requirements; also returned when payment verification or settlement fails (no charge)"
          },
          "413": {
            "description": "Request body (or URL) larger than 65536 bytes (no charge)"
          },
          "502": {
            "description": "Encoder failure (no charge)"
          }
        }
      }
    },
    "/sample.svg": {
      "get": {
        "operationId": "sampleQr",
        "summary": "Free sample: the QR Code for https://nojunkcrypto.com",
        "tags": [
          "QR",
          "Free"
        ],
        "responses": {
          "200": {
            "description": "SVG document",
            "content": {
              "image/svg+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    }
  }
}