Draft a made-to-measure sewing pattern from a pinned freesewing design (aaron, bruce, teag
Draft a made-to-measure sewing pattern from a pinned freesewing design (aaron, bruce, teagan, simon, hugo, wahid, bella, sven) using your measurements and design options, run fit/seam-allowance checks, lay pieces out on your fabric width with a bounding-box marker, and return a fabric-yield report plus downloadable pattern, layout, cutlist and piece artifacts. Freesewing designs are CC-BY (freesewing.org); this service adds drafting, layout, and reporting.
100000 (raw units)
price
1
calls / 30d
1
unique payers
2026-09-11
updated
Provider
garment.api.williamrobinson.dev · discovered, not yet claimed by its owner
Payment (x402 accepts[])
[
{
"scheme": "exact",
"network": "eip155:8453",
"payTo": "0x26026370fe8b2bb17af9092a17691c76519366da",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "100000",
"maxTimeoutSeconds": 300
}
]Output schema
{
"bazaar": {
"info": {
"input": {
"body": {
"design": "aaron",
"fabric": {
"folded": true,
"gapMm": 10,
"widthMm": 1500
},
"measurements": {
"biceps": 300,
"chest": 1000,
"hips": 1030,
"hpsToBust": 320,
"hpsToWaistBack": 420,
"neck": 380,
"shoulderSlope": 13,
"shoulderToShoulder": 400,
"waistToArmpit": 220,
"waistToHips": 200
},
"options": {
"chestEase": 10,
"hipsEase": 12,
"lengthBonus": 15
},
"saMm": 10
},
"bodyType": "json",
"method": "POST",
"type": "http"
},
"output": {
"example": {
"artifacts": [
{
"href": "https://garment.api.williamrobinson.dev/v1/garment/artifacts/0123456789abcdef0123456789abcdef0123456789abcdef/pattern.svg",
"mediaType": "image/svg+xml",
"name": "pattern.svg",
"sha256": "7fdc2fed33e9e13816bdc135f63dfd9aa355d137a4979c744945d68eb62486cd",
"sizeBytes": 167624
},
{
"href": "https://garment.api.williamrobinson.dev/v1/garment/artifacts/0123456789abcdef0123456789abcdef0123456789abcdef/layout.svg",
"mediaType": "image/svg+xml",
"name": "layout.svg",
"sha256": "9c3272c0cbe195c979d5d47afd99cf58ac77b18a953e17f0438cf8fa3bf5dfd0",
"sizeBytes": 2336
},
{
"href": "https://garment.api.williamrobinson.dev/v1/garment/artifacts/0123456789abcdef0123456789abcdef0123456789abcdef/pieces.json",
"mediaType": "application/json",
"name": "pieces.json",
"sha256": "925703c0e433706e985bc07ef914ea9c34d8c32ddfc93d701502f26dda023770",
"sizeBytes": 2090
},
{
"href": "https://garment.api.williamrobinson.dev/v1/garment/artifacts/0123456789abcdef0123456789abcdef0123456789abcdef/cutlist.csv",
"mediaType": "text/csv; charset=utf-8",
"name": "cutlist.csv",
"sha256": "f847c8039263f44ca3f6d755484de68d7b023c15c5c5f7757f48be905dc74563",
"sizeBytes": 443
},
{
"href": "https://garment.api.williamrobinson.dev/v1/garment/artifacts/0123456789abcdef0123456789abcdef0123456789abcdef/report.json",
"mediaType": "application/json",
"name": "report.json",
"sha256": "3712bddf823468d4b699e8e725cc9b8c7df9499308b8b6aae56a11b725b4789a",
"sizeBytes": 5949
}
],
"checks": [
{
"code": "DESIGN_SUPPORTED",
"detail": "\"aaron\" (Aaron A-shirt) is an allowlisted freesewing design",
"status": "passed"
},
{
"code": "MEASUREMENTS_COMPLETE",
"detail": "All 10 required measurement(s) are present",
"status": "passed"
},
{
"code": "MEASUREMENTS_PLAUSIBLE",
"detail": "Every provided measurement is within its plausible range",
"status": "passed"
},
{
"code": "OPTIONS_IN_RANGE",
"detail": "All 3 provided option(s) are in range",
"status": "passed"
},
{
"code": "DRAFT",
"detail": "Drafted and rendered without errors in 42.4 ms",
"status": "passed"
},
{
"code": "PIECES_NONEMPTY",
"detail": "4 piece(s) drafted",
"status": "passed"
},
{
"code": "SEAM_ALLOWANCE_APPLIED",
"detail": "Every piece with seam-allowance geometry used it for its cutting outline; 2 piece(s) are drafted without a seam allowance by the design: aaron.armBinding, aaron.neckBinding",
"status": "passed"
},
{
"code": "PIECES_FIT_FABRIC",
"detail": "Every piece fits within the usable fabric width of 750 mm",
"status": "passed"
},
{
"code": "LAYOUT_PACKED",
"detail": "4 piece placement(s) packed across 1491.5 mm of fabric length",
"status": "passed"
},
{
"code": "FABRIC_YIELD",
"detail": "Utilization 29.6% of the usable fabric area",
"status": "passed"
}
],
"design": "aaron",
"designVersion": "4.10.1",
"expiresAt": "2026-09-13T14:56:37.143Z",
"freesewingVersion": "4.10.1",
"layout": {
"fabricWidthMm": 1500,
"folded": true,
"gapMm": 10,
"lengthMm": 1491.4860652603518,
"method": "bbox-shelf",
"placements": [
{
"copy": 1,
"mirrored": false,
"onFold": true,
"piece": "aaron.back",
"rotationDeg": 0,
"xMm": 0,
"yMm": 0
},
{
"copy": 1,
"mirrored": false,
"onFold": true,
"piece": "aaron.front",
"rotationDeg": 0,
"xMm": 0,
"yMm": 750.7430326301759
},
{
"copy": 1,
"mirrored": true,
"onFold": false,
"piece": "aaron.armBinding",
"rotationDeg": 0,
"xMm": 293.97999999999996,
"yMm": 750.7430326301759
},
{
"copy": 1,
"mirrored": true,
"onFold": false,
"piece": "aaron.neckBinding",
"rotationDeg": 0,
"xMm": 363.97999999999996,
"yMm": 750.7430326301759
}
],
"usableWidthMm": 750,
"utilization": 0.2958254665958102
},
"limitations": [
"The layout is a bounding-box shelf packing (NFDH), an upper bound on how little fabric a true irregular-shape nesting could use, not a proven optimum or a real marker.",
"Every freesewing pattern this product drafts is CC-BY licensed by freesewing.org (https://freesewing.org); the drafted geometry is derivative of their designs and must be attributed on redistribution.",
"This product does not perform freeform pattern changes, full bust adjustments (beyond a design's own `draftForHighBust`/bust-plugin options), or grading tables; it drafts exactly one size from the measurements given.",
"Measurements and fabric dimensions are metric-only (mm/degrees); no imperial input or output is supported.",
"A drafted, checked pattern is not a guarantee of fit on a body: no physical prototype or wear test is performed.",
"The layout, fabric length, and fabric-yield percentage cover only pieces cut from the design's primary shell fabric; a piece that needs a different material (lining, interfacing, ribbing, etc., named in a warning when present) is still reported with its own bbox/area/cut count but is not laid out or included in that yardage."
],
"measurementsApplied": {
"biceps": 300,
"chest": 1000,
"hips": 1030,
"hpsToBust": 320,
"hpsToWaistBack": 420,
"neck": 380,
"shoulderSlope": 13,
"shoulderToShoulder": 400,
"waistToArmpit": 220,
"waistToHips": 200
},
"optionsApplied": {
"chestEase": 10,
"hipsEase": 12,
"lengthBonus": 15
},
"pieces": [
{
"areaMm2": 133361.34427204923,
"bboxMm": {
"heightMm": 740.7430326301759,
"widthMm": 283.97999999999996
},
"cut": 1,
"hasGrainline": false,
"material": "fabric",
"name": "aaron.front",
"onFold": true,
"saApplied": true,
"title": "front"
},
{
"areaMm2": 133361.34427204923,
"bboxMm": {
"heightMm": 740.7430326301759,
"widthMm": 283.97999999999996
},
"cut": 1,
"hasGrainline": false,
"material": "fabric",
"name": "aaron.back",
"onFold": true,
"saApplied": true,
"title": "back"
},
{
"areaMm2": 32311.488442599337,
"bboxMm": {
"heightMm": 538.5248073766556,
"widthMm": 60
},
"cut": 2,
"hasGrainline": false,
"material": "fabric",
"name": "aaron.armBinding",
"onFold": false,
"saApplied": false,
"title": "aaron:armBinding"
},
{
"areaMm2": 31880.493895896623,
"bboxMm": {
"heightMm": 531.3415649316104,
"widthMm": 60
},
"cut": 1,
"hasGrainline": false,
"material": "fabric",
"name": "aaron.neckBinding",
"onFold": false,
"saApplied": false,
"title": "aaron:neckBinding"
}
],
"saMm": 10,
"status": "passed",
"totals": {
"cutPieces": 5,
"draftMs": 42.43397900000002,
"pieceAreaMm2": 629948.8478692923
},
"warnings": [
"Part \"aaron.armBinding\" is drafted without a seam allowance by the design; its cutting outline is the seam line.",
"Part \"aaron.neckBinding\" is drafted without a seam allowance by the design; its cutting outline is the seam line."
]
},
"type": "json"
}
},
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"input": {
"additionalProperties": false,
"properties": {
"body": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"design": {
"description": "aaron (v4.10.1): requires biceps, chest, hpsToBust, hpsToWaistBack, neck, shoulderToShoulder, shoulderSlope, waistToArmpit, waistToHips, hips; optional highBust; options chestEase:pct[0,20], draftForHighBust:bool, lengthBonus:pct[-20,60], armholeDepth:pct[-10,50], legacyArmholeDepth:bool, hipsEase:pct[0,20], stretchFactor:pct[0,15], armholeDrop:pct[0,75], necklineBend:pct[40,100], necklineDrop:pct[10,35], shoulderStrapWidth:pct[10,40], shoulderStrapPlacement:pct[20,80], backlineBend:pct[25,100], knitBindingWidth:pct[300,800] | bruce (v4.10.1): requires hips, upperLeg, waistToHips, waistToUpperLeg; options bulge:deg[0,40], legBonus:pct[-10,20], rise:pct[0,25], stretch:pct[5,25], legStretch:pct[25,45], backRise:pct[0,10] | teagan (v4.10.1): requires biceps, chest, hpsToBust, hpsToWaistBack, neck, shoulderToShoulder, shoulderSlope, waistToArmpit, waistToHips, hips, waist, shoulderToWrist, wrist; optional highBust; options chestEase:pct[5,25], cuffEase:pct[0,200], draftForHighBust:bool, lengthBonus:pct[-20,60], s3Collar:pct[-100,100], s3Armhole:pct[-100,100], acrossBackFactor:pct[93,100], armholeDepth:pct[-10,50], armholeDepthFactor:pct[50,70], backNeckCutout:pct[4,12], legacyArmholeDepth:bool, sleeveWidthGuarantee:pct[25,100], sleeveLength:pct[20,100], fitWaist:bool, waistEase:pct[8,40], hipsEase:pct[8,30], necklineDepth:pct[20,40], necklineWidth:pct[10,50], necklineBend:pct[0,70], sleevecapEase:pct[0,10], sleevecapTopFactorX:pct[25,75], sleevecapTopFactorY:pct[35,125], sleevecapBackFactorX:pct[35,65], sleevecapBackFactorY:pct[30,65], sleevecapFrontFactorX:pct[35,65], sleevecapFrontFactorY:pct[30,65], sleevecapQ1Offset:pct[0,7], sleevecapQ2Offset:pct[0,7], sleevecapQ3Offset:pct[0,7], sleevecapQ4Offset:pct[0,7], sleevecapQ1Spread1:pct[4,20], sleevecapQ1Spread2:pct[4,20], sleevecapQ2Spread1:pct[4,20], sleevecapQ2Spread2:pct[4,20], sleevecapQ3Spread1:pct[4,20], sleevecapQ3Spread2:pct[4,20], sleevecapQ4Spread1:pct[4,20], sleevecapQ4Spread2:pct[4,20], sleeveEase:pct[5,35] | simon (v4.10.1): requires biceps, chest, hpsToBust, hpsToWaistBack, neck, shoulderToShoulder, shoulderSlope, waistToArmpit, waistToHips, waist, hips, shoulderToWrist, wrist; optional highBust; options bicepsEase:pct[0,50], chestEase:pct[-4,35], collarEase:pct[0,10], cuffEase:pct[10,40], draftForHighBust:bool, shoulderEase:pct[0,15], lengthBonus:pct[-4,60], s3Collar:pct[-100,100], s3Armhole:pct[-100,100], acrossBackFactor:pct[93,100], armholeDepth:pct[-10,50], armholeDepthFactor:pct[50,70], backNeckCutout:pct[2,8], frontArmholeDeeper:pct[0,0.5], shoulderSlopeReduction:pct[0,80], legacyArmholeDepth:bool, backDarts:list[auto/never/always], backDartShaping:pct[5,75], boxPleat:bool, boxPleatFold:pct[10,20], boxPleatWidth:pct[4,10], roundBack:pct[0,10], buttonholePlacketWidth:pct[4,12], buttonholePlacketFoldWidth:pct[8,24], buttonPlacketWidth:pct[2,8], hemCurve:pct[25,100], hemStyle:list[straight/baseball/slashed], hipsEase:pct[10,35], yokeHeight:pct[40,90], sleevePlacketWidth:pct[8,18], waistEase:pct[10,35], buttonFreeLength:pct[-10,15], extraTopButton:bool, separateButtonPlacket:bool, separateButtonholePlacket:bool, buttons:count[4,12], ffsa:pct[100,200], collarAngle:deg[60,130], collarBend:pct[0,10], collarFlare:deg[0,10], collarGap:pct[0,6], collarRoll:pct[0,6], collarWidth:pct[90,200], collarStandBend:deg[0,5], collarStandCurve:deg[0,5], collarStandWidth:pct[3,13], barrelCuffNarrowButton:bool, cuffButtonRows:count[1,2], cuffDrape:pct[0,10], cuffLength:pct[3,15], cuffStyle:list[roundedBarrelCuff/angledBarrelCuff/straightBarrelCuff/roundedFrenchCuff/angledFrenchCuff/straightFrenchCuff], sleeveStyle:list[short/long], buttonPlacketStyle:list[classic/seamless], buttonholePlacketStyle:list[classic/seamless], sleevecapEase:pct[0,10], sleevecapTopFactorX:pct[25,75], sleevecapTopFactorY:pct[35,125], sleevecapBackFactorX:pct[35,65], sleevecapBackFactorY:pct[30,65], sleevecapFrontFactorX:pct[35,65], sleevecapFrontFactorY:pct[30,65], sleevecapQ1Offset:pct[0,7], sleevecapQ2Offset:pct[0,7], sleevecapQ3Offset:pct[0,7], sleevecapQ4Offset:pct[0,7], sleevecapQ1Spread1:pct[4,20], sleevecapQ1Spread2:pct[4,20], sleevecapQ2Spread1:pct[4,20], sleevecapQ2Spread2:pct[4,20], sleevecapQ3Spread1:pct[4,20], sleevecapQ3Spread2:pct[4,20], sleevecapQ4Spread1:pct[4,20], sleevecapQ4Spread2:pct[4,20], sleeveLengthBonus:pct[-40,10], sleeveWidthGuarantee:pct[25,100], sleeveLengthShort:pct[20,100], sleeveHemShort:pct[1,20], sleevePlacketLength:pct[15,35], splitYoke:bool | hugo (v4.10.1): requires biceps, chest, hpsToBust, hpsToWaistBack, neck, shoulderToShoulder, shoulderSlope, waistToArmpit, waistToHips, hips, shoulderToWrist, wrist, head; optional highBust; options bicepsEase:pct[0,50], chestEase:pct[4,20], collarEase:pct[0,10], cuffEase:pct[10,50], draftForHighBust:bool, shoulderEase:pct[-2,6], lengthBonus:pct[-4,60], s3Collar:pct[-100,100], s3Armhole:pct[-100,100], acrossBackFactor:pct[93,100], armholeDepth:pct[-10,50], armholeDepthFactor:pct[50,70], backNeckCutout:pct[2,8], frontArmholeDeeper:pct[0,0.5], shoulderSlopeReduction:pct[0,80], legacyArmholeDepth:bool, hipsEase:pct[4,20], ribbingHeight:pct[4,20], pocketWidth:pct[35,65], sleeveLengthBonus:pct[0,10], ribbingStretch:pct[0,10] | wahid (v4.10.1): requires biceps, chest, hpsToBust, hpsToWaistBack, neck, shoulderToShoulder, shoulderSlope, waistToArmpit, waistToHips, hips, waist; optional highBust; options chestEase:pct[1,10], draftForHighBust:bool, lengthBonus:pct[0,8], armholeDepth:pct[-10,50], armholeDepthFactor:pct[60,80], backNeckCutout:pct[-2,8], shoulderSlopeReduction:pct[0,80], legacyArmholeDepth:bool, necklineDrop:pct[35,85], frontStyle:list[classic/rounded], frontInset:pct[10,20], shoulderInset:pct[0,20], neckInset:pct[0,10], hemStyle:list[classic/rounded/square], hemRadius:pct[2,12], pocketWidth:pct[8,15], pocketAngle:deg[0,5], pocketLocation:pct[25,55], frontScyeDart:deg[0,12], buttons:count[4,12], waistEase:pct[2,15], hipsEase:pct[2,15], legacyWaistHips:bool, backInset:pct[10,20], centerBackDart:pct[0,5], backScyeDart:deg[0,6], weltHeight:pct[10,20] | bella (v4.10.1): requires highBust, chest, underbust, waist, waistBack, bustSpan, neck, hpsToBust, hpsToWaistFront, hpsToWaistBack, shoulderToShoulder, shoulderSlope, biceps, shoulderToWrist, waistToArmpit, wrist; options bustSpanEase:pct[0,20], chestEase:pct[5,20], fullChestEaseReduction:pct[0,8], shoulderToShoulderEase:pct[-1,5], waistEase:pct[1,20], backDartHeight:pct[38,54], bustDartCurve:pct[-100,100], bustDartLength:pct[75,100], bustDartAngle:count[-45,45], bustDartMinimumFabric:pct[1,50], waistDartLength:pct[75,95], waistDartCurve:pct[-100,100], armholeDepth:pct[38,46], backArmholeCurvature:pct[50,85], backArmholePitchDepth:pct[30,40], backArmholeSlant:deg[1,9], frontArmholeCurvature:pct[50,85], frontArmholePitchDepth:pct[27,31], backHemSlope:deg[0,5], backNeckCutout:pct[3,9], frontShoulderWidth:pct[92,98], highBustWidth:pct[80,92], sleevecapEase:pct[0,10], sleevecapTopFactorX:pct[25,75], sleevecapTopFactorY:pct[35,125], sleevecapBackFactorX:pct[35,65], sleevecapBackFactorY:pct[30,65], sleevecapFrontFactorX:pct[35,65], sleevecapFrontFactorY:pct[30,65], sleevecapQ1Offset:pct[0,7], sleevecapQ2Offset:pct[0,7], sleevecapQ3Offset:pct[0,7], sleevecapQ4Offset:pct[0,7], sleevecapQ1Spread1:pct[4,20], sleevecapQ1Spread2:pct[4,20], sleevecapQ2Spread1:pct[4,20], sleevecapQ2Spread2:pct[4,20], sleevecapQ3Spread1:pct[4,20], sleevecapQ3Spread2:pct[4,20], sleevecapQ4Spread1:pct[4,20], sleevecapQ4Spread2:pct[4,20], sleeveLengthBonus:pct[-40,10], sleeveWidthGuarantee:pct[25,100], bellaSleeve:bool, bicepsEase:pct[0,50], cuffEase:pct[0,200] | sven (v4.10.1): requires biceps, chest, hpsToBust, hpsToWaistBack, neck, shoulderToShoulder, shoulderSlope, waistToArmpit, waistToHips, hips, waist, shoulderToWrist, wrist; optional highBust; options bicepsEase:pct[0,50], chestEase:pct[-4,35], collarEase:pct[5,30], cuffEase:pct[0,200], draftForHighBust:bool, shoulderEase:pct[-2,6], lengthBonus:pct[0,30], s3Collar:pct[-100,100], s3Armhole:pct[-100,100], acrossBackFactor:pct[93,100], armholeDepth:pct[-10,50], armholeDepthFactor:pct[50,70], backNeckCutout:pct[2,8], frontArmholeDeeper:pct[0,0.5], shoulderSlopeReduction:pct[0,80], legacyArmholeDepth:bool, sleeveLengthBonus:pct[0,10], ribbingHeight:pct[3,15], hipsEase:pct[-4,20], ribbing:bool, sleevecapEase:pct[0,10], sleevecapTopFactorX:pct[25,75], sleevecapTopFactorY:pct[35,125], sleevecapBackFactorX:pct[35,65], sleevecapBackFactorY:pct[30,65], sleevecapFrontFactorX:pct[35,65], sleevecapFrontFactorY:pct[30,65], sleevecapQ1Offset:pct[0,7], sleevecapQ2Offset:pct[0,7], sleevecapQ3Offset:pct[0,7], sleevecapQ4Offset:pct[0,7], sleevecapQ1Spread1:pct[4,20], sleevecapQ1Spread2:pct[4,20], sleevecapQ2Spread1:pct[4,20], sleevecapQ2Spread2:pct[4,20], sleevecapQ3Spread1:pct[4,20], sleevecapQ3Spread2:pct[4,20], sleevecapQ4Spread1:pct[4,20], sleevecapQ4Spread2:pct[4,20], sleeveWidthGuarantee:pct[25,100], ribbingStretch:pct[0,30] | pct options are percent numbers on freesewing's own 0-100 scale (e.g. chestEase 15 = 15% ease), not 0-1 fractions; their [min,max] can exceed 100.",
"enum": [
"aaron",
"bruce",
"teagan",
"simon",
"hugo",
"wahid",
"bella",
"sven"
],
"type": "string"
},
"fabric": {
"additionalProperties": false,
"properties": {
"folded": {
"default": true,
"description": "Lay the fabric folded lengthwise; usable width halves and on-fold pieces sit on the fold.",
"type": "boolean"
},
"gapMm": {
"default": 10,
"description": "Minimum gap between placed pieces, millimetres.",
"maximum": 100,
"minimum": 0,
"type": "number"
},
"widthMm": {
"description": "Usable fabric width (selvedge to selvedge), millimetres.",
"maximum": 3000,
"minimum": 300,
"type": "number"
}
},
"required": [
"widthMm"
],
"type": "object"
},
"measurements": {
"additionalProperties": {
"exclusiveMinimum": 0,
"maximum": 10000,
"type": "number"
},
"description": "Millimetres for lengths, degrees for angles; keys are the chosen design's required/optional freesewing measurement names.",
"maxProperties": 64,
"type": "object"
},
"options": {
"additionalProperties": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
},
{
"type": "boolean"
}
]
},
"description": "Freesewing design option overrides by name; type and range/enum are validated per the design's option catalog. Fixed-constant options are never settable.",
"maxProperties": 64,
"type": "object"
},
"saMm": {
"default": 10,
"description": "Seam allowance, millimetres (0 = none).",
"maximum": 50,
"minimum": 0,
"type": "number"
}
},
"required": [
"design",
"measurements",
"fabric"
],
"type": "object"
},
"bodyType": {
"enum": [
"json",
"form-data",
"text"
],
"type": "string"
},
"method": {
"enum": [
"POST"
],
"type": "string"
},
"type": {
"const": "http",
"type": "string"
}
},
"required": [
"type",
"method",
"bodyType",
"body"
],
"type": "object"
},
"output": {
"properties": {
"example": {
"$defs": {
"bbox": {
"additionalProperties": false,
"properties": {
"heightMm": {
"minimum": 0,
"type": "number"
},
"widthMm": {
"minimum": 0,
"type": "number"
}
},
"required": [
"widthMm",
"heightMm"
],
"type": "object"
},
"check": {
"additionalProperties": false,
"properties": {
"code": {
"type": "string"
},
"detail": {
"maxLength": 2048,
"type": "string"
},
"status": {
"enum": [
"passed",
"failed",
"not_checked"
],
"type": "string"
}
},
"required": [
"code",
"status",
"detail"
],
"type": "object"
},
"placement": {
"additionalProperties": false,
"properties": {
"copy": {
"minimum": 0,
"type": "integer"
},
"mirrored": {
"type": "boolean"
},
"onFold": {
"type": "boolean"
},
"piece": {
"type": "string"
},
"rotationDeg": {
"enum": [
0,
180
],
"type": "integer"
},
"xMm": {
"type": "number"
},
"yMm": {
"type": "number"
}
},
"required": [
"piece",
"copy",
"xMm",
"yMm",
"rotationDeg",
"mirrored",
"onFold"
],
"type": "object"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"artifacts": {
"items": {
"additionalProperties": false,
"properties": {
"href": {
"format": "uri",
"type": "string"
},
"mediaType": {
"maxLength": 128,
"minLength": 1,
"type": "string"
},
"name": {
"enum": [
"pattern.svg",
"layout.svg",
"pieces.json",
"cutlist.csv",
"report.json"
],
"type": "string"
},
"sha256": {
"pattern": "^[a-f0-9]{64}$",
"type": "string"
},
"sizeBytes": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"name",
"mediaType",
"sizeBytes",
"sha256",
"href"
],
"type": "object"
},
"maxItems": 5,
"type": "array"
},
"checks": {
"items": {
"$ref": "#/properties/output/properties/example/$defs/check"
},
"type": "array"
},
"design": {
"enum": [
"aaron",
"bruce",
"teagan",
"simon",
"hugo",
"wahid",
"bella",
"sven"
],
"type": "string"
},
"designVersion": {
"type": "string"
},
"expiresAt": {
"format": "date-time",
"type": "string"
},
"freesewingVersion": {
"const": "4.10.1",
"type": "string"
},
"layout": {
"additionalProperties": false,
"properties": {
"fabricWidthMm": {
"minimum": 0,
"type": "number"
},
"folded": {
"type": "boolean"
},
"gapMm": {
"minimum": 0,
"type": "number"
},
"lengthMm": {
"minimum": 0,
"type": "number"
},
"method": {
"const": "bbox-shelf",
"type": "string"
},
"placements": {
"items": {
"$ref": "#/properties/output/properties/example/$defs/placement"
},
"type": "array"
},
"usableWidthMm": {
"minimum": 0,
"type": "number"
},
"utilization": {
"maximum": 1,
"minimum": 0,
"type": "number"
}
},
"required": [
"fabricWidthMm",
"usableWidthMm",
"folded",
"gapMm",
"lengthMm",
"utilization",
"method",
"placements"
],
"type": [
"object",
"null"
]
},
"limitations": {
"items": {
"maxLength": 4096,
"type": "string"
},
"type": "array"
},
"measurementsApplied": {
"additionalProperties": {
"type": "number"
},
"type": "object"
},
"optionsApplied": {
"additionalProperties": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
},
{
"type": "boolean"
}
]
},
"type": "object"
},
"pieces": {
"items": {
"additionalProperties": false,
"properties": {
"areaMm2": {
"minimum": 0,
"type": "number"
},
"bboxMm": {
"$ref": "#/properties/output/properties/example/$defs/bbox"
},
"cut": {
"minimum": 0,
"type": "integer"
},
"hasGrainline": {
"type": "boolean"
},
"material": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"onFold": {
"type": "boolean"
},
"saApplied": {
"type": "boolean"
},
"title": {
"type": "string"
}
},
"required": [
"name",
"title",
"bboxMm",
"areaMm2",
"cut",
"onFold",
"hasGrainline",
"material",
"saApplied"
],
"type": "object"
},
"type": "array"
},
"saMm": {
"minimum": 0,
"type": "number"
},
"status": {
"enum": [
"passed",
"rejected"
],
"type": "string"
},
"totals": {
"additionalProperties": false,
"properties": {
"cutPieces": {
"minimum": 0,
"type": "integer"
},
"draftMs": {
"minimum": 0,
"type": "number"
},
"pieceAreaMm2": {
"minimum": 0,
"type": "number"
}
},
"required": [
"pieceAreaMm2",
"cutPieces",
"draftMs"
],
"type": [
"object",
"null"
]
},
"warnings": {
"items": {
"maxLength": 4096,
"type": "string"
},
"type": "array"
}
},
"required": [
"status",
"design",
"designVersion",
"freesewingVersion",
"measurementsApplied",
"optionsApplied",
"saMm",
"pieces",
"layout",
"totals",
"checks",
"warnings",
"limitations",
"expiresAt",
"artifacts"
],
"type": "object"
},
"type": {
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
}
},
"required": [
"input"
],
"type": "object"
}
},
"builder-code": {
"info": {
"s": [
"cdp_sdk_server"
]
},
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"a": {
"description": "App builder code",
"pattern": "^[a-z0-9_]{1,32}$",
"type": "string"
},
"s": {
"description": "Service builder codes",
"items": {
"pattern": "^[a-z0-9_]{1,32}$",
"type": "string"
},
"maxItems": 11,
"type": "array"
},
"w": {
"description": "Wallet builder code",
"pattern": "^[a-z0-9_]{1,32}$",
"type": "string"
}
},
"type": "object"
}
},
"eip2612GasSponsoring": {},
"erc20ApprovalGasSponsoring": {},
"payment-identifier": {
"info": {
"required": true
},
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"id": {
"maxLength": 128,
"minLength": 16,
"pattern": "^[a-zA-Z0-9_-]+$",
"type": "string"
},
"required": {
"type": "boolean"
}
},
"required": [
"required"
],
"type": "object"
}
}
}Use it
curl
curl "https://garment.api.williamrobinson.dev/v1/garment/draft" # -> 402 Payment Required, accepts[] lists how to pay # retry with a PAYMENT-SIGNATURE (or PAYMENT header) once paid
JavaScript
const res = await fetch("https://garment.api.williamrobinson.dev/v1/garment/draft");
if (res.status === 402) {
const { accepts } = await res.json();
// pay one of accepts[] via an x402 client, then retry with the payment header
}Python
import httpx
res = httpx.get("https://garment.api.williamrobinson.dev/v1/garment/draft")
if res.status_code == 402:
accepts = res.json()["accepts"]
# pay one of accepts[] via an x402 client, then retry with the payment headerMachine-readable
Everything on this page is also available as clean JSON at /resources/8204.json, and this resource appears in /discovery/resources and /discovery/search.