{
  "openapi": "3.0.1",
  "info": {
    "title": "Cut List Optimizer: Sheet, Panel & Lumber Cutting Plans",
    "description": "Optimize cutting plans for plywood, MDF, melamine, glass and sheet metal, and for lumber, bars and pipes. Kerf, grain, edge banding, offcuts and costs; panel-saw, strip or CNC layouts. Diagrams, workshop PDF, Excel, CSV and DXF. Text, JSON or CSV input. For AI agents.",
    "version": "0.1",
    "x-build-id": "J2tUpBNdDpjlT1PIg"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/jumblemog~cut-list-optimizer/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-jumblemog-cut-list-optimizer",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/jumblemog~cut-list-optimizer/runs": {
      "post": {
        "operationId": "runs-sync-jumblemog-cut-list-optimizer",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/jumblemog~cut-list-optimizer/run-sync": {
      "post": {
        "operationId": "run-sync-jumblemog-cut-list-optimizer",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "parts": {
            "title": "Parts to cut",
            "type": "array",
            "description": "One part per entry, as text or an object. Text: \"Side: 720 x 560, qty 2, grain, banding: L1 L2\": the name, the length and width (or just a length for lumber, bars and pipes: \"Rail: 1200, qty 4\"), then the quantity, grain (keeps the part's length along the sheet's length), edge banding (all, front, L1 L2 W1, 2L1W) and material: name. \"720 x 560 x 2\" reads the third number as the quantity. Objects: {\"name\": \"Side\", \"length\": 720, \"width\": 560, \"quantity\": 2, \"grain\": true, \"material\": \"birch ply\", \"banding\": \"L1 L2\"}."
          },
          "stock": {
            "title": "Stock to cut from",
            "type": "array",
            "description": "The sheets or lengths you can buy or have, as text or objects. Text: \"Birch ply 18mm: 2440 x 1220, $52, 10 sheets\": the name (which is also the material parts match), the size, the price and how many there are (leave it out for as many as needed). Lengths: \"2x4: 8 ft, $4.50\", \"Steel tube 40x40x2: 6 m\". Leftovers: \"Offcut: 900 x 600\" (used first; one of each unless a quantity is given). Objects: {\"name\": \"Plywood\", \"length\": 2440, \"width\": 1220, \"price\": 52, \"quantity\": 10}. Several sizes can be listed; the plan picks the best mix."
          },
          "partsCsv": {
            "title": "Parts as CSV or link",
            "type": "string",
            "description": "Parts as CSV or TSV text with a header row such as name,length,width,quantity,material,grain,banding, or a link to a CSV, Excel or JSON file or a Google Sheet (shared to anyone with the link). Without a header the columns are name, length, width, quantity. Added to Parts to cut."
          },
          "stockCsv": {
            "title": "Stock as CSV or link",
            "type": "string",
            "description": "Stock as CSV text with a header row such as name,length,width,quantity,price, or a link to a file or Google Sheet. Added to Stock to cut from."
          },
          "units": {
            "title": "Units",
            "enum": [
              "auto",
              "mm",
              "cm",
              "m",
              "in",
              "ft"
            ],
            "type": "string",
            "description": "The unit of sizes written without one, and of the results. Automatic uses the unit written with the sizes, or guesses from the stock's size (96 x 48 is inches, 2440 x 1220 millimeters) and says so in the notes.",
            "default": "auto"
          },
          "kerf": {
            "title": "Kerf (blade width)",
            "type": "string",
            "description": "The width of material each cut removes, such as 3 mm, 1/8\" or 0.125. Empty: 3 mm, or 1/8\" for inches. Use 0 for laser or shear cuts."
          },
          "edgeTrim": {
            "title": "Edge trim",
            "type": "string",
            "description": "How much to trim off every edge of a sheet (and each end of a length) before cutting parts, for chipped factory edges, such as 10 mm. Empty: none. A stock item's own trim (\"trim 0\") wins."
          },
          "cutStyle": {
            "title": "How the parts are cut",
            "enum": [
              "guillotine",
              "strips",
              "nested"
            ],
            "type": "string",
            "description": "Guillotine layouts can be cut with straight cuts that each run right across the piece being cut, and come with the saw cuts in order. Strips are the simplest to cut. Nested layouts place parts anywhere and often use less material.",
            "default": "guillotine"
          },
          "allowRotation": {
            "title": "Parts may be turned",
            "type": "boolean",
            "description": "Let parts without grain turn a quarter turn to fit better. Parts marked grain never turn. Off: every part keeps its length along the sheet's length.",
            "default": true
          },
          "goal": {
            "title": "Optimize for",
            "enum": [
              "least-waste",
              "lowest-cost",
              "fewest-stock"
            ],
            "type": "string",
            "description": "What the plan makes as small as it can when several stock sizes or prices are given.",
            "default": "least-waste"
          },
          "minOffcut": {
            "title": "Smallest offcut worth keeping",
            "type": "string",
            "description": "Leftovers at least this size are listed as offcuts to keep (for sheets, both sides at least this wide); smaller ones count as waste. Empty: 150 mm (6\") for sheets and 300 mm (12\") for lengths."
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "The currency of stock prices, such as $, €, £ or EUR. Empty: the one written with the prices, or $."
          },
          "title": {
            "title": "Title",
            "type": "string",
            "description": "A title for the plan and its files, such as Kitchen cabinets."
          },
          "timeLimitSeconds": {
            "title": "Time limit per plan (seconds)",
            "minimum": 1,
            "maximum": 300,
            "type": "integer",
            "description": "How long to search for a better plan. Most cut lists are done, often proven the best possible, in a second or two; large ones (hundreds of parts) gain from 30 to 60 seconds. Solving past 30 seconds is billed per started 10 seconds.",
            "default": 10
          },
          "jobs": {
            "title": "Several jobs",
            "type": "array",
            "description": "Plan several cut lists in one run: a list of objects with their own parts, stock or settings (any field above). Fields not given come from above: [{\"title\": \"Kitchen\", \"parts\": [...]}, {\"title\": \"Wardrobe\", \"parts\": [...], \"stock\": [...]}]."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}