{"id":"pack-size","title":"Pack sizes, MOQ, order increments, overbuy cap and price breakpoints: what to actually order","description":"Finds the cheapest valid order quantity for a requested number of units across up to 50 supplier options, for an agent buying parts or consumables sold in packs. Each option has a pack size (units per pack or notation such as \"6x100\", \"case of 12\", \"12/case\", \"case of 6 inners\"), an optional minimum order quantity, an order increment and price breakpoints; the order is rounded up to a multiple of both the pack and the increment and at least the MOQ, and a higher breakpoint is considered when raising the quantity to it costs no more. A notation that does not fix the count (\"6x100g\": 6 pieces or 600 g; \"case of 6 inners\" with no units per inner) returns unknown with every reading. An overbuy cap in percent rejects options that exceed it. Prices are in whatever currency the caller uses. Not a stock or lead-time check.","roi":"\"6x100\" and \"case of 12 inners\" are where agents order 12x too much. Exact arithmetic on packs, MOQ and breakpoints, ambiguity flagged.","audience":"business","package":"money-math-kit","channels":["x402","mcp"],"endpoint":{"method":"POST","url":"https://agents.writerslogic.com/api/v1/pack-size","path":"/api/v1/pack-size","contentType":"application/json"},"price":{"amount":"0.005","currency":"USDC","network":"base","perCall":true,"failedCallsCharged":false},"inputSchema":{"type":"object","additionalProperties":false,"required":["requested","options"],"properties":{"requested":{"type":"integer","minimum":1,"maximum":1000000000,"description":"Units needed."},"options":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["id"],"properties":{"id":{"type":"string","minLength":1,"maxLength":80},"packNotation":{"type":"string","minLength":1,"maxLength":40,"description":"e.g. \"6x100\", \"case of 12\", \"12/case\", \"case of 6 inners\"."},"unitsPerPack":{"type":"integer","minimum":1,"maximum":1000000000,"description":"Settles an ambiguous packNotation; a value that matches no reading of the notation fails."},"innerUnits":{"type":"integer","minimum":1,"maximum":1000000,"description":"Units per inner pack, for notations that count inner packs."},"moq":{"type":"integer","minimum":1,"maximum":1000000000,"description":"Minimum order quantity in units."},"increment":{"type":"integer","minimum":1,"maximum":1000000000,"description":"Orders must be a multiple of this many units (default: the pack size)."},"unitPrice":{"type":"string","pattern":"^-?\\d{1,15}(\\.\\d{1,12})?$","maxLength":30,"description":"Base price per unit."},"breakpoints":{"type":"array","maxItems":20,"items":{"type":"object","required":["minQty","unitPrice"],"properties":{"minQty":{"type":"integer","minimum":1,"maximum":1000000000},"unitPrice":{"type":"string","pattern":"^-?\\d{1,15}(\\.\\d{1,12})?$","maxLength":30,"description":"Decimal string such as \"-12.50\" (up to 15 integer and 12 fraction digits). JSON numbers are not accepted: they are binary floats."}},"additionalProperties":false},"description":"Price per unit from minQty units upward (the highest breakpoint reached applies)."}},"additionalProperties":false}},"overbuyCapPercent":{"type":"string","pattern":"^-?\\d{1,15}(\\.\\d{1,12})?$","maxLength":30,"description":"Reject orders exceeding the request by more than this percent."}}},"resultSchema":{"type":"object","properties":{"status":{"type":"string","enum":["pass","fail","unknown","unsupported"],"description":"pass: every rule held. fail: a rule was violated (see witnesses). unknown: the input lacks the evidence to decide. unsupported: outside what this engine covers. Missing evidence is never a pass."},"options":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["pass","fail","unknown","unsupported"]},"unitsPerPack":{"type":"integer"},"readings":{"type":"array","items":{"type":"object","properties":{"unitsPerPack":{"type":"integer"},"structure":{"type":"string"}}}},"orderQty":{"type":"integer"},"packs":{"type":"integer"},"overbuyUnits":{"type":"integer"},"overbuyPercent":{"type":"string"},"unitPrice":{"type":"string"},"total":{"type":"string","description":"Exact orderQty x unit price."},"note":{"type":"string"}}}},"best":{"type":"string","description":"Id of the cheapest valid option by total (lowest overbuy, then first, on ties)."},"witnesses":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string"},"detail":{"type":"string"},"path":{"type":"string","description":"JSON pointer or dotted path into the input."},"offset":{"type":"integer"},"index":{"type":"integer"},"expected":{"description":"What the rule required."},"actual":{"description":"What the input had."}}}},"versions":{"type":"object","description":"Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile)."},"limits":{"type":"array","items":{"type":"string"}},"deterministic":{"type":"boolean","description":"Always true: pure code, no model."}}},"outputSchema":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"type":"string","enum":["pass","fail","unknown","unsupported"],"description":"pass: every rule held. fail: a rule was violated (see witnesses). unknown: the input lacks the evidence to decide. unsupported: outside what this engine covers. Missing evidence is never a pass."},"options":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["pass","fail","unknown","unsupported"]},"unitsPerPack":{"type":"integer"},"readings":{"type":"array","items":{"type":"object","properties":{"unitsPerPack":{"type":"integer"},"structure":{"type":"string"}}}},"orderQty":{"type":"integer"},"packs":{"type":"integer"},"overbuyUnits":{"type":"integer"},"overbuyPercent":{"type":"string"},"unitPrice":{"type":"string"},"total":{"type":"string","description":"Exact orderQty x unit price."},"note":{"type":"string"}}}},"best":{"type":"string","description":"Id of the cheapest valid option by total (lowest overbuy, then first, on ties)."},"witnesses":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string"},"detail":{"type":"string"},"path":{"type":"string","description":"JSON pointer or dotted path into the input."},"offset":{"type":"integer"},"index":{"type":"integer"},"expected":{"description":"What the rule required."},"actual":{"description":"What the input had."}}}},"versions":{"type":"object","description":"Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile)."},"limits":{"type":"array","items":{"type":"string"}},"deterministic":{"type":"boolean","description":"Always true: pure code, no model."}}},"_provenance":{"type":"object","description":"C2PA-aligned manifest and W3C VC 2.0 (eddsa-jcs-2022) issued by the hub DID; verify at POST /api/v1/verify-provenance"}},"required":["data","_provenance"]},"example":{"requested":250,"overbuyCapPercent":"25","options":[{"id":"A","packNotation":"case of 12","unitPrice":"1.50","breakpoints":[{"minQty":300,"unitPrice":"1.20"}]},{"id":"B","packNotation":"6x100","moq":600,"unitPrice":"1.00"},{"id":"C","packNotation":"case of 6 inners","unitPrice":"1.10"}]},"openapiOperation":{"operationId":"pack_size","summary":"Pack sizes, MOQ, order increments, overbuy cap and price breakpoints: what to actually order","description":"Finds the cheapest valid order quantity for a requested number of units across up to 50 supplier options, for an agent buying parts or consumables sold in packs. Each option has a pack size (units per pack or notation such as \"6x100\", \"case of 12\", \"12/case\", \"case of 6 inners\"), an optional minimum order quantity, an order increment and price breakpoints; the order is rounded up to a multiple of both the pack and the increment and at least the MOQ, and a higher breakpoint is considered when raising the quantity to it costs no more. A notation that does not fix the count (\"6x100g\": 6 pieces or 600 g; \"case of 6 inners\" with no units per inner) returns unknown with every reading. An overbuy cap in percent rejects options that exceed it. Prices are in whatever currency the caller uses. Not a stock or lead-time check.\n\nPrice: 0.005 USDC on Base (x402).","x-x402-price-usdc":"0.005","x-x402-amount":"5000","x-payment-info":{"protocols":["x402"],"price":{"mode":"fixed","currency":"USD","amount":"0.005"}},"x-audience":"business","x-sample-url":"https://agents.writerslogic.com/api/v1/samples/pack-size","security":[{"x402":[]},{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["requested","options"],"properties":{"requested":{"type":"integer","minimum":1,"maximum":1000000000,"description":"Units needed."},"options":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["id"],"properties":{"id":{"type":"string","minLength":1,"maxLength":80},"packNotation":{"type":"string","minLength":1,"maxLength":40,"description":"e.g. \"6x100\", \"case of 12\", \"12/case\", \"case of 6 inners\"."},"unitsPerPack":{"type":"integer","minimum":1,"maximum":1000000000,"description":"Settles an ambiguous packNotation; a value that matches no reading of the notation fails."},"innerUnits":{"type":"integer","minimum":1,"maximum":1000000,"description":"Units per inner pack, for notations that count inner packs."},"moq":{"type":"integer","minimum":1,"maximum":1000000000,"description":"Minimum order quantity in units."},"increment":{"type":"integer","minimum":1,"maximum":1000000000,"description":"Orders must be a multiple of this many units (default: the pack size)."},"unitPrice":{"type":"string","pattern":"^-?\\d{1,15}(\\.\\d{1,12})?$","maxLength":30,"description":"Base price per unit."},"breakpoints":{"type":"array","maxItems":20,"items":{"type":"object","required":["minQty","unitPrice"],"properties":{"minQty":{"type":"integer","minimum":1,"maximum":1000000000},"unitPrice":{"type":"string","pattern":"^-?\\d{1,15}(\\.\\d{1,12})?$","maxLength":30,"description":"Decimal string such as \"-12.50\" (up to 15 integer and 12 fraction digits). JSON numbers are not accepted: they are binary floats."}},"additionalProperties":false},"description":"Price per unit from minQty units upward (the highest breakpoint reached applies)."}},"additionalProperties":false}},"overbuyCapPercent":{"type":"string","pattern":"^-?\\d{1,15}(\\.\\d{1,12})?$","maxLength":30,"description":"Reject orders exceeding the request by more than this percent."}}},"example":{"requested":250,"overbuyCapPercent":"25","options":[{"id":"A","packNotation":"case of 12","unitPrice":"1.50","breakpoints":[{"minQty":300,"unitPrice":"1.20"}]},{"id":"B","packNotation":"6x100","moq":600,"unitPrice":"1.00"},{"id":"C","packNotation":"case of 6 inners","unitPrice":"1.10"}]}}}},"responses":{"200":{"description":"Paid result with provenance","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"type":"string","enum":["pass","fail","unknown","unsupported"],"description":"pass: every rule held. fail: a rule was violated (see witnesses). unknown: the input lacks the evidence to decide. unsupported: outside what this engine covers. Missing evidence is never a pass."},"options":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["pass","fail","unknown","unsupported"]},"unitsPerPack":{"type":"integer"},"readings":{"type":"array","items":{"type":"object","properties":{"unitsPerPack":{"type":"integer"},"structure":{"type":"string"}}}},"orderQty":{"type":"integer"},"packs":{"type":"integer"},"overbuyUnits":{"type":"integer"},"overbuyPercent":{"type":"string"},"unitPrice":{"type":"string"},"total":{"type":"string","description":"Exact orderQty x unit price."},"note":{"type":"string"}}}},"best":{"type":"string","description":"Id of the cheapest valid option by total (lowest overbuy, then first, on ties)."},"witnesses":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string"},"detail":{"type":"string"},"path":{"type":"string","description":"JSON pointer or dotted path into the input."},"offset":{"type":"integer"},"index":{"type":"integer"},"expected":{"description":"What the rule required."},"actual":{"description":"What the input had."}}}},"versions":{"type":"object","description":"Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile)."},"limits":{"type":"array","items":{"type":"string"}},"deterministic":{"type":"boolean","description":"Always true: pure code, no model."}}},"_provenance":{"type":"object","description":"C2PA-aligned manifest and W3C VC 2.0 (eddsa-jcs-2022) issued by the hub DID; verify at POST /api/v1/verify-provenance"}},"required":["data","_provenance"]}}}},"400":{"description":"Invalid request (no payment consumed)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"401":{"description":"Invalid X-API-KEY","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"402":{"description":"Payment required or invalid","content":{"application/json":{"schema":{"type":"object","description":"x402 v2 PaymentRequired (also base64 in the PAYMENT-REQUIRED header)","properties":{"x402Version":{"type":"integer"},"error":{"type":"string"},"code":{"type":"string"},"resource":{"type":"object"},"accepts":{"type":"array","items":{"type":"object"}},"extensions":{"type":"object"}}}}}},"502":{"description":"Upstream failure; the payment is released or not settled","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}},"links":{"docs":"https://agents.writerslogic.com/docs/pack-size/","docsJson":"https://agents.writerslogic.com/docs/pack-size.json","sample":"https://agents.writerslogic.com/api/v1/samples/pack-size","openapi":"https://agents.writerslogic.com/openapi.json","catalog":"https://agents.writerslogic.com/api/v1/catalog","verifyProvenance":"https://agents.writerslogic.com/api/v1/verify-provenance","index":"https://agents.writerslogic.com/docs/index.json"}}