{
  "info": {
    "name": "CutOptim Engine API",
    "description": "Generated from https://cutoptim.com/engine/openapi.json (contract 1). Set the apiKey variable to your key; health and validate need none.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{apiKey}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://api.cutoptim.com"
    },
    {
      "key": "apiKey",
      "value": ""
    }
  ],
  "item": [
    {
      "name": "optimize",
      "description": "Run an optimization.",
      "item": [
        {
          "name": "POST /v1/optimize/2d — 2D panel optimization",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/optimize/2d",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "optimize",
                "2d"
              ]
            },
            "description": "2D panel optimization\n\nNest rectangular parts into rectangular sheets. Returns the placement of every part, the remaining offcuts, the guillotine cut plan and the yield metrics. Parts named in `matchedSets` (grain matching) are cut side by side from one piece of board, one kerf apart; each placed member says which set and position it is.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"parts\": [\n    {\n      \"name\": \"Door\",\n      \"w\": 600,\n      \"h\": 400,\n      \"qty\": 4,\n      \"rotatable\": true\n    }\n  ],\n  \"stock\": [\n    {\n      \"w\": 2440,\n      \"h\": 1220,\n      \"qty\": 10,\n      \"price\": 42\n    }\n  ],\n  \"options\": {\n    \"kerf\": 3,\n    \"trim\": {\n      \"left\": 10,\n      \"top\": 10\n    },\n    \"minimizeCost\": true,\n    \"effort\": \"balanced\"\n  },\n  \"engine\": \"heuristic\",\n  \"include\": [\n    \"cutPlan\",\n    \"offcuts\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "POST /v1/optimize/1d — 1D / linear optimization (bars, profiles, tube)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/optimize/1d",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "optimize",
                "1d"
              ]
            },
            "description": "1D / linear optimization (bars, profiles, tube)\n\nCut parts of a given length from stock bars. Returns the rods used, the position of every part along each rod, the leftover length and the yield metrics.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"parts\": [\n    {\n      \"name\": \"Rail\",\n      \"length\": 1200,\n      \"qty\": 6\n    }\n  ],\n  \"stock\": [\n    {\n      \"length\": 3000,\n      \"qty\": 5,\n      \"price\": 12.5\n    }\n  ],\n  \"options\": {\n    \"kerf\": 3,\n    \"trim\": {\n      \"start\": 10,\n      \"end\": 0\n    }\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "POST /v1/optimize/wood — Timber optimization (cross-section-aware 1D)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/optimize/wood",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "optimize",
                "wood"
              ]
            },
            "description": "Timber optimization (cross-section-aware 1D)\n\nCut lengths from bars that have a CROSS-SECTION. Unlike `/v1/optimize/1d`, where every bar can serve every part, a 50×150 part can only come out of 50×150 stock — so the job is split by cross-section, each section is matched to its own stock and solved separately, and the response carries both per-section and job-wide totals.\n\nFanning the same job out into several `/v1/optimize/1d` calls is not equivalent: it costs one call per section against your quota, moves the stock matching to your code, and cannot distinguish \"no material of this section\" from \"did not fit\" — which this endpoint reports separately as `unmatched` and `unplaced`.\n\n`sw` and `sh` may be given in either order: 50×100 and 100×50 are the same bar turned over and are matched as one section. The response reports the normalised short/long form.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"parts\": [\n    {\n      \"name\": \"Rafter\",\n      \"sw\": 50,\n      \"sh\": 100,\n      \"length\": 2400,\n      \"qty\": 2\n    },\n    {\n      \"name\": \"Noggin\",\n      \"sw\": 50,\n      \"sh\": 100,\n      \"length\": 600,\n      \"qty\": 4\n    },\n    {\n      \"name\": \"Beam\",\n      \"sw\": 50,\n      \"sh\": 150,\n      \"length\": 3000,\n      \"qty\": 2\n    }\n  ],\n  \"stock\": [\n    {\n      \"name\": \"C24 50x100\",\n      \"sw\": 50,\n      \"sh\": 100,\n      \"length\": 4000,\n      \"qty\": 5,\n      \"price\": 12.5\n    },\n    {\n      \"name\": \"C24 50x150\",\n      \"sw\": 50,\n      \"sh\": 150,\n      \"length\": 4000,\n      \"qty\": 3,\n      \"price\": 18\n    }\n  ],\n  \"options\": {\n    \"kerf\": 3\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "POST /v1/optimize/nest — True-shape (irregular / polygon) nesting",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/optimize/nest",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "optimize",
                "nest"
              ]
            },
            "description": "True-shape (irregular / polygon) nesting\n\nPack ARBITRARY POLYGONS onto fixed sheets, letting parts interlock into each other's concave pockets — an L-bracket, a gasket, a laser-cut profile. This is a different class from the rectangular modes: a part is an outline (`polygon`, optional interior `holes`), not a width×height, so a bounding-box packer's notch-air is reclaimed. On a representative 272-part job it uses 6 sheets where the same parts by bounding box need 9 (−33 % material).\n\nTwo things the rectangular API cannot express come for free here: per-sheet EXCLUSION ZONES (`stock[].exclusions` — a defect, a clamp footprint, a pre-printed area; a `quality`-0 zone is a no-go region for any part), and true-shape holes. Material partition (`material`) and the opaque `meta` passthrough work exactly as on the other modes.\n\n⚠️ `density` is the placed POLYGON area over used sheet area — the honest fill, with concave pockets counted as empty. It is NOT comparable to a rectangular packer's `yieldPct` (which counts each bounding box as solid and so reads higher for a worse result); the cross-comparable metric is `sheetCount` on the same parts.\n\nA placed part carries the rigid transform (`rotation` in degrees, then `x`/`y` translation), NOT a re-emitted polygon: your input outline plus that transform reconstructs the placement exactly. Deterministic (a pinned seed); set `options.seed` to reproduce a layout.\n\nEngines: `lbf` (default) is synchronous and instant. Besides its own pass it tries the parts restricted to the right angles they allow, and their bounding boxes packed by an exact rectangle packer — which finds grids a sampling search misses (three 500-wide parts on a 1500-wide sheet at zero spacing) — and keeps whichever ranks best; on a tie, the plan that fills its sheets front to back, then the one with fewer parts off the right angles. `max` is ASYNCHRONOUS: the call answers **202** with a `jobId`, and you poll `GET /v1/jobs/{id}` for the result — the same response shape, with `engine: \"max\"`. It runs the `lbf` pass first and then a time-budgeted search (`options.timeBudgetMs`, default 60 s, 10–180 s) that fills sheets one at a time looking for a layout with FEWER sheets; it never returns more sheets than `lbf` would — nor a plan that ranks worse by the sheet-size ranking below — and says in `warnings` when it kept the `lbf` layout. Several sheet sizes per material and `respectStock` are modelled; a `polygon` sheet or `exclusions` (which its strip search cannot model) are served by the `lbf` pass inside the job, with a warning — never refused. `sparrow` is a deprecated alias of `max`.\n\n**Sheet sizes and cost.** With two or more stock rows for a material, both engines compare arrangements (your order, each row alone, cheapest-first) and then re-nest each sheet — the least-filled first — onto the cheaper or smaller rows, so a plan may MIX sizes (e.g. two large sheets and a small last one). Ranking: most must-cut (`priority`) parts placed → most parts placed → (with `minimizeCost`) lowest total price → least total sheet area → fewest sheets. `sheets[].stock` and `stockUsage[]` say which row each sheet came from. **Used area.** `sheets[].usedWidth` / `usedHeight` are the farthest extent of any placed part from the sheet origin (the corner the parts are packed into), `usedArea` their product, and `stockUsage[].usedArea` the sum per row — the numbers an ERP needs to charge a partial sheet (full sheet, a horizontal or vertical cut, or the bounding box; the charging rule stays yours). Both engines compact the least-filled sheet of each material: its parts are re-nested on the same sheet with rotation SUBSETS of what each part allows ({0,180}, {0,90,180,270}, a single orientation — never a new angle) and the variant with the smallest used area is kept; with `max` that sheet is then also re-packed by the search itself, along the sheet's height and (on a one-sheet plan) along its width, and the tighter layout is kept under the same rule. Sheet count, sizes, price and placed parts never change. `options.compact: false` returns the uncompacted layout, and `options.compactFor` (`box` · `horizontal` · `vertical`) picks the measure to minimise when you charge a full-width or full-height strip. `metrics.cutLength` / `sheets[].cutLength` is the summed perimeter of the placed parts' outlines and holes; `pierces` counts one per closed contour (no common-line cutting, lead-ins or micro-joints — your CAM adds those).\n\n**Parts from CAD files.** A part may carry `source` — an SVG or DXF document — instead of `polygon` coordinates; the server reads the outline (and its holes) out of the file with the same parser the CutOptim app uses. The file replaces ONLY the geometry, and the response then carries an `imported` block saying what the files contributed. One file describes ONE part; `POST /v1/import/nest` splits a multi-part drawing first. Nothing is stored: the bytes are parsed in memory and gone with the response. Because a drawing is far larger than a JSON parts list, this path accepts a **10 MB body** (the rectangular endpoints keep 1 MB), with per-file and per-request character caps on `source.content`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"parts\": [\n    {\n      \"name\": \"bracket\",\n      \"polygon\": [\n        [\n          0,\n          0\n        ],\n        [\n          300,\n          0\n        ],\n        [\n          300,\n          100\n        ],\n        [\n          100,\n          100\n        ],\n        [\n          100,\n          300\n        ],\n        [\n          0,\n          300\n        ]\n      ],\n      \"qty\": 4,\n      \"allowedRotations\": [\n        0,\n        90,\n        180,\n        270\n      ]\n    },\n    {\n      \"name\": \"gusset\",\n      \"polygon\": [\n        [\n          0,\n          0\n        ],\n        [\n          280,\n          0\n        ],\n        [\n          0,\n          280\n        ]\n      ],\n      \"qty\": 4,\n      \"allowedRotations\": [\n        0,\n        90,\n        180,\n        270\n      ]\n    }\n  ],\n  \"stock\": [\n    {\n      \"w\": 2440,\n      \"h\": 1220,\n      \"price\": 12.5,\n      \"exclusions\": [\n        {\n          \"polygon\": [\n            [\n              0,\n              0\n            ],\n            [\n              300,\n              0\n            ],\n            [\n              0,\n              300\n            ]\n          ],\n          \"quality\": 0\n        }\n      ]\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "GET /v1/jobs/{id} — Poll an async max-engine job",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/jobs/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "jobs",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Poll an async max-engine job\n\nFetch the status (and, when finished, the plan) of a job submitted with `engine: \"max\"`. A job is `queued`, then `running`, then `succeeded` (with `result` = the same response shape a synchronous solve of that `mode` returns, carrying `engine: \"max\"` — a 2D plan for `mode: \"2d\"`, a nest for `mode: \"nest\"`) or `failed` (with `error`). Polling spends no quota, but the key must still be usable: a revoked key or a lapsed API subscription is refused with 403 here exactly as it is on every other authenticated path. A caller sees only its own jobs — a job id belonging to another account is reported as 401 \"job not found\", indistinguishable from one that does not exist, so ids cannot be probed."
          }
        }
      ]
    },
    {
      "name": "validate",
      "description": "Check a request without solving it — free, no key, no quota.",
      "item": [
        {
          "name": "POST /v1/validate/2d — Validate a 2D request — free, no key, no quota, no solve",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/validate/2d",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "validate",
                "2d"
              ]
            },
            "description": "Validate a 2D request — free, no key, no quota, no solve\n\nSchema-validate the SAME body `/v1/optimize/2d` takes, WITHOUT solving or spending a call. 200 `{valid:true, warnings}` (warnings flag parts that fit no stock — an approximate, solve-free probe), or 400 with the exact bad field path. Open like `/v1/health`: validate payloads during integration before you even have a key. The engine verdict matches the optimize path exactly, `engine: \"max\"` included: a body this endpoint accepts is one `/v1/optimize/2d` will accept, and one it refuses (400 for an option the max tier cannot model, 503 where that tier is not enabled) is refused there too.",
            "auth": {
              "type": "noauth"
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"parts\": [\n    {\n      \"name\": \"Door\",\n      \"w\": 600,\n      \"h\": 400,\n      \"qty\": 4,\n      \"rotatable\": true\n    }\n  ],\n  \"stock\": [\n    {\n      \"w\": 2440,\n      \"h\": 1220,\n      \"qty\": 10,\n      \"price\": 42\n    }\n  ],\n  \"options\": {\n    \"kerf\": 3,\n    \"trim\": {\n      \"left\": 10,\n      \"top\": 10\n    },\n    \"minimizeCost\": true,\n    \"effort\": \"balanced\"\n  },\n  \"engine\": \"heuristic\",\n  \"include\": [\n    \"cutPlan\",\n    \"offcuts\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "POST /v1/validate/1d — Validate a 1D request — free, no key, no quota, no solve",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/validate/1d",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "validate",
                "1d"
              ]
            },
            "description": "Validate a 1D request — free, no key, no quota, no solve\n\nSchema-validate the SAME body `/v1/optimize/1d` takes, WITHOUT solving or spending a call. See `/v1/validate/2d`.",
            "auth": {
              "type": "noauth"
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"parts\": [\n    {\n      \"name\": \"Rail\",\n      \"length\": 1200,\n      \"qty\": 6\n    }\n  ],\n  \"stock\": [\n    {\n      \"length\": 3000,\n      \"qty\": 5,\n      \"price\": 12.5\n    }\n  ],\n  \"options\": {\n    \"kerf\": 3,\n    \"trim\": {\n      \"start\": 10,\n      \"end\": 0\n    }\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "POST /v1/validate/wood — Validate a wood request — free, no key, no quota, no solve",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/validate/wood",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "validate",
                "wood"
              ]
            },
            "description": "Validate a wood request — free, no key, no quota, no solve\n\nSchema-validate the SAME body `/v1/optimize/wood` takes, WITHOUT solving or spending a call. Warnings flag parts with no matching-section stock long enough. See `/v1/validate/2d`.",
            "auth": {
              "type": "noauth"
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"parts\": [\n    {\n      \"name\": \"Rafter\",\n      \"sw\": 50,\n      \"sh\": 100,\n      \"length\": 2400,\n      \"qty\": 2\n    },\n    {\n      \"name\": \"Noggin\",\n      \"sw\": 50,\n      \"sh\": 100,\n      \"length\": 600,\n      \"qty\": 4\n    },\n    {\n      \"name\": \"Beam\",\n      \"sw\": 50,\n      \"sh\": 150,\n      \"length\": 3000,\n      \"qty\": 2\n    }\n  ],\n  \"stock\": [\n    {\n      \"name\": \"C24 50x100\",\n      \"sw\": 50,\n      \"sh\": 100,\n      \"length\": 4000,\n      \"qty\": 5,\n      \"price\": 12.5\n    },\n    {\n      \"name\": \"C24 50x150\",\n      \"sw\": 50,\n      \"sh\": 150,\n      \"length\": 4000,\n      \"qty\": 3,\n      \"price\": 18\n    }\n  ],\n  \"options\": {\n    \"kerf\": 3\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "POST /v1/validate/nest — Validate a nest request — free, no key, no quota, no solve",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/validate/nest",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "validate",
                "nest"
              ]
            },
            "description": "Validate a nest request — free, no key, no quota, no solve\n\nSchema-validate the SAME body `/v1/optimize/nest` takes, WITHOUT solving or spending a call. Reports `engineEnabled` (whether the nesting engine is built into this deployment) and warns about parts whose bounding box fits no stock sheet. For `engine: \"max\"` the verdict matches the optimize path exactly: 400 for anything outside the preview scope, 503 where the async tier is not enabled, and otherwise a warning that the job will be asynchronous. See `/v1/validate/2d`.",
            "auth": {
              "type": "noauth"
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"parts\": [\n    {\n      \"name\": \"bracket\",\n      \"polygon\": [\n        [\n          0,\n          0\n        ],\n        [\n          300,\n          0\n        ],\n        [\n          300,\n          100\n        ],\n        [\n          100,\n          100\n        ],\n        [\n          100,\n          300\n        ],\n        [\n          0,\n          300\n        ]\n      ],\n      \"qty\": 4,\n      \"allowedRotations\": [\n        0,\n        90,\n        180,\n        270\n      ]\n    },\n    {\n      \"name\": \"gusset\",\n      \"polygon\": [\n        [\n          0,\n          0\n        ],\n        [\n          280,\n          0\n        ],\n        [\n          0,\n          280\n        ]\n      ],\n      \"qty\": 4,\n      \"allowedRotations\": [\n        0,\n        90,\n        180,\n        270\n      ]\n    }\n  ],\n  \"stock\": [\n    {\n      \"w\": 2440,\n      \"h\": 1220,\n      \"price\": 12.5,\n      \"exclusions\": [\n        {\n          \"polygon\": [\n            [\n              0,\n              0\n            ],\n            [\n              300,\n              0\n            ],\n            [\n              0,\n              300\n            ]\n          ],\n          \"quality\": 0\n        }\n      ]\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        }
      ]
    },
    {
      "name": "nest",
      "description": "True-shape nesting helpers: read part outlines out of an SVG or DXF file.",
      "item": [
        {
          "name": "POST /v1/import/nest — Read part outlines out of an SVG or DXF file — no quota",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/import/nest",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "import",
                "nest"
              ]
            },
            "description": "Read part outlines out of an SVG or DXF file — no quota\n\nConvert ONE drawing into the `parts[]` rows a nest request takes: every closed outline in the file comes back as a polygon (with its holes folded in), largest first.\n\n**When to use this rather than `parts[].source`.** A part row carries one part, so a source on it must describe one outline. Use this endpoint when a single file holds SEVERAL different components and each needs its own `qty` / `material` / `allowedRotations`: import once, then post the rows you want to `/v1/optimize/nest`. It is also the way to SEE what a file contains before you spend a solve on it.\n\n**Costs a key, not a call.** It needs `Authorization` (unlike `/v1/validate/*`, which is open) because flattening arbitrary path and arc geometry out of a file up to the body cap is real CPU, and anonymity plus real CPU is a bad pairing. But it reserves NOTHING: your monthly quota is untouched and no rate-limit headers come back, exactly like `GET /v1/jobs/{id}`. It shares the engine's CPU semaphore, so a burst answers 429 rather than queueing behind a solve.\n\n**Nothing is stored.** The file exists only as this request body, is parsed in memory and is gone when the response is written — no disk, no database, no temp file. There is nothing to delete afterwards.\n\n**Deterministic.** The same bytes always yield the same vertices in the same order, so an imported part is as cacheable and diffable as a hand-written one. `sourceUnit` reports a DXF `$INSUNITS` when the file declares one — reported, never applied: this API converts nothing.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"content\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 400 200\\\">\\n  <path d=\\\"M0 0 H120 V80 H0 Z\\\"/>\\n  <path d=\\\"M40 30 H80 V50 H40 Z\\\"/>\\n</svg>\",\n  \"filename\": \"washer-plate.svg\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        }
      ]
    },
    {
      "name": "account",
      "description": "Quota and liveness.",
      "item": [
        {
          "name": "GET /v1/usage — The account's current-month usage and quota",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/usage",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "usage"
              ]
            },
            "description": "The account's current-month usage and quota\n\nRead-only. Does not consume quota and does not send rate-limit headers. The period is the UTC calendar month."
          }
        },
        {
          "name": "GET /v1/health — Liveness",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/health",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "health"
              ]
            },
            "description": "Liveness\n\nOpen: no API key, no quota, no database. Deliberately touches nothing stateful, so a database outage cannot make the service look dead to an orchestrator. `HEAD /v1/health` answers the same status with no body, for probes that only read the status line.",
            "auth": {
              "type": "noauth"
            }
          }
        }
      ]
    }
  ]
}