{"openapi":"3.0.1","info":{"title":"Supacolour API","description":"Order heat transfers programmatically: quote, submit, attach artwork, then track to despatch.\n\nThis is the same API the Supacolour dashboard runs on — not a reduced side-door version. Anything the\ndashboard does, your system can do.\n\n## This document is region-specific\n\nThis copy of the spec targets `https://api.supacolour.co.uk`. Your account exists in exactly one region, and\nyour credentials only work against that region's host — **which host that is comes with your\ncredentials when they are issued** (it is not discoverable from the API itself). If your account is\nin a different region, use that region's own copy of this document:\n\n- **United States** — `https://api.supacolor.com` · [spec](https://supacolor.com/developers/openapi.json)\n- **New Zealand & Australia** — `https://api.supacolour.co.nz` · [spec](https://supacolour.co.nz/developers/openapi.json)\n- **Europe** — `https://api.supacolour.eu` · [spec](https://integrate.supacolour.eu/developers/openapi.json)\n\n## Authenticate\n\nOAuth2 client credentials. `POST https://api.supacolour.co.uk/api/auth/token` with `client_id` and\n`client_secret` (form-encoded) returns a bearer token; send it as\n`Authorization: Bearer <token>`. Credentials are issued per wholesale account and see only that\naccount's data.\n\n## The ordering flow\n\nEach step produces something the next one needs. Call them in this order:\n\n1. **`GET /PriceCodes/processes`** — the processes your account can order (Wearable, SupaDTF, Sub\n   Block …). Start here: availability is per-account, so never hardcode it.\n2. **`GET /PriceCodes/price-codes`** — price codes for those processes, with sizes and prices at\n   *your* tier. The `code` returned is what goes in a job line.\n3. **`GET /Jobs/delivery-options`** and **`GET /Jobs/earliest-ship-date`** — the delivery methods\n   available to you, and the soonest despatch for the processes you're ordering. The method code goes\n   in `deliveryAddress.deliveryMethod`.\n4. **`POST /Jobs`** — create the job, with the artwork on each line as\n   `externalArtworkUrl`. ⚠️ Send `\"validateOnly\": true` first: it runs the full validation path\n   and returns the errors without creating anything. Build against that.\n5. **`GET /Jobs/{jobNumber}`** — status, money, tracking. **`GET /Jobs/active`** returns\n   everything open in one call; prefer it over polling jobs individually.\n\n## Artwork goes on the job line\n\nPut a URL to the artwork in `externalArtworkUrl` on each `PriceCode` line. That is how our own\nordering works, and it means one request places the order and delivers the art together.\n\nThe URL must stay reachable until the job is in production — we fetch it, we do not hold a copy of\nyour link. A signed URL is fine as long as it outlives the job reaching the factory.\n\n## After you have ordered\n\nA job is not frozen the moment you submit it. `GET /Jobs/{jobNumber}` tells you what you may still\ndo, and you should read that rather than assume:\n\n- **`permissions.canEdit`** — whether **`PATCH /Jobs/{jobNumber}`** will be accepted. You can\n  amend the description, your PO number, comments, the requested ship date and the must-ship flag.\n  When it is `false`, `permissions.lockedReason` says why.\n- **`isCancelable`** — whether **`POST /Jobs/{jobNumber}/cancel`** will be accepted. Once the job\n  is in production it will not be, and you get a `409`.\n\n⚠️ They are independent, and they do not change together. A job already in production is commonly\n`canEdit: true` and `isCancelable: false` — you can still fix the PO number, but the order is\npast the point of being called back. Read both, rather than inferring one from the other or caching\nan earlier answer.\n\n## Reordering costs you nothing\n\nAn asset is a print already made. `GET /Assets` lists yours. To run it again, send a job line with\n`\"itemType\": \"Asset\"` and the asset tag as `code` — no artwork upload, no colour re-approval, and\nthe result matches the previous run.\n\n## Conventions that will bite you otherwise\n\n- **`items[].itemType` selects the line type.** `\"PriceCode\"` for a new print, `\"Asset\"` for a\n  reorder, `\"Stock\"` for stocked goods — and it decides what `code` means (full price code, asset\n  tag, or stock code respectively). The schema does not enumerate these values; this list is the\n  documentation.\n- **A 500 from `POST /Jobs` usually means an invalid payload, not an outage.** Empty `items`, an\n  unroutable delivery address, a nonexistent asset code or a bad `sizeQuantities` key all surface\n  as an opaque 500. Fix the payload before retrying; `validateOnly` with a well-formed payload\n  returns real validation messages.\n- **Read enums, don't hardcode them.** Job statuses come from `GET /Lookups/job-statuses`,\n  processes from `GET /Lookups/process-codes`, countries and states from `GET /Lookups/countries`.\n- **Size strings are labels, not geometry.** A price code's size is the code's own string. Don't\n  parse it to compute artwork dimensions.\n- **Money is in the account's currency.** No conversion is applied anywhere.\n- **`countryCodeISO2` is two characters** — `\"US\"`, not `\"USA\"`. A three-letter code is rejected.\n- **4xx bodies carry the reason.** Every operation documents its failure codes; read the body rather\n  than retrying blind.","version":"V1","contact":{"name":"Supacolour","url":"https://supacolour.co.uk/wholesale/api"}},"paths":{"/account":{"get":{"tags":["Account"],"summary":"Get account profile","description":"The account these credentials belong to. Call it once a token works to confirm you are pointed at the right customer. (It cannot tell you which region to use — you need the right regional host to get a token at all, and that host comes with your credentials.)","responses":{"200":{"description":"Account profile retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dto_Api_AccountProfile"},"examples":{"default":{"summary":"The account these credentials belong to","value":{"id":4820,"name":"Riverside Print Co","priceTierCode":"B","currency":"NZD","taxRateType":"Inclusive","taxRate":15,"taxSystemTaxExempt":false,"taxSystemTaxExemptReason":"","showPayNow":true,"creditCardRequired":false,"shipmentCarriersCSV":"","excludeShipmentsCsv":null,"courierAccountCode":"","courierSiteID":null,"crmId":"","accountManagerName":"Alex Rivera","accountManagerEmail":"alex@example.com","tierLast12Months":"B","paymentTermDays":20,"paymentTermType":"FollowingMonthEnd","entityAddress":{"id":90211,"streetAddress":"12 Tannery Road","addressLine2":"","city":"Auckland","state":"","stateFull":"","postalCode":"1010","countryCode":"NZ","countryName":"New Zealand","contactName":"Sam Patel","organisation":"Riverside Print Co","phone":"+64 9 555 0100","emailAddress":"sam@example.com","addressSummaryOneLine":"12 Tannery Road, Auckland 1010, New Zealand"},"taxCertificates":[],"paymentMode":null,"paymentMethods":[]}}}}}},"401":{"description":"User is not authenticated — No valid bearer token. Request one from this region’s `/api/auth/token` with your `client_id` and `client_secret`, and send it as `Authorization: Bearer <token>`. A token from another region’s host will also produce this.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"404":{"description":"Account not found — No such record, or it is not visible to your account. Credentials only ever see their own account’s data, so a valid identifier belonging to another customer answers exactly like one that does not exist.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"security":[{"token":[]}],"operationId":"getAccount"}},"/account/user":{"get":{"tags":["Account"],"summary":"Get current user profile","description":"Retrieves your user profile information including contact details, preferences, and notification settings.","responses":{"200":{"description":"User profile retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dto_Api_AccountUserInfo"},"examples":{"default":{"summary":"The user behind the current credentials","value":{"id":51188,"guid":"3f7c1e28-0000-4a1b-9c44-2b6d5e900001","customerId":4820,"customerName":"Riverside Print Co","userName":"spatel","firstName":"Sam","lastName":"Patel","emailAddress":"sam@example.com","active":true,"phone":"+64 9 555 0100","mobile":"","streetAddress":"12 Tannery Road","addressLine2":"","suburb":"","city":"Auckland","state":"","postalCode":"1010","country":"New Zealand","locationID":null,"locationName":null,"defaultPage":"","orderNumberPrefix":"","receiveEmails":true,"promotionRecipient":false,"receiveInvoice":true,"receiveInwards":false,"textNotifyProof":false,"textNotifyDispatch":false,"usernameLoginOnly":false,"lastLogin":"2026-08-01T09:14:22Z","loginCount":214}}}}}},"401":{"description":"User is not authenticated — No valid bearer token. Request one from this region’s `/api/auth/token` with your `client_id` and `client_secret`, and send it as `Authorization: Bearer <token>`. A token from another region’s host will also produce this.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"404":{"description":"User not found — No such record, or it is not visible to your account. Credentials only ever see their own account’s data, so a valid identifier belonging to another customer answers exactly like one that does not exist.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"security":[{"token":[]}],"operationId":"getAccountUser"}},"/account/users":{"get":{"tags":["Account"],"summary":"Get list of users in organization","description":"Retrieves a paginated list of all users in your organization. Only available to customer administrators.\r\nSupports filtering by active status, text search, sorting, and pagination.","parameters":[{"name":"includeInactive","in":"query","description":"Include inactive users (default: false)","schema":{"type":"boolean","default":false}},{"name":"page","in":"query","description":"Page number, 1-based (default: 1)","schema":{"type":"integer","format":"int32","default":1}},{"name":"pageSize","in":"query","description":"Number of records per page (default: 50)","schema":{"type":"integer","format":"int32","default":50}},{"name":"sortBy","in":"query","description":"Column to sort by (default: LastName). Valid values: LastName, FirstName, UserName, Email, LastLoginUtc, LoginCount","schema":{"type":"string","default":"LastName"}},{"name":"sortDirection","in":"query","description":"Sort direction: ASC or DESC (default: ASC)","schema":{"type":"string","default":"ASC"}},{"name":"textFilter","in":"query","description":"Optional text filter to search username, first name, last name, or email","schema":{"type":"string"}}],"responses":{"200":{"description":"User list retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedDataOf1Codewolf_Ctrl_Api_Dto_Api_AccountUserSummary"},"examples":{"default":{"summary":"Users on the account (CustomerAdmin only)","value":{"pageSize":25,"returnedResults":1,"totalResults":1,"totalPages":1,"currentPage":1,"hasNext":false,"hasPrevious":false,"filter":null,"nextUrl":null,"previousUrl":null,"entities":[{"id":51188,"guid":"3f7c1e28-0000-4a1b-9c44-2b6d5e900001","userName":"spatel","firstName":"Sam","lastName":"Patel","emailAddress":"sam@example.com","active":true,"locationName":null,"usernameLoginOnly":false,"lastLogin":"2026-08-01T09:14:22Z","loginCount":214}]}}}}}},"401":{"description":"User is not authenticated — No valid bearer token. Request one from this region’s `/api/auth/token` with your `client_id` and `client_secret`, and send it as `Authorization: Bearer <token>`. A token from another region’s host will also produce this.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"403":{"description":"User does not have admin privileges — Authenticated, but this operation is not available to your account’s role. Some operations require the account administrator role; others are back-office only and are not part of this published surface. Do not retry — it will not start working.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"security":[{"token":[]}],"operationId":"getAccountUsers"}},"/account/users/{userId}":{"get":{"tags":["Account"],"summary":"Get specific user details by user ID.\r\nValidates that the user belongs to the authenticated customer's organization.","parameters":[{"name":"userId","in":"path","description":"User ID to retrieve","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Returns the user details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dto_Api_AccountUserInfo"},"examples":{"default":{"summary":"One user on the account (CustomerAdmin only)","value":{"id":51188,"guid":"3f7c1e28-0000-4a1b-9c44-2b6d5e900001","userName":"spatel","firstName":"Sam","lastName":"Patel","emailAddress":"sam@example.com","active":true,"locationName":null,"usernameLoginOnly":false,"lastLogin":"2026-08-01T09:14:22Z","loginCount":214}}}}}},"401":{"description":"Unauthorized - user not authenticated — No valid bearer token. Request one from this region’s `/api/auth/token` with your `client_id` and `client_secret`, and send it as `Authorization: Bearer <token>`. A token from another region’s host will also produce this.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"403":{"description":"Forbidden - user does not have CustomerAdmin role — Authenticated, but this operation is not available to your account’s role. Some operations require the account administrator role; others are back-office only and are not part of this published surface. Do not retry — it will not start working.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"404":{"description":"Not found - user does not exist or does not belong to the customer — No such record, or it is not visible to your account. Credentials only ever see their own account’s data, so a valid identifier belonging to another customer answers exactly like one that does not exist.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"security":[{"token":[]}],"operationId":"getAccountUsersByUserId","description":"One user on your account. Requires the account administrator role; an ordinary user credential receives a 403."}},"/account/transactions":{"get":{"tags":["Account"],"summary":"Get payment transaction history","description":"Retrieves a paginated list of payment transactions for the authenticated customer.\r\nIncludes card details (masked), amounts, and transaction status.","parameters":[{"name":"page","in":"query","description":"Page number, 1-based (default: 1)","schema":{"type":"integer","format":"int32","default":1}},{"name":"pageSize","in":"query","description":"Number of records per page (default: 20)","schema":{"type":"integer","format":"int32","default":20}},{"name":"sortBy","in":"query","description":"Column to sort by (default: Id). Valid values: Id, CreatedAt, CompletedAt, AmountSettlement","schema":{"type":"string","default":"Id"}},{"name":"sortDirection","in":"query","description":"Sort direction: ASC or DESC (default: DESC)","schema":{"type":"string","default":"DESC"}},{"name":"completedOnly","in":"query","description":"Filter to show only completed transactions (default: false)","schema":{"type":"boolean","default":false}},{"name":"textFilter","in":"query","description":"Optional text filter to search transaction details","schema":{"type":"string"}}],"responses":{"200":{"description":"Transaction list retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedDataOf1Codewolf_Ctrl_Api_Dto_Api_PaymentTransaction"},"examples":{"default":{"summary":"Invoices and payments, most recent first","value":{"pageSize":25,"returnedResults":0,"totalResults":0,"totalPages":1,"currentPage":1,"hasNext":false,"hasPrevious":false,"filter":null,"nextUrl":null,"previousUrl":null,"entities":[]}}}}}},"401":{"description":"User is not authenticated — No valid bearer token. Request one from this region’s `/api/auth/token` with your `client_id` and `client_secret`, and send it as `Authorization: Bearer <token>`. A token from another region’s host will also produce this.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"security":[{"token":[]}],"operationId":"getAccountTransactions"}},"/account/shipment-settings":{"get":{"tags":["Account"],"summary":"Get shipment settings","description":"Retrieves shipment configuration for your organization.","responses":{"200":{"description":"Shipment settings retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dto_Api_ShipmentSettings"},"examples":{"default":{"summary":"Carriers and freight rules configured for the account","value":{"availableCarriers":["NZC01"],"carrierOptions":["NZC01"],"receiverPays":{"billingAccountNumber":"","billingPostalCode":"","billingCountryCode":""},"showCustomerAddressOnLabel":true,"handlingFee":0,"applyHandlingFeeInsteadOfFreight":false,"jobComment":"","availableShipmentTypes":["Ground"],"shipmentTypeOptions":[{"code":"Ground","name":"GND"}],"freightRates":[{"carrier":"NZC01","carrierName":"Courier","service":null,"serviceName":null,"package":null,"packageName":null,"chargeType":"FlatRatePerJob","value":12.5,"minimum":null,"isDefault":true}]}}}}}},"401":{"description":"User is not authenticated — No valid bearer token. Request one from this region’s `/api/auth/token` with your `client_id` and `client_secret`, and send it as `Authorization: Bearer <token>`. A token from another region’s host will also produce this.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"404":{"description":"Customer config not found — No such record, or it is not visible to your account. Credentials only ever see their own account’s data, so a valid identifier belonging to another customer answers exactly like one that does not exist.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"security":[{"token":[]}],"operationId":"getAccountShipmentsettings"}},"/Assets/{assetTag}":{"get":{"tags":["Assets"],"summary":"Gets an individual Assets information","parameters":[{"name":"assetTag","in":"path","description":"A valid AssetTag","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"text/plain":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_AssetDtos_AssetDto"},{"$ref":"#/components/schemas/Codewolf_Api_Support_AssetDtos_AssetExtendedDto"}],"description":"Describes an Asset Dtos"},"examples":{"default":{"summary":"One asset by tag","value":{"assetId":774301,"assetTag":"WE123456","processCode":"WE","description":"Riverside Rugby crest","garment":"Tee","priceTierCode":"B","setup":0,"reset":18.5,"priceCode":"WE_LC:Wearable-4\" x 4\"","assetUrl":"https://example.com/assets/WE123456/preview","createDate":"2026-06-18T22:41:05Z","isGlobal":false,"isArchived":false,"priceBands":[{"from":1,"to":24,"unitPrice":4.95},{"from":25,"to":99,"unitPrice":3.6},{"from":100,"to":null,"unitPrice":2.85}]}}}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_AssetDtos_AssetDto"},{"$ref":"#/components/schemas/Codewolf_Api_Support_AssetDtos_AssetExtendedDto"}],"description":"Describes an Asset Dtos"},"examples":{"default":{"summary":"One asset by tag","value":{"assetId":774301,"assetTag":"WE123456","processCode":"WE","description":"Riverside Rugby crest","garment":"Tee","priceTierCode":"B","setup":0,"reset":18.5,"priceCode":"WE_LC:Wearable-4\" x 4\"","assetUrl":"https://example.com/assets/WE123456/preview","createDate":"2026-06-18T22:41:05Z","isGlobal":false,"isArchived":false,"priceBands":[{"from":1,"to":24,"unitPrice":4.95},{"from":25,"to":99,"unitPrice":3.6},{"from":100,"to":null,"unitPrice":2.85}]}}}},"text/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_AssetDtos_AssetDto"},{"$ref":"#/components/schemas/Codewolf_Api_Support_AssetDtos_AssetExtendedDto"}],"description":"Describes an Asset Dtos"},"examples":{"default":{"summary":"One asset by tag","value":{"assetId":774301,"assetTag":"WE123456","processCode":"WE","description":"Riverside Rugby crest","garment":"Tee","priceTierCode":"B","setup":0,"reset":18.5,"priceCode":"WE_LC:Wearable-4\" x 4\"","assetUrl":"https://example.com/assets/WE123456/preview","createDate":"2026-06-18T22:41:05Z","isGlobal":false,"isArchived":false,"priceBands":[{"from":1,"to":24,"unitPrice":4.95},{"from":25,"to":99,"unitPrice":3.6},{"from":100,"to":null,"unitPrice":2.85}]}}}}}},"403":{"description":"Forbidden — Authenticated, but this operation is not available to your account’s role. Some operations require the account administrator role; others are back-office only and are not part of this published surface. Do not retry — it will not start working.","content":{"text/plain":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"text/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"404":{"description":"No asset with that tag on your account. Asset tags are per-account; list yours with `GET /Assets`."}},"security":[{"token":[]}],"operationId":"getAssetsByAssetTag","description":"One asset by its tag. Use it to confirm an asset is still orderable — check `isArchived` — and to read the reset charge and price bands a reorder will be billed at."}},"/Assets":{"get":{"tags":["Assets"],"summary":"Gets all of the Assets","parameters":[{"name":"page","in":"query","description":"The page number","schema":{"type":"integer","format":"int32","default":1}},{"name":"pageSize","in":"query","description":"The size of the Page in rows","schema":{"type":"integer","format":"int32","default":25}},{"name":"sortColumn","in":"query","description":"Column to sort by","schema":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Enums_AssetSortColumn"}],"default":"AssetTag"}},{"name":"sortDirection","in":"query","description":"Sort direction (ascending or descending)","schema":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Enums_SortDirection"}],"default":"Ascending"}},{"name":"includeProcesses","in":"query","description":"(optional)If passed, can contain a list of Process codes to include (comma separated)","schema":{"type":"string"}},{"name":"excludeProcesses","in":"query","description":"(optional)If passed, can contain a list of Process codes to exclude (comma separated)","schema":{"type":"string"}},{"name":"filter","in":"query","description":"(optional)If passed will filter the search using the filter text","schema":{"type":"string"}},{"name":"isArchived","in":"query","description":"(optional)If true, returns only archived assets. If false, only non-archived. If omitted, returns both.","schema":{"type":"boolean"}},{"name":"priceCodeContains","in":"query","description":"(optional)Comma-separated case-insensitive substrings. Asset is included if its PriceCode contains ANY of them. NULL PriceCodes are excluded.","schema":{"type":"string"}},{"name":"priceCodeNotContains","in":"query","description":"(optional)Comma-separated case-insensitive substrings. Asset is included if its PriceCode contains NONE of them, including assets with NULL PriceCode.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PagedDataOf1Codewolf_Ctrl_Api_Dtos_Api_AssetListDto"},"examples":{"default":{"summary":"Prints already made for this account — reorder any of them by asset tag","value":{"pageSize":25,"returnedResults":1,"totalResults":42,"totalPages":1,"currentPage":1,"hasNext":false,"hasPrevious":false,"filter":null,"nextUrl":null,"previousUrl":null,"entities":[{"assetId":774301,"assetTag":"WE123456","processCode":"WE","description":"Riverside Rugby crest","garment":"Tee","priceTierCode":"B","setup":0,"reset":18.5,"priceCode":"WE_LC:Wearable-4\" x 4\"","assetUrl":"https://example.com/assets/WE123456/preview","createDate":"2026-06-18T22:41:05Z","isGlobal":false,"isArchived":false,"priceBands":[{"from":1,"to":24,"unitPrice":4.95},{"from":25,"to":99,"unitPrice":3.6},{"from":100,"to":null,"unitPrice":2.85}]}]}}}},"application/json":{"schema":{"$ref":"#/components/schemas/PagedDataOf1Codewolf_Ctrl_Api_Dtos_Api_AssetListDto"},"examples":{"default":{"summary":"Prints already made for this account — reorder any of them by asset tag","value":{"pageSize":25,"returnedResults":1,"totalResults":42,"totalPages":1,"currentPage":1,"hasNext":false,"hasPrevious":false,"filter":null,"nextUrl":null,"previousUrl":null,"entities":[{"assetId":774301,"assetTag":"WE123456","processCode":"WE","description":"Riverside Rugby crest","garment":"Tee","priceTierCode":"B","setup":0,"reset":18.5,"priceCode":"WE_LC:Wearable-4\" x 4\"","assetUrl":"https://example.com/assets/WE123456/preview","createDate":"2026-06-18T22:41:05Z","isGlobal":false,"isArchived":false,"priceBands":[{"from":1,"to":24,"unitPrice":4.95},{"from":25,"to":99,"unitPrice":3.6},{"from":100,"to":null,"unitPrice":2.85}]}]}}}},"text/json":{"schema":{"$ref":"#/components/schemas/PagedDataOf1Codewolf_Ctrl_Api_Dtos_Api_AssetListDto"},"examples":{"default":{"summary":"Prints already made for this account — reorder any of them by asset tag","value":{"pageSize":25,"returnedResults":1,"totalResults":42,"totalPages":1,"currentPage":1,"hasNext":false,"hasPrevious":false,"filter":null,"nextUrl":null,"previousUrl":null,"entities":[{"assetId":774301,"assetTag":"WE123456","processCode":"WE","description":"Riverside Rugby crest","garment":"Tee","priceTierCode":"B","setup":0,"reset":18.5,"priceCode":"WE_LC:Wearable-4\" x 4\"","assetUrl":"https://example.com/assets/WE123456/preview","createDate":"2026-06-18T22:41:05Z","isGlobal":false,"isArchived":false,"priceBands":[{"from":1,"to":24,"unitPrice":4.95},{"from":25,"to":99,"unitPrice":3.6},{"from":100,"to":null,"unitPrice":2.85}]}]}}}}}},"403":{"description":"Forbidden — Authenticated, but this operation is not available to your account’s role. Some operations require the account administrator role; others are back-office only and are not part of this published surface. Do not retry — it will not start working.","content":{"text/plain":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"text/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"security":[{"token":[]}],"operationId":"getAssets","description":"Prints already made for your account. Each carries an asset tag; ordering that tag again reproduces the previous run exactly, with no artwork upload and no colour re-approval."}},"/Assets/global":{"get":{"tags":["Assets"],"summary":"Gets all of the Global Assets","parameters":[{"name":"page","in":"query","description":"The page number","schema":{"type":"integer","format":"int32","default":1}},{"name":"pageSize","in":"query","description":"The size of the Page in rows","schema":{"type":"integer","format":"int32","default":25}},{"name":"sortColumn","in":"query","description":"Column to sort by","schema":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Enums_AssetSortColumn"}],"default":"AssetTag"}},{"name":"sortDirection","in":"query","description":"Sort direction (ascending or descending)","schema":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Enums_SortDirection"}],"default":"Ascending"}},{"name":"includeProcesses","in":"query","description":"(optional)If passed, can contain a list of Process codes to include (comma separated)","schema":{"type":"string"}},{"name":"excludeProcesses","in":"query","description":"(optional)If passed, can contain a list of Process codes to exclude (comma separated)","schema":{"type":"string"}},{"name":"filter","in":"query","description":"(optional)If passed will filter the search using the filter text","schema":{"type":"string"}},{"name":"isArchived","in":"query","description":"(optional)If true, returns only archived assets. If false, only non-archived. If omitted, returns both.","schema":{"type":"boolean"}},{"name":"priceCodeContains","in":"query","description":"(optional)Comma-separated case-insensitive substrings. Asset is included if its PriceCode contains ANY of them. NULL PriceCodes are excluded.","schema":{"type":"string"}},{"name":"priceCodeNotContains","in":"query","description":"(optional)Comma-separated case-insensitive substrings. Asset is included if its PriceCode contains NONE of them, including assets with NULL PriceCode.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PagedDataOf1Codewolf_Ctrl_Api_Dtos_Api_AssetListDto"},"examples":{"default":{"summary":"Catalogue assets available to every account","value":{"pageSize":25,"returnedResults":1,"totalResults":1,"totalPages":1,"currentPage":1,"hasNext":false,"hasPrevious":false,"filter":null,"nextUrl":null,"previousUrl":null,"entities":[{"assetId":5012,"assetTag":"GL00042","processCode":"STOCK","description":"Care label","garment":null,"priceTierCode":"","setup":0,"reset":0,"priceCode":null,"assetUrl":null,"createDate":"2025-11-02T03:15:00Z","isGlobal":true,"isArchived":false,"priceBands":[{"from":1,"to":null,"unitPrice":0.35}]}]}}}},"application/json":{"schema":{"$ref":"#/components/schemas/PagedDataOf1Codewolf_Ctrl_Api_Dtos_Api_AssetListDto"},"examples":{"default":{"summary":"Catalogue assets available to every account","value":{"pageSize":25,"returnedResults":1,"totalResults":1,"totalPages":1,"currentPage":1,"hasNext":false,"hasPrevious":false,"filter":null,"nextUrl":null,"previousUrl":null,"entities":[{"assetId":5012,"assetTag":"GL00042","processCode":"STOCK","description":"Care label","garment":null,"priceTierCode":"","setup":0,"reset":0,"priceCode":null,"assetUrl":null,"createDate":"2025-11-02T03:15:00Z","isGlobal":true,"isArchived":false,"priceBands":[{"from":1,"to":null,"unitPrice":0.35}]}]}}}},"text/json":{"schema":{"$ref":"#/components/schemas/PagedDataOf1Codewolf_Ctrl_Api_Dtos_Api_AssetListDto"},"examples":{"default":{"summary":"Catalogue assets available to every account","value":{"pageSize":25,"returnedResults":1,"totalResults":1,"totalPages":1,"currentPage":1,"hasNext":false,"hasPrevious":false,"filter":null,"nextUrl":null,"previousUrl":null,"entities":[{"assetId":5012,"assetTag":"GL00042","processCode":"STOCK","description":"Care label","garment":null,"priceTierCode":"","setup":0,"reset":0,"priceCode":null,"assetUrl":null,"createDate":"2025-11-02T03:15:00Z","isGlobal":true,"isArchived":false,"priceBands":[{"from":1,"to":null,"unitPrice":0.35}]}]}}}}}},"403":{"description":"Forbidden — Authenticated, but this operation is not available to your account’s role. Some operations require the account administrator role; others are back-office only and are not part of this published surface. Do not retry — it will not start working.","content":{"text/plain":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"text/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"security":[{"token":[]}],"operationId":"getAssetsGlobal","description":"Catalogue assets available to every account, rather than ones your account created. Order them exactly like your own: `itemType: \"Asset\"` with the tag as `code`."}},"/Assets/types":{"get":{"tags":["Assets"],"summary":"Gets all of the Asset Types","responses":{"200":{"description":"Success","content":{"text/plain":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_AssetDtos_AssetTypeDto"}},"examples":{"default":{"summary":"Asset type per process code","value":[{"process":"WE","assetType":"Wearable"},{"process":"BL","assetType":"Blocker"}]}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_AssetDtos_AssetTypeDto"}},"examples":{"default":{"summary":"Asset type per process code","value":[{"process":"WE","assetType":"Wearable"},{"process":"BL","assetType":"Blocker"}]}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_AssetDtos_AssetTypeDto"}},"examples":{"default":{"summary":"Asset type per process code","value":[{"process":"WE","assetType":"Wearable"},{"process":"BL","assetType":"Blocker"}]}}}}},"403":{"description":"Forbidden — Authenticated, but this operation is not available to your account’s role. Some operations require the account administrator role; others are back-office only and are not part of this published surface. Do not retry — it will not start working.","content":{"text/plain":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"text/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"security":[{"token":[]}],"operationId":"getAssetsTypes","description":"Which asset type each process produces. Useful for labelling assets in your own UI without hardcoding a mapping that changes."}},"/Assets/{assetTag}/files":{"get":{"tags":["Assets"],"summary":"Get all files associated with an asset","parameters":[{"name":"assetTag","in":"path","description":"The asset tag also known as asset code (e.g., WE12345)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_AssetFilesResponseDto"},"examples":{"default":{"summary":"Files attached to an asset, current and superseded","value":{"assetTag":"WE123456","currentFiles":[],"historicFiles":[]}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_AssetFilesResponseDto"},"examples":{"default":{"summary":"Files attached to an asset, current and superseded","value":{"assetTag":"WE123456","currentFiles":[],"historicFiles":[]}}}},"text/json":{"schema":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_AssetFilesResponseDto"},"examples":{"default":{"summary":"Files attached to an asset, current and superseded","value":{"assetTag":"WE123456","currentFiles":[],"historicFiles":[]}}}}}},"403":{"description":"Forbidden — Authenticated, but this operation is not available to your account’s role. Some operations require the account administrator role; others are back-office only and are not part of this published surface. Do not retry — it will not start working.","content":{"text/plain":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"text/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"404":{"description":"Not Found — No such record, or it is not visible to your account. Credentials only ever see their own account’s data, so a valid identifier belonging to another customer answers exactly like one that does not exist.","content":{"text/plain":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"text/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"security":[{"token":[]}],"operationId":"getAssetsByAssetTagFiles","description":"The artwork files held against an asset, current and superseded. `historicFiles` records what was replaced and when."}},"/Assets/{assetCode}/jobs":{"get":{"tags":["Assets"],"summary":"Get all jobs associated with a specific asset code for the authenticated customer","description":"Returns both active and closed jobs for the authenticated customer only.\r\nCustomer ID is extracted from the authentication context.\r\nFilters by Job's customer (CustID), not Asset's ClientID.\r\n            \r\nSorting: Active jobs (dateOut=null) appear FIRST at the top,\r\nfollowed by completed/shipped jobs sorted by dateOut descending (most recent first).\r\n            \r\nUsed by SC Integrate to display Order History on asset detail pages.","parameters":[{"name":"assetCode","in":"path","description":"The asset code to search for","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successfully retrieved job list","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_AssetJobsResponseDto"},"examples":{"default":{"summary":"Every job this asset has been run on","value":{"assetCode":"WE123456","jobs":[],"totalCount":0}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_AssetJobsResponseDto"},"examples":{"default":{"summary":"Every job this asset has been run on","value":{"assetCode":"WE123456","jobs":[],"totalCount":0}}}},"text/json":{"schema":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_AssetJobsResponseDto"},"examples":{"default":{"summary":"Every job this asset has been run on","value":{"assetCode":"WE123456","jobs":[],"totalCount":0}}}}}},"400":{"description":"Invalid asset code provided — The request was rejected before anything happened. Read the response body — validation failures come back as `{ \"isValid\": false, \"validationMessages\": [{ \"errorCode\", \"message\" }] }`. Retrying an unchanged request will fail identically.","content":{"text/plain":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"text/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"401":{"description":"Unauthorized - customer ID not found in authentication context — No valid bearer token. Request one from this region’s `/api/auth/token` with your `client_id` and `client_secret`, and send it as `Authorization: Bearer <token>`. A token from another region’s host will also produce this.","content":{"text/plain":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"text/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"500":{"description":"Internal server error — An unexpected server error. Retry once with backoff; if it persists, contact your account manager with the time of the request and the endpoint."}},"security":[{"token":[]}],"operationId":"getAssetsByAssetCodeJobs"}},"/Jobs/{jobNumber}":{"get":{"tags":["Jobs"],"summary":"Get the full Job information","parameters":[{"name":"jobNumber","in":"path","description":"A Job Number","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_JobDto"},"examples":{"default":{"summary":"Full job detail — status, money, lines and tracking","value":{"customerId":4820,"dateIn":"2026-08-01T02:10:00Z","dateOut":null,"shippedDateStatus":null,"shippedDaysToProcess":null,"processingDays":3,"taxTotal":24.53,"isCancelable":false,"location":null,"permissions":{"canEdit":true,"lockedReason":null},"invoiceFile":null,"lines":[{"jobLineId":990412,"assetSku":"WE123456","processCode":"WE","garment":"Tee","description":"Riverside Rugby crest","comments":null,"quantity":120,"unitPrice":2.85,"customerReference":"PO-10482-1","imageUrl":"https://example.com/assets/WE123456/preview","gang":null,"jobLineStatus":"In production"}],"shippingAddresses":[{"trackingNumber":null,"trackingLink":null}]}}}}}},"403":{"description":"Forbidden — Authenticated, but this operation is not available to your account’s role. Some operations require the account administrator role; others are back-office only and are not part of this published surface. Do not retry — it will not start working.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"404":{"description":"Not Found — No job with that number on your account. `GET /Jobs/active` lists everything currently open.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"security":[{"token":[]}],"operationId":"getJobsByJobNumber","description":"Full job detail: status, money, artwork state and tracking once despatched. Status values come from `GET /Lookups/job-statuses` — read that list rather than matching strings you have seen before."},"patch":{"tags":["Jobs"],"summary":"Patch job details","parameters":[{"name":"jobNumber","in":"path","description":"The job number to update","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"description":"The patch data containing fields to update. Only non-null fields are updated. The locationCode field is SuperUser-only.","content":{"application/json-patch+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dto_PatchJobDto"}],"description":"DTO for patching job details"},"examples":{"default":{"summary":"Amend the PO number and push the ship date out — omitted fields are left alone","value":{"orderNumber":"PO-10482-REV2","dateDue":"2026-08-21","comments":"Customer asked to hold for the revised crest."}}}},"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dto_PatchJobDto"}],"description":"DTO for patching job details"},"examples":{"default":{"summary":"Amend the PO number and push the ship date out — omitted fields are left alone","value":{"orderNumber":"PO-10482-REV2","dateDue":"2026-08-21","comments":"Customer asked to hold for the revised crest."}}}},"text/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dto_PatchJobDto"}],"description":"DTO for patching job details"},"examples":{"default":{"summary":"Amend the PO number and push the ship date out — omitted fields are left alone","value":{"orderNumber":"PO-10482-REV2","dateDue":"2026-08-21","comments":"Customer asked to hold for the revised crest."}}}},"application/*+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dto_PatchJobDto"}],"description":"DTO for patching job details"},"examples":{"default":{"summary":"Amend the PO number and push the ship date out — omitted fields are left alone","value":{"orderNumber":"PO-10482-REV2","dateDue":"2026-08-21","comments":"Customer asked to hold for the revised crest."}}}}}},"responses":{"200":{"description":"Job details updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_JobDto"},"examples":{"default":{"summary":"The updated job — the same shape GET /Jobs/{jobNumber} returns","value":{"customerId":4820,"dateIn":"2026-08-01T02:10:00Z","dateOut":null,"shippedDateStatus":null,"shippedDaysToProcess":null,"processingDays":3,"taxTotal":24.53,"isCancelable":true,"location":null,"permissions":{"canEdit":true,"lockedReason":null},"invoiceFile":null,"lines":[{"jobLineId":990412,"assetSku":"WE123456","processCode":"WE","garment":"Tee","description":"Riverside Rugby crest","comments":null,"quantity":120,"unitPrice":2.85,"customerReference":"PO-10482-1","imageUrl":"https://example.com/assets/WE123456/preview","gang":null,"jobLineStatus":"In production"}],"shippingAddresses":[{"trackingNumber":null,"trackingLink":null}]}}}}}},"400":{"description":"Invalid location code (does not exist, inactive, or virtual) — The request was rejected before anything happened. Read the response body — validation failures come back as `{ \"isValid\": false, \"validationMessages\": [{ \"errorCode\", \"message\" }] }`. Retrying an unchanged request will fail identically.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"401":{"description":"Unauthorized — No valid bearer token. Request one from this region’s `/api/auth/token` with your `client_id` and `client_secret`, and send it as `Authorization: Bearer <token>`. A token from another region’s host will also produce this.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"403":{"description":"Job is locked for editing, or a non-SuperUser supplied locationCode (see response body for reason) — Authenticated, but this operation is not available to your account’s role. Some operations require the account administrator role; others are back-office only and are not part of this published surface. Do not retry — it will not start working.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"404":{"description":"Job not found — No such record, or it is not visible to your account. Credentials only ever see their own account’s data, so a valid identifier belonging to another customer answers exactly like one that does not exist.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"security":[{"token":[]}],"operationId":"updateJobsByJobNumber","description":"Amend a job after submitting it — the description, your PO number, the comments, the requested ship date and the must-ship flag. ⚠️ Check `permissions.canEdit` on `GET /Jobs/{jobNumber}` first: a job locks once it is dispatched, closed, returned or cancelled, and `permissions.lockedReason` says which. Send only the fields you are changing; anything you omit is left alone. Returns the updated job."}},"/Jobs/delivery-options":{"get":{"tags":["Jobs"],"summary":"Get delivery options available to customer","responses":{"200":{"description":"Delivery methods available to this account","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Interfaces_IDeliveryOption"}},"examples":{"default":{"summary":"Delivery methods available to this account","value":[{"code":"Ground","label":"GND","isCollection":false,"rank":10,"gangRank":0,"value":"Ground","deliveryLabelEnabled":false},{"code":"Will Collect","label":"COL","isCollection":true,"rank":90,"gangRank":0,"value":"Will Collect","deliveryLabelEnabled":false}]}}}}},"403":{"description":"Forbidden — Authenticated, but this operation is not available to your account’s role. Some operations require the account administrator role; others are back-office only and are not part of this published surface. Do not retry — it will not start working.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"security":[{"token":[]}],"operationId":"getJobsDeliveryoptions","description":"Delivery methods your account can use. The returned method code goes in `deliveryAddress.deliveryMethod` on `POST /Jobs`. Availability varies by region and account, so read it rather than assuming a carrier."}},"/Jobs/earliest-ship-date":{"get":{"tags":["Jobs"],"summary":"Get calculated shipping date based on process codes","description":"The soonest despatch date for the processes you intend to order. Pass the process codes you are quoting; the answer accounts for factory workload and cut-off times, so it is not a fixed lead time.","parameters":[{"name":"processCodes","in":"query","description":"Optional comma-separated process codes (e.g., \"PR,WE\")","schema":{"type":"string"}}],"responses":{"200":{"description":"Shipping date calculated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dto_ShippingDateResponseDto"},"examples":{"default":{"summary":"Soonest despatch for the processes being quoted","value":{"shippingDateUtc":"2026-08-05T18:00:00+00:00","shippingDateLocal":"2026-08-06T06:00:00+12:00","timezone":"Pacific/Auckland","dateExclusions":[]}}}}}},"401":{"description":"User is not authenticated — No valid bearer token. Request one from this region’s `/api/auth/token` with your `client_id` and `client_secret`, and send it as `Authorization: Bearer <token>`. A token from another region’s host will also produce this.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"404":{"description":"User not found or no shipping date available — No such record, or it is not visible to your account. Credentials only ever see their own account’s data, so a valid identifier belonging to another customer answers exactly like one that does not exist.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"security":[{"token":[]}],"operationId":"getJobsEarliestshipdate"}},"/Jobs":{"post":{"tags":["Jobs"],"summary":"Create a job","parameters":[{"name":"X-Application-Name","in":"header","description":"An Valid OriginCode value (this will be validated)","schema":{"type":"string","default":"API"}}],"requestBody":{"description":"The job candidate","content":{"application/json-patch+json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_JobCandidate"},{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_ShopJobs_ShopJobCandidate"},{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_ShopifyJobs_CustomerShopJobCandidate"}],"description":"Job class to enable the creation of jobs from the web API"},"examples":{"default":{"summary":"Dry run — a new print and a reorder, validated without creating anything","value":{"validateOnly":true,"orderNumber":"PO-10482","description":"Riverside Rugby — club tees","dateDue":"2026-08-14","mustDate":false,"items":[{"itemType":"PriceCode","code":"WE_LC:Wearable-4\" x 4\"","quantity":120,"customerReference":"PO-10482-1","attributes":{"description":"Left chest crest","Size":"4\" x 4\"","position":"Left chest","Colors":"3"}},{"itemType":"Asset","code":"WE123456","quantity":60,"customerReference":"PO-10482-2"}],"deliveryAddress":{"contactName":"Sam Patel","organisation":"Riverside Print Co","streetAddress":"12 Tannery Road","city":"Auckland","postalCode":"1010","country":"New Zealand","countryCodeISO2":"NZ","deliveryMethod":"Ground","phone":"+64 9 555 0100","emailAddress":"sam@example.com"}}}}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_JobCandidate"},{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_ShopJobs_ShopJobCandidate"},{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_ShopifyJobs_CustomerShopJobCandidate"}],"description":"Job class to enable the creation of jobs from the web API"},"examples":{"default":{"summary":"Dry run — a new print and a reorder, validated without creating anything","value":{"validateOnly":true,"orderNumber":"PO-10482","description":"Riverside Rugby — club tees","dateDue":"2026-08-14","mustDate":false,"items":[{"itemType":"PriceCode","code":"WE_LC:Wearable-4\" x 4\"","quantity":120,"customerReference":"PO-10482-1","attributes":{"description":"Left chest crest","Size":"4\" x 4\"","position":"Left chest","Colors":"3"}},{"itemType":"Asset","code":"WE123456","quantity":60,"customerReference":"PO-10482-2"}],"deliveryAddress":{"contactName":"Sam Patel","organisation":"Riverside Print Co","streetAddress":"12 Tannery Road","city":"Auckland","postalCode":"1010","country":"New Zealand","countryCodeISO2":"NZ","deliveryMethod":"Ground","phone":"+64 9 555 0100","emailAddress":"sam@example.com"}}}}},"text/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_JobCandidate"},{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_ShopJobs_ShopJobCandidate"},{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_ShopifyJobs_CustomerShopJobCandidate"}],"description":"Job class to enable the creation of jobs from the web API"},"examples":{"default":{"summary":"Dry run — a new print and a reorder, validated without creating anything","value":{"validateOnly":true,"orderNumber":"PO-10482","description":"Riverside Rugby — club tees","dateDue":"2026-08-14","mustDate":false,"items":[{"itemType":"PriceCode","code":"WE_LC:Wearable-4\" x 4\"","quantity":120,"customerReference":"PO-10482-1","attributes":{"description":"Left chest crest","Size":"4\" x 4\"","position":"Left chest","Colors":"3"}},{"itemType":"Asset","code":"WE123456","quantity":60,"customerReference":"PO-10482-2"}],"deliveryAddress":{"contactName":"Sam Patel","organisation":"Riverside Print Co","streetAddress":"12 Tannery Road","city":"Auckland","postalCode":"1010","country":"New Zealand","countryCodeISO2":"NZ","deliveryMethod":"Ground","phone":"+64 9 555 0100","emailAddress":"sam@example.com"}}}}},"application/*+json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_JobCandidate"},{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_ShopJobs_ShopJobCandidate"},{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_ShopifyJobs_CustomerShopJobCandidate"}],"description":"Job class to enable the creation of jobs from the web API"},"examples":{"default":{"summary":"Dry run — a new print and a reorder, validated without creating anything","value":{"validateOnly":true,"orderNumber":"PO-10482","description":"Riverside Rugby — club tees","dateDue":"2026-08-14","mustDate":false,"items":[{"itemType":"PriceCode","code":"WE_LC:Wearable-4\" x 4\"","quantity":120,"customerReference":"PO-10482-1","attributes":{"description":"Left chest crest","Size":"4\" x 4\"","position":"Left chest","Colors":"3"}},{"itemType":"Asset","code":"WE123456","quantity":60,"customerReference":"PO-10482-2"}],"deliveryAddress":{"contactName":"Sam Patel","organisation":"Riverside Print Co","streetAddress":"12 Tannery Road","city":"Auckland","postalCode":"1010","country":"New Zealand","countryCodeISO2":"NZ","deliveryMethod":"Ground","phone":"+64 9 555 0100","emailAddress":"sam@example.com"}}}}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_ReturnDtos_CreateJobReturnDto"},{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_ReturnDtos_CreateShopJobReturnDto"}],"description":"Returns the information from a successful Job Creation to the caller"},"examples":{"default":{"summary":"Job created — one line needs artwork before it enters production","value":{"jobNumber":30291,"location":"AKL","dateDue":"2026-08-14T00:00:00Z","totalJobCost":513,"expectingArtworkToBeUploaded":true,"jobLineDetails":[{"needsArtworkToBeUploaded":true,"customerReference":"PO-10482-1","quantity":120,"newAssetSku":"WE123999","jobLineLabelUrl":null},{"needsArtworkToBeUploaded":false,"customerReference":"PO-10482-2","quantity":60,"newAssetSku":null,"jobLineLabelUrl":null}]}}}}}},"400":{"description":"Bad Request — Validation rejected the job and nothing was created. The body carries `validationMessages` with an `errorCode` and a human-readable `message` per problem — for example an asset that is not in an orderable state.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"403":{"description":"Forbidden — Authenticated, but this operation is not available to your account’s role. Some operations require the account administrator role; others are back-office only and are not part of this published surface. Do not retry — it will not start working.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"500":{"description":"⚠️ On this endpoint a 500 usually means an INVALID PAYLOAD, not an outage. Known triggers: an empty `items` array; a delivery address that cannot be routed; an asset `code` that does not exist; a missing `dateDue`; a `sizeQuantities` key that is not one of the variant’s sizes. Send the same payload with `\"validateOnly\": true` and fix what it reports before retrying."}},"security":[{"token":[]}],"operationId":"createJobs","description":"Create a job. ⚠️ Send `\"validateOnly\": true` while building: the payload runs the entire validation path and returns errors without creating anything (\"Validated with NO Errors. Job NOT created.\"). Set `items[].itemType` — `\"PriceCode\"` (new print), `\"Asset\"` (reorder) or `\"Stock\"` — it selects the line type AND what `code` means. A 500 from this endpoint usually means an invalid payload (empty `items`, unroutable address, unknown asset code, bad `sizeQuantities` key), not an outage. Put the artwork on each `PriceCode` line as `externalArtworkUrl` — one request places the order and delivers the art. The URL must stay reachable until the job reaches production. The response returns a `jobNumber` and, per line, the new asset tag your print was filed under."}},"/Jobs/active":{"get":{"tags":["Jobs"],"summary":"Get active jobs for the current customer (by default excludes Closed and Cancelled jobs)","parameters":[{"name":"excludeJobNumber","in":"query","description":"Optional job number to exclude from results","schema":{"type":"integer","format":"int32"}},{"name":"page","in":"query","description":"Page number (1-based)","schema":{"type":"integer","format":"int32","default":1}},{"name":"pageSize","in":"query","description":"Page size (default 20, max 100)","schema":{"type":"integer","format":"int32","default":20}},{"name":"searchText","in":"query","description":"Search by job number, order number, or description","schema":{"type":"string"}},{"name":"includeClosedJobs","in":"query","description":"Include closed jobs in results. Cancelled jobs are never included","schema":{"type":"boolean","default":false}},{"name":"sortColumn","in":"query","description":"","schema":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Enums_ActiveJobSortColumn"}]}},{"name":"sortDirection","in":"query","description":"","schema":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Enums_SortDirection"}],"default":"Ascending"}},{"name":"orderGroup","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_PagedActiveJobsDto"},"examples":{"default":{"summary":"Every open job for the account in one call","value":{"items":[{"permissions":{"canEdit":true,"lockedReason":null},"jobNumber":30291,"masterJobStatus":"In production","originCode":"WEB","description":"Riverside Rugby — club tees","mustDate":false,"dateDue":"2026-08-14T00:00:00Z","dateOut":null,"shippedDaysToProcess":null,"orderNumber":"PO-10482","orderGroup":null,"orderGroupSequence":null,"tracking":[]}],"totalCount":1,"pageNumber":1,"pageSize":25,"totalPages":1,"hasPreviousPage":false,"hasNextPage":false}}}}}},"403":{"description":"Forbidden — Authenticated, but this operation is not available to your account’s role. Some operations require the account administrator role; others are back-office only and are not part of this published surface. Do not retry — it will not start working.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"security":[{"token":[]}],"operationId":"getJobsActive","description":"Every open job for the account in one call. Prefer this over looping `GET /Jobs/{jobNumber}`: it is one request regardless of how many jobs are open, and it is what our own dashboard polls."}},"/Jobs/{jobNumber}/cancel":{"post":{"tags":["Jobs"],"summary":"Cancel a job. Cancelling an already-cancelled job returns success.","parameters":[{"name":"jobNumber","in":"path","description":"The job number to cancel","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"204":{"description":"Job cancelled successfully (or was already cancelled)"},"404":{"description":"Job not found or user not authorized to view this job — No such record, or it is not visible to your account. Credentials only ever see their own account’s data, so a valid identifier belonging to another customer answers exactly like one that does not exist.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"409":{"description":"Job cannot be cancelled in its current status","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"security":[{"token":[]}],"operationId":"createJobsByJobNumberCancel","description":"⚠️ Check first, do not guess. `GET /Jobs/{jobNumber}` returns `isCancelable`; only call this when it is `true`. Once the job has entered production the answer is **409** and it cannot be undone from the API — talk to your account manager instead. Success is **204 with no body**. Cancelling an already-cancelled job succeeds rather than erroring, so a retry after a dropped connection is safe."}},"/Lookups/process-codes":{"get":{"tags":["Lookups"],"summary":"Get list of available process codes","description":"Returns a list of manufacturing process codes available to you, ordered by rank (ascending).","responses":{"200":{"description":"Successfully retrieved process codes","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_ProcessCodeDto"}},"examples":{"default":{"summary":"Process codes with their production characteristics","value":[{"processCode":"WE","description":"Wearable","rank":10,"metadata":{"setupApplies":false,"resetApplies":true,"scheduleable":true,"physicalStockRequired":false,"printable":true}}]}}}}},"401":{"description":"Authentication required — No valid bearer token. Request one from this region’s `/api/auth/token` with your `client_id` and `client_secret`, and send it as `Authorization: Bearer <token>`. A token from another region’s host will also produce this.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"403":{"description":"Access denied - user lacks required role — Authenticated, but this operation is not available to your account’s role. Some operations require the account administrator role; others are back-office only and are not part of this published surface. Do not retry — it will not start working.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"500":{"description":"An error occurred — An unexpected server error. Retry once with backoff; if it persists, contact your account manager with the time of the request and the endpoint.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"security":[{"token":[]}],"operationId":"getLookupsProcesscodes"}},"/Lookups/job-statuses":{"get":{"tags":["Lookups"],"summary":"Get list of available process codes","description":"The full set of job statuses. Read this rather than hardcoding: statuses are added over time, and an unrecognised status should never break your integration.","responses":{"200":{"description":"Successfully retrieved process codes","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_JobStatusDto"}},"examples":{"default":{"summary":"Every job status — read this rather than matching strings","value":[{"id":1,"name":"Awaiting artwork"},{"id":2,"name":"In production"},{"id":3,"name":"Shipped"}]}}}}},"401":{"description":"Authentication required — No valid bearer token. Request one from this region’s `/api/auth/token` with your `client_id` and `client_secret`, and send it as `Authorization: Bearer <token>`. A token from another region’s host will also produce this.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"500":{"description":"An error occurred — An unexpected server error. Retry once with backoff; if it persists, contact your account manager with the time of the request and the endpoint.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"operationId":"getLookupsJobstatuses"}},"/Lookups/countries":{"get":{"tags":["Lookups"],"summary":"Get list of available countries","description":"Returns a list of countries available for address selection, along with the tenant's default country.","responses":{"200":{"description":"Successfully retrieved countries","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_CountryListResponse"},"examples":{"default":{"summary":"Countries, with which address parts each one needs","value":{"countries":[{"name":"New Zealand","iso2":"NZ","iso3":"NZL","hasSuburb":true,"hasState":false,"hasPostalCode":true},{"name":"United States","iso2":"US","iso3":"USA","hasSuburb":false,"hasState":true,"hasPostalCode":true}],"defaultCountry":"NZ"}}}}}},"401":{"description":"Authentication required — No valid bearer token. Request one from this region’s `/api/auth/token` with your `client_id` and `client_secret`, and send it as `Authorization: Bearer <token>`. A token from another region’s host will also produce this.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"500":{"description":"An error occurred — An unexpected server error. Retry once with backoff; if it persists, contact your account manager with the time of the request and the endpoint.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"security":[{"token":[]}],"operationId":"getLookupsCountries"}},"/Lookups/countries/{countryCode}/states":{"get":{"tags":["Lookups"],"summary":"Get list of states/provinces for a country","description":"Returns a list of states/provinces/regions for the specified country code.\r\nSome countries may return an empty list if they don't have administrative divisions.","parameters":[{"name":"countryCode","in":"path","description":"ISO 3166-1 alpha-2 country code (e.g., US, NZ, GB)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successfully retrieved states","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_StateListResponse"},"examples":{"default":{"summary":"States for a country — empty where the country has none","value":{"countryCode":"US","states":[]}}}}}},"401":{"description":"Authentication required — No valid bearer token. Request one from this region’s `/api/auth/token` with your `client_id` and `client_secret`, and send it as `Authorization: Bearer <token>`. A token from another region’s host will also produce this.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"500":{"description":"An error occurred — An unexpected server error. Retry once with backoff; if it persists, contact your account manager with the time of the request and the endpoint.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"security":[{"token":[]}],"operationId":"getLookupsCountriesByCountryCodeStates"}},"/Lookups/size-sets":{"get":{"tags":["Lookups"],"summary":"Get list of available size templates for inwards/sizing operations.","responses":{"200":{"description":"Successfully retrieved size sets","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_InwardsSizeSetDto"}},"examples":{"default":{"summary":"Named size runs used by stock and garment lines","value":[{"id":3,"name":"Adult","sizes":["S","M","L","XL","2XL"]}]}}}}},"401":{"description":"Authentication required — No valid bearer token. Request one from this region’s `/api/auth/token` with your `client_id` and `client_secret`, and send it as `Authorization: Bearer <token>`. A token from another region’s host will also produce this.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"500":{"description":"An error occurred — An unexpected server error. Retry once with backoff; if it persists, contact your account manager with the time of the request and the endpoint.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"operationId":"getLookupsSizesets","description":"The named size runs (e.g. Adult, Youth) used by stock lines and inwards records. Read the sizes from here rather than assuming a set."}},"/PriceCodes/{priceCode}":{"get":{"tags":["PriceCodes"],"summary":"Gets the priceCodes for the current Customer","parameters":[{"name":"priceCode","in":"path","description":"The Price Code to find","required":true,"schema":{"type":"string"}},{"name":"dgX","in":"query","description":"(optional)Needed if the PriceCode has additional MetaData requirements","schema":{"type":"number","format":"double","default":0}},{"name":"dgY","in":"query","description":"(optional)Needed if the PriceCode has additional MetaData requirements","schema":{"type":"number","format":"double","default":0}},{"name":"stitches","in":"query","description":"(optional)Needed if the PriceCode has additional MetaData requirements","schema":{"type":"integer","format":"int32","default":0}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Pricing_PriceCodeDto"},"examples":{"default":{"summary":"One price code, with its attributes and quantity breaks","value":{"priceCode":"WE_LC:Wearable-4\" x 4\"","description":"Wearable 4\" x 4\"","categoryCode":"WEAR","categoryName":"Wearables","name":"Wearable — Left chest 4\" x 4\"","processCode":"WE","masterProcessCode":"WE","minimumQuantity":10,"externalSupplier":null,"externalPriceCode":null,"hasMetaDataAttributes":true,"standardSetup":null,"standardReset":18.5,"sampleAvailable":true,"samplePrice":9.5,"sampleLabel":"Sample","sizeUnit":"in","sizeWidth":4,"sizeHeight":4,"attributes":[],"priceBands":[{"from":1,"to":24,"unitPrice":4.95},{"from":25,"to":99,"unitPrice":3.6},{"from":100,"to":null,"unitPrice":2.85}]}}}}}},"400":{"description":"Bad Request — The request was rejected before anything happened. Read the response body — validation failures come back as `{ \"isValid\": false, \"validationMessages\": [{ \"errorCode\", \"message\" }] }`. Retrying an unchanged request will fail identically.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"403":{"description":"Forbidden — Authenticated, but this operation is not available to your account’s role. Some operations require the account administrator role; others are back-office only and are not part of this published surface. Do not retry — it will not start working.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"404":{"description":"Not Found — No such record, or it is not visible to your account. Credentials only ever see their own account’s data, so a valid identifier belonging to another customer answers exactly like one that does not exist.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"security":[{"token":[]}],"operationId":"getPriceCodesByPriceCode","description":"One price code in full, including its attributes and quantity breaks. Use it to price a single product without pulling the whole catalogue. ⚠️ The code contains characters that must be URL-encoded."}},"/PriceCodes/price-codes":{"get":{"tags":["PriceCodes"],"summary":"Gets the priceCodes for the current Customer","parameters":[{"name":"page","in":"query","description":"The page number","schema":{"type":"integer","format":"int32","default":1}},{"name":"pageSize","in":"query","description":"The size of the Page in rows","schema":{"type":"integer","format":"int32","default":25}},{"name":"filter","in":"query","description":"(optional)If supplied will filter the search results","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Pricing_PriceCodeDto"}},"examples":{"default":{"summary":"Price codes for this account, at this account’s tier","value":[{"priceCode":"WE_LC:Wearable-4\" x 4\"","description":"Wearable 4\" x 4\"","categoryCode":"WEAR","categoryName":"Wearables","name":"Wearable — Left chest 4\" x 4\"","processCode":"WE","masterProcessCode":"WE","minimumQuantity":10,"externalSupplier":null,"externalPriceCode":null,"hasMetaDataAttributes":true,"standardSetup":null,"standardReset":18.5,"sampleAvailable":true,"sizeUnit":"in","sizeWidth":4,"sizeHeight":4,"attributes":[{"minLength":0,"maxLength":60,"name":"description","type":"text","label":"Description","description":"Shown on the job line","required":true,"isMetaDataAttribute":false,"assetAttributeName":null}],"priceBands":[{"from":1,"to":24,"unitPrice":4.95},{"from":25,"to":99,"unitPrice":3.6},{"from":100,"to":null,"unitPrice":2.85}]}]}}}}},"400":{"description":"Bad Request — The request was rejected before anything happened. Read the response body — validation failures come back as `{ \"isValid\": false, \"validationMessages\": [{ \"errorCode\", \"message\" }] }`. Retrying an unchanged request will fail identically.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"403":{"description":"Forbidden — Authenticated, but this operation is not available to your account’s role. Some operations require the account administrator role; others are back-office only and are not part of this published surface. Do not retry — it will not start working.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"security":[{"token":[]}],"operationId":"getPriceCodesPricecodes","description":"Price codes for your account, with sizes and prices at your tier. The `code` value is what you pass as a job line `code` when `itemType` is `PriceCode`. Prices are yours, not list — do not cache them across accounts."}},"/PriceCodes/processes":{"get":{"tags":["PriceCodes"],"summary":"Get list of pricing processes from the Pricing database","description":"The processes available to your account. Start every integration here: availability is per-account and changes, so a hardcoded process list will break for some customers and silently exclude products for others.","responses":{"200":{"description":"Successfully retrieved pricing processes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_PricingProcessesResponse"},"examples":{"default":{"summary":"Processes this account can order — start every integration here","value":{"processes":[{"processCode":"WE","description":"Wearable transfers","active":true,"sheetRank":10,"sheetColor":"E4572E","tooltip":"Full-colour wearable","mapsToMaster":"WE","maximumSheetUnit":null,"maximumSheetWidth":null,"maximumSheetHeight":null}]}}}}}},"401":{"description":"Authentication required — No valid bearer token. Request one from this region’s `/api/auth/token` with your `client_id` and `client_secret`, and send it as `Authorization: Bearer <token>`. A token from another region’s host will also produce this.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"403":{"description":"Access denied - user lacks required permissions — Authenticated, but this operation is not available to your account’s role. Some operations require the account administrator role; others are back-office only and are not part of this published surface. Do not retry — it will not start working.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"500":{"description":"An error occurred — An unexpected server error. Retry once with backoff; if it persists, contact your account manager with the time of the request and the endpoint.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"operationId":"getPriceCodesProcesses"}},"/promocode/validate/{code}":{"get":{"tags":["PromoCodes"],"summary":"Validate promo code","description":"Validates a promo code for the authenticated customer.\r\nChecks if the code exists, is active, not expired, and hasn't exceeded usage limits (overall or per-customer).\r\nOptionally validates that the promo code is applicable to specific process codes.\r\n            \r\nReturns:\r\n- isValid: Whether the promo code can be used\r\n- promoCode: The promo code that was validated\r\n- discount: Discount amount (cents if isFixed=true, percentage if isFixed=false)\r\n- isFixed: true for fixed amount discount, false for percentage discount\r\n- message: Error message if not valid (expired, max uses reached, not applicable to process, etc.)","parameters":[{"name":"code","in":"path","description":"Promo code to validate","required":true,"schema":{"type":"string"}},{"name":"processCodes","in":"query","description":"Optional comma-separated list of process codes (e.g., \"Embroidery,Printing\") from ProcessRank.Process","schema":{"type":"string"}}],"responses":{"200":{"description":"Promo code validation result returned successfully (check isValid field)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dto_Api_ValidatePromocodeResponse"},"examples":{"default":{"summary":"A promotional code checked before it is applied to a job","value":{"isValid":true,"promoCode":"WINTER10","description":null,"discount":10,"isFixed":false,"message":"Promotion applied successfully.","applicableProcessCodes":null}}}}}},"401":{"description":"User is not authenticated — No valid bearer token. Request one from this region’s `/api/auth/token` with your `client_id` and `client_secret`, and send it as `Authorization: Bearer <token>`. A token from another region’s host will also produce this.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"security":[{"token":[]}],"operationId":"getPromocodeValidateByCode"}},"/Stock/{code}":{"get":{"tags":["Stock"],"summary":"Get a List of stock and its variants","parameters":[{"name":"code","in":"path","description":"A stock Code or stock variant code","required":true,"schema":{"type":"string"}},{"name":"includePricing","in":"query","description":"","schema":{"type":"boolean","default":true}},{"name":"variantSortColumn","in":"query","description":"","schema":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Enums_VariantSortColumn"}],"default":"VariantCode"}},{"name":"variantSortDirection","in":"query","description":"","schema":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Enums_SortDirection"}],"default":"Ascending"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Stocks_StockDto"},"examples":{"default":{"summary":"One stocked item, with variants and shipping configuration","value":{"supplier":"Example Supply Co","categoryName":"Tees","stockCode":"5000","processCode":"STOCK","stockName":"Heavy Cotton Adult T-Shirt","stockDescription":"Tees","stockSpecifications":"100% cotton, 180gsm.","priceCompatibleLookupCode":"STOCKLOOKUP","rank":10,"stockVariants":[{"variantCode":"50002","colour":"Black","variantImageUrl":"https://example.com/stock/50002/image","numberOfSizes":5,"sizesCsv":"S,M,L,XL,2XL"}],"stockImageUrl":"https://example.com/stock/5000/image","images":[{"url":"https://example.com/stock/5000/image","name":null,"altText":null}],"showAvailableStock":true,"shippingConfigs":[{"id":71,"markets":["NZ"],"shipMode":"Standard","weight":null,"weightUnit":"kg","length":null,"width":null,"height":null,"dimensionUnit":"cm","fixedShipping":null,"groundOnly":false,"estimatedLeadDays":null,"fulfilmentLocations":[],"shipmentTypeOptions":[{"code":"Ground","name":"GND","price":12.5}]}],"markets":["NZ"],"badges":["Best seller"],"slug":"heavy-cotton-tee","seoTitle":"Heavy Cotton Adult T-Shirt","seoDescription":"A 180gsm cotton tee, stocked in five sizes.","priceBands":[{"from":1,"to":24,"unitPrice":4.95},{"from":25,"to":99,"unitPrice":3.6},{"from":100,"to":null,"unitPrice":2.85}]}}}}}},"400":{"description":"Bad Request — The request was rejected before anything happened. Read the response body — validation failures come back as `{ \"isValid\": false, \"validationMessages\": [{ \"errorCode\", \"message\" }] }`. Retrying an unchanged request will fail identically.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"403":{"description":"Forbidden — Authenticated, but this operation is not available to your account’s role. Some operations require the account administrator role; others are back-office only and are not part of this published surface. Do not retry — it will not start working.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"security":[{"token":[]}],"operationId":"getStockByCode","description":"One stocked item with its variants, sizes and shipping configuration. The `stockVariants[].sizesCsv` values are the only valid keys for a stock line's `sizeQuantities`."}},"/Stock":{"get":{"tags":["Stock"],"summary":"Get a List of stock and its variants","parameters":[{"name":"page","in":"query","description":"The page number","schema":{"type":"integer","format":"int32","default":1}},{"name":"pageSize","in":"query","description":"The size of the Page in rows","schema":{"type":"integer","format":"int32","default":25}},{"name":"filter","in":"query","description":"(optional)If supplied will filter the search results","schema":{"type":"string"}},{"name":"includePricing","in":"query","description":"","schema":{"type":"boolean","default":true}},{"name":"stockSortColumn","in":"query","description":"","schema":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Enums_StockSortColumn"}],"default":"StockCode"}},{"name":"stockSortDirection","in":"query","description":"","schema":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Enums_SortDirection"}],"default":"Ascending"}},{"name":"variantSortColumn","in":"query","description":"","schema":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Enums_VariantSortColumn"}],"default":"VariantCode"}},{"name":"variantSortDirection","in":"query","description":"","schema":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Enums_SortDirection"}],"default":"Ascending"}},{"name":"markets","in":"query","description":"CW-4317: optional comma-separated list of market codes (e.g. \"US,NZ\"). When\r\nsupplied, only stock items with at least one ACTIVE shipping configuration\r\ncovering ANY of the listed markets are returned (OR semantics). Input is\r\ntrimmed, uppercased, and de-duplicated. Omitted or empty => no market filter\r\n(existing behaviour). The filter is applied at the SQL level so pagination\r\nstays correct.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Stocks_StockDto"}},"examples":{"default":{"summary":"The stocked-goods catalogue","value":[{"supplier":"Example Supply Co","categoryName":"Tees","stockCode":"5000","processCode":"STOCK","stockName":"Heavy Cotton Adult T-Shirt","stockDescription":"Tees","stockSpecifications":"100% cotton, 180gsm.","priceCompatibleLookupCode":"STOCKLOOKUP","rank":10,"stockVariants":[{"variantCode":"50002","colour":"Black","variantImageUrl":"https://example.com/stock/50002/image","numberOfSizes":5,"sizesCsv":"S,M,L,XL,2XL"}],"stockImageUrl":"https://example.com/stock/5000/image","images":[{"url":"https://example.com/stock/5000/image","name":null,"altText":null}],"showAvailableStock":true,"markets":["NZ"],"badges":["Best seller"],"slug":"heavy-cotton-tee","seoTitle":"Heavy Cotton Adult T-Shirt","seoDescription":"A 180gsm cotton tee, stocked in five sizes.","priceBands":[{"from":1,"to":24,"unitPrice":4.95},{"from":25,"to":99,"unitPrice":3.6},{"from":100,"to":null,"unitPrice":2.85}]}]}}}}},"400":{"description":"Bad Request — The request was rejected before anything happened. Read the response body — validation failures come back as `{ \"isValid\": false, \"validationMessages\": [{ \"errorCode\", \"message\" }] }`. Retrying an unchanged request will fail identically.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"403":{"description":"Forbidden — Authenticated, but this operation is not available to your account’s role. Some operations require the account administrator role; others are back-office only and are not part of this published surface. Do not retry — it will not start working.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"security":[{"token":[]}],"operationId":"getStock","description":"The stocked-goods catalogue: heat presses, supplies, sample packs. A stock line on `POST /Jobs` uses `itemType: \"Stock\"`, the `stockCode` as `code`, a `variantCode` from `stockVariants`, and `sizeQuantities` keyed by the sizes in `stockVariants[].sizesCsv` (equipment uses the single size key `Qty`)."}},"/stock/{stockItemId}/shipping":{"get":{"tags":["StockItemShipping"],"summary":"Get all active shipping configurations for a stock item.","parameters":[{"name":"stockItemId","in":"path","description":"The stock item ID","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"List of shipping configurations","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_StockItemShippingDto"}},"examples":{"default":{"summary":"Shipping configuration for one stocked item","value":[{"id":71,"stockItemId":545,"markets":["NZ"],"shipMode":"ShipsSeparately","fulfilmentLocations":[{"locationCode":"AKL","locationName":"Auckland","locale":"NZ","shipFromCity":"Auckland","shipFromCountryCodeIso2":"NZ"}],"weight":0.25,"weightUnit":"kg","length":30,"width":22,"height":4,"dimensionUnit":"cm","fixedShipping":null,"groundOnly":false,"estimatedLeadDays":2,"active":true,"createdAt":"2026-03-11T20:00:00Z","updatedAt":"2026-07-02T04:30:00Z","shipmentTypeOptions":[]}]}}}}},"400":{"description":"Invalid stock item ID — The request was rejected before anything happened. Read the response body — validation failures come back as `{ \"isValid\": false, \"validationMessages\": [{ \"errorCode\", \"message\" }] }`. Retrying an unchanged request will fail identically.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"operationId":"getStockByStockItemIdShipping","description":"How one stocked item ships — weight, dimensions, lead time and which warehouses it can ship from."}},"/stock/shipping":{"get":{"tags":["StockItemShipping"],"summary":"Get all active stock item shipping configurations for a specific market.\r\nPrimary query used by Integrate for fetching all shipping metadata for a region.","parameters":[{"name":"market","in":"query","description":"The market code (e.g., US, AU, NZ, UK)","schema":{"type":"string"}}],"responses":{"200":{"description":"List of stock item shipping configurations","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_StockItemShippingDto"}},"examples":{"default":{"summary":"Shipping configuration for every stocked item in a market","value":[{"id":71,"stockItemId":545,"markets":["NZ"],"shipMode":"ShipsSeparately","fulfilmentLocations":[{"locationCode":"AKL","locationName":"Auckland","locale":"NZ","shipFromCity":"Auckland","shipFromCountryCodeIso2":"NZ"}],"weight":0.25,"weightUnit":"kg","length":30,"width":22,"height":4,"dimensionUnit":"cm","fixedShipping":null,"groundOnly":false,"estimatedLeadDays":2,"active":true,"createdAt":"2026-03-11T20:00:00Z","updatedAt":"2026-07-02T04:30:00Z","shipmentTypeOptions":[]}]}}}}},"400":{"description":"Market is required — The `market` query parameter is required, even though the schema does not mark it as such. Pass a market code from the `markets` array on a stock item.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}},"operationId":"getStockShipping","description":"Shipping options for stocked items. ⚠️ The `market` query parameter is required even though the schema does not mark it required — omitting it returns a 400."}}},"components":{"schemas":{"Codewolf_Api_Support_AssetDtos_AssetExtendedDto":{"type":"object","allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_AssetDtos_AssetDto"}],"properties":{"customerId":{"type":"integer","description":"Customer Id","format":"int32"}},"additionalProperties":false,"description":"Extends the AssetDto to include the CustomerId for SuperUser users who make the call"},"Codewolf_Ctrl_Api_Dto_Api_AccountProfile":{"type":"object","properties":{"id":{"type":"integer","description":"Customer ID","format":"int32"},"name":{"type":"string","description":"Customer name (for reference)","nullable":true},"priceTierCode":{"type":"string","description":"Customer's pricing tier code","nullable":true},"currency":{"type":"string","description":"Currency code for transactions","nullable":true},"taxRateType":{"type":"string","description":"Tax rate type (e.g., \"GST\", \"VAT\", \"Sales Tax\")","nullable":true},"taxRate":{"type":"number","description":"Tax rate percentage (null if using TaxJar or tax exempt)","format":"double","nullable":true},"taxSystemTaxExempt":{"type":"boolean","description":"Whether customer is tax exempt"},"taxSystemTaxExemptReason":{"type":"string","description":"Reason for tax exemption (if applicable)","nullable":true},"showPayNow":{"type":"boolean","description":"Whether to show \"Pay Now\" option"},"creditCardRequired":{"type":"boolean","description":"Whether credit card is required for orders"},"shipmentCarriersCSV":{"type":"string","description":"Comma-separated list of available shipment carriers","nullable":true},"excludeShipmentsCsv":{"type":"string","description":"Comma-separated list of excluded shipment types","nullable":true},"courierAccountCode":{"type":"string","description":"Customer's courier account code (if shipping on own account)","nullable":true},"courierSiteID":{"type":"string","description":"Courier site ID","nullable":true},"crmId":{"type":"string","description":"External CRM system ID (for reference only)","nullable":true},"accountManagerName":{"type":"string","description":"Account manager full name (FirstName LastName format)","nullable":true},"accountManagerEmail":{"type":"string","description":"Account manager email address","nullable":true},"tierLast12Months":{"type":"string","description":"Customer tier based on last 12 months of activity","nullable":true},"paymentTermDays":{"type":"integer","description":"Gets or sets the number of days allowed for payment after an invoice is issued.","format":"int32","nullable":true},"paymentTermType":{"type":"string","description":"Gets or sets the type of payment terms (e.g., \"Net\", \"Due on Receipt\").","nullable":true},"entityAddress":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dto_Api_EntityAddressDto"}],"description":"Entity (company) street address associated with this account","nullable":true},"taxCertificates":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dto_Api_TaxCertificate"},"description":"List of tax exemption certificates for this account","nullable":true},"paymentMode":{"type":"string","description":"Payment mode for this customer (e.g., \"credit_card_required\", \"pay_up_front\").\r\nDetermines checkout behaviour for retail integrations.","nullable":true},"paymentMethods":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dto_Api_PaymentMethod"},"description":"List of saved payment methods for this account","nullable":true}},"additionalProperties":false,"description":"Account profile information for authenticated customer users.\r\nRead-only company/organization-level data.\r\nMatches what customers can currently see in the secure portal."},"Codewolf_Ctrl_Api_Dto_Api_AccountUserInfo":{"type":"object","properties":{"id":{"type":"integer","description":"User ID","format":"int32"},"guid":{"type":"string","description":"User GUID","format":"uuid"},"customerId":{"type":"integer","description":"Customer/account ID this user belongs to","format":"int32"},"customerName":{"type":"string","description":"Customer/company name","nullable":true},"userName":{"type":"string","description":"Login username","nullable":true},"firstName":{"type":"string","description":"First name","nullable":true},"lastName":{"type":"string","description":"Last name","nullable":true},"emailAddress":{"type":"string","description":"Email address","nullable":true},"active":{"type":"boolean","description":"Whether user is active (can log in)"},"phone":{"type":"string","description":"Phone number","nullable":true},"mobile":{"type":"string","description":"Mobile number","nullable":true},"streetAddress":{"type":"string","description":"Street address line 1","nullable":true},"addressLine2":{"type":"string","description":"Street address line 2","nullable":true},"suburb":{"type":"string","description":"Suburb/neighborhood","nullable":true},"city":{"type":"string","description":"City","nullable":true},"state":{"type":"string","description":"State/province","nullable":true},"postalCode":{"type":"string","description":"Postal/ZIP code","nullable":true},"country":{"type":"string","description":"Country","nullable":true},"locationID":{"type":"integer","description":"Location ID (if multi-location enabled)","format":"int32","nullable":true},"locationName":{"type":"string","description":"Location name (if multi-location enabled)","nullable":true},"defaultPage":{"type":"string","description":"Default landing page URL","nullable":true},"orderNumberPrefix":{"type":"string","description":"Custom order number prefix (max 5 chars)","nullable":true},"receiveEmails":{"type":"boolean","description":"Receive general emails"},"promotionRecipient":{"type":"boolean","description":"Receive promotional emails"},"receiveInvoice":{"type":"boolean","description":"Receive invoice emails"},"receiveInwards":{"type":"boolean","description":"Receive inward shipment notifications"},"textNotifyProof":{"type":"boolean","description":"SMS notification when job proof sent"},"textNotifyDispatch":{"type":"boolean","description":"SMS notification when job dispatched"},"usernameLoginOnly":{"type":"boolean","description":"Whether this user logs in with username only (email is shared with another user)"},"lastLogin":{"type":"string","description":"Last login timestamp (UTC)","format":"date-time","nullable":true},"loginCount":{"type":"integer","description":"Total login count","format":"int32"}},"additionalProperties":false,"description":"Complete user profile information for authenticated user.\r\nExcludes sensitive fields like passwords and internal role flags."},"Codewolf_Ctrl_Api_Dto_Api_AccountUserSummary":{"type":"object","properties":{"id":{"type":"integer","description":"User ID","format":"int32"},"guid":{"type":"string","description":"User GUID","format":"uuid"},"userName":{"type":"string","description":"Login username","nullable":true},"firstName":{"type":"string","description":"First name","nullable":true},"lastName":{"type":"string","description":"Last name","nullable":true},"emailAddress":{"type":"string","description":"Email address","nullable":true},"active":{"type":"boolean","description":"Whether user is active (can log in)"},"locationName":{"type":"string","description":"Location name (if multi-location enabled)","nullable":true},"usernameLoginOnly":{"type":"boolean","description":"Whether this user logs in with username only (email is shared with another user)"},"lastLogin":{"type":"string","description":"Last login timestamp (UTC)","format":"date-time","nullable":true},"loginCount":{"type":"integer","description":"Total login count","format":"int32"}},"additionalProperties":false,"description":"Lightweight user summary for list view (GET /account/users).\r\nProvides essential user information for administrative user management."},"Codewolf_Ctrl_Api_Dto_Api_EntityAddressDto":{"type":"object","properties":{"id":{"type":"integer","description":"Entity address ID","format":"int32"},"streetAddress":{"type":"string","description":"Street address (line 1)","nullable":true},"addressLine2":{"type":"string","description":"Address line 2","nullable":true},"city":{"type":"string","description":"City","nullable":true},"state":{"type":"string","description":"State/province abbreviation (e.g., \"CA\", \"NY\")","nullable":true},"stateFull":{"type":"string","description":"Full state/province name (e.g., \"California\", \"New York\")","nullable":true},"postalCode":{"type":"string","description":"Postal/ZIP code","nullable":true},"countryCode":{"type":"string","description":"ISO 3166-1 alpha-2 country code (e.g., \"US\", \"NZ\")","nullable":true},"countryName":{"type":"string","description":"Full country name","nullable":true},"contactName":{"type":"string","description":"Contact name","nullable":true},"organisation":{"type":"string","description":"Organisation name","nullable":true},"phone":{"type":"string","description":"Phone number","nullable":true},"emailAddress":{"type":"string","description":"Email address","nullable":true},"addressSummaryOneLine":{"type":"string","description":"One-line summary of the full address","nullable":true}},"additionalProperties":false,"description":"Entity (company) address associated with a customer account.\r\nRead from the EntityAddress table where RelatedToEntityType = 'CUSTOMER'."},"Codewolf_Ctrl_Api_Dto_Api_FreightRateDto":{"type":"object","properties":{"carrier":{"type":"string","description":"Carrier code (e.g. \"FedEx\", \"UPS\"). Null for the global default row.","nullable":true},"carrierName":{"type":"string","description":"Carrier display name (e.g. \"FedEx\", \"DEFAULT\").","nullable":true},"service":{"type":"string","description":"Service code (e.g. \"fedex_2day\"). Null when not applicable.","nullable":true},"serviceName":{"type":"string","description":"Service display name (e.g. \"FedEx 2Day®\"). Null when not applicable.","nullable":true},"package":{"type":"string","description":"Package code (e.g. \"YOUR_PACKAGING\"). \"DEFAULT\" for default package. Null when not applicable.","nullable":true},"packageName":{"type":"string","description":"Package display name. Null when not applicable.","nullable":true},"chargeType":{"type":"string","description":"Charge type: \"markup_on_order\" (percentage of order value) or \"fixed_per_package\".","nullable":true},"value":{"type":"number","description":"Rate value (percentage or fixed amount).","format":"double"},"minimum":{"type":"number","description":"Minimum charge (null if none).","format":"double","nullable":true},"isDefault":{"type":"boolean","description":"True if this rate is inherited from system/tenant defaults (read-only).\r\nFalse if this is a customer-specific override (editable/deletable)."}},"additionalProperties":false,"description":"Freight rate rule from the cascaded view: system defaults → tenant defaults → customer overrides."},"Codewolf_Ctrl_Api_Dto_Api_PaymentMethod":{"type":"object","properties":{"id":{"type":"string","description":"Token ID (GUID)","format":"uuid"},"gatewayProvider":{"type":"string","description":"Gateway provider name (e.g., \"Stripe\", \"PaymentExpress\", \"Windcave\")","nullable":true},"cardName":{"type":"string","description":"Card type (e.g., \"Visa\", \"Mastercard\", \"Amex\")","nullable":true},"cardNumber":{"type":"string","description":"Masked card number (e.g., \"****1234\")","nullable":true},"cardExpiry":{"type":"string","description":"Card expiry (MM/YY format)","nullable":true},"cardHolderName":{"type":"string","description":"Cardholder name","nullable":true},"dateCreatedUtc":{"type":"string","description":"When card was added","format":"date-time"},"isDefault":{"type":"boolean","description":"Whether this is the default payment method"}},"additionalProperties":false,"description":"Saved payment method (credit card token) information (read-only)"},"Codewolf_Ctrl_Api_Dto_Api_PaymentTransaction":{"type":"object","properties":{"id":{"type":"integer","description":"Transaction ID","format":"int32"},"gatewayType":{"type":"string","description":"Payment gateway provider (e.g., \"Stripe\", \"PaymentExpress\", \"Windcave\")","nullable":true},"transactionStatus":{"type":"string","description":"Transaction status (e.g., \"Completed\", \"Pending\", \"Failed\", \"Cancelled\")","nullable":true},"createdAt":{"type":"string","description":"When transaction was created","format":"date-time"},"completedAt":{"type":"string","description":"When transaction completed (null if pending/failed)","format":"date-time","nullable":true},"cardName":{"type":"string","description":"Card type (e.g., \"Visa\", \"Mastercard\", \"Amex\")","nullable":true},"cardNumber":{"type":"string","description":"Masked card number (e.g., \"****1234\")","nullable":true},"cardExpiry":{"type":"string","description":"Card expiry (MM/YY format)","nullable":true},"currencySettlement":{"type":"string","description":"Settlement currency code (e.g., \"USD\", \"NZD\", \"GBP\")","nullable":true},"amountSettlement":{"type":"number","description":"Settlement amount","format":"double"},"merchantEntityType":{"type":"string","description":"Entity type this transaction is for (e.g., \"JOB\", \"CUSTOMER\")","nullable":true},"merchantEntityId":{"type":"integer","description":"Related entity ID (e.g., Job ID if transaction is for a job payment)","format":"int32","nullable":true}},"additionalProperties":false,"description":"Payment transaction history record (read-only)"},"Codewolf_Ctrl_Api_Dto_Api_ReceiverPaysSettings":{"type":"object","properties":{"billingAccountNumber":{"type":"string","description":"Customer's carrier account number for third-party billing.","nullable":true},"billingPostalCode":{"type":"string","description":"Billing postal code for the carrier account.","nullable":true},"billingCountryCode":{"type":"string","description":"Billing country code (e.g., \"US\", \"NZ\").","nullable":true}},"additionalProperties":false,"description":"Third-party billing (receiver pays) configuration."},"Codewolf_Ctrl_Api_Dto_Api_ShipmentSettings":{"type":"object","properties":{"availableCarriers":{"type":"array","items":{"type":"string"},"description":"Carriers available to this customer.\r\nIf customer has no restrictions, this contains all carrier options.","nullable":true},"carrierOptions":{"type":"array","items":{"type":"string"},"description":"All carrier options available for selection (carrier names).","nullable":true},"receiverPays":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dto_Api_ReceiverPaysSettings"}],"description":"Third-party billing configuration for customer's own carrier account.","nullable":true},"showCustomerAddressOnLabel":{"type":"boolean","description":"Whether to show customer's address as return address on shipping labels."},"handlingFee":{"type":"number","description":"Handling fee amount.\r\nNote: Automatically set to 0 when receiverPays is enabled.","format":"double"},"applyHandlingFeeInsteadOfFreight":{"type":"boolean","description":"If true, handling fee replaces freight charges.\r\nNote: Automatically set to true when receiverPays is enabled."},"jobComment":{"type":"string","description":"Default comment that appears on jobs for shipping department.","nullable":true},"availableShipmentTypes":{"type":"array","items":{"type":"string"},"description":"Shipment type codes available for this customer.\r\nDerived from ExcludeShipmentsCsv (inverted logic).\r\nEmpty array means all shipment types are available.","nullable":true},"shipmentTypeOptions":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dto_Api_ShipmentType"},"description":"All shipment type options available for selection.","nullable":true},"freightRates":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dto_Api_FreightRateDto"},"description":"Freight rate rules with cascading defaults (read-only).","nullable":true}},"additionalProperties":false,"description":"Customer shipment settings - company-level shipping configuration."},"Codewolf_Ctrl_Api_Dto_Api_ShipmentType":{"type":"object","properties":{"code":{"type":"string","description":"Shipment type code.","nullable":true},"name":{"type":"string","description":"Display name for the shipment type.","nullable":true}},"additionalProperties":false,"description":"Shipment type with code and display name."},"Codewolf_Ctrl_Api_Dto_Api_TaxCertificate":{"type":"object","properties":{"id":{"type":"integer","description":"Tax certificate ID","format":"int32"},"customerId":{"type":"integer","description":"Customer ID (always matches authenticated customer)","format":"int32"},"name":{"type":"string","description":"Contact name on certificate","nullable":true},"businessName":{"type":"string","description":"Business name on certificate","nullable":true},"exemptionNumber":{"type":"string","description":"Certificate/exemption number","nullable":true},"employerIdentificationNumber":{"type":"string","description":"Employer Identification Number (EIN/Tax ID) - optional","nullable":true},"businessEntityId":{"type":"string","description":"Business entity ID - optional","nullable":true},"licenseExpiryDate":{"type":"string","description":"License expiry date (null if no expiry)","format":"date-time","nullable":true},"exemptionType":{"type":"string","description":"Type of exemption (e.g., \"Resale\", \"Manufacturing\", \"Non-Profit\")","nullable":true},"exemptionState":{"type":"string","description":"State where exemption applies (e.g., \"CA\", \"TX\")","nullable":true},"fileName":{"type":"string","description":"Uploaded certificate file name (null if no file uploaded)","nullable":true},"hasFile":{"type":"boolean","description":"Whether a certificate file has been uploaded","readOnly":true},"createdAt":{"type":"string","description":"When this certificate was created","format":"date-time"},"updatedAt":{"type":"string","description":"When this certificate was last updated","format":"date-time"},"entityFileId":{"type":"integer","format":"int32","description":"Identifier of the stored certificate file."},"cdnUrl":{"type":"string","nullable":true,"description":"Time-limited link to download the certificate."},"fileStatus":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Enums_FileStatus"}],"description":"Where the certificate has got to in review."},"fileStatusDescription":{"type":"string","nullable":true,"readOnly":true,"description":"The review status in words, suitable for display."}},"additionalProperties":false,"description":"Full tax exemption certificate details"},"Codewolf_Ctrl_Api_Dto_Api_ValidatePromocodeResponse":{"type":"object","properties":{"isValid":{"type":"boolean","description":"Whether the promo code is valid for the customer"},"promoCode":{"type":"string","description":"The promo code that was validated","nullable":true},"description":{"type":"string","description":"Description of the promo code","nullable":true},"discount":{"type":"integer","description":"Discount amount (cents if IsFixed=true, percentage if IsFixed=false)","format":"int32"},"isFixed":{"type":"boolean","description":"Whether this is a fixed amount discount (true) or percentage discount (false)"},"message":{"type":"string","description":"Error message if the promo code is not valid. Empty if valid.","nullable":true},"applicableProcessCodes":{"type":"array","items":{"type":"string"},"description":"List of applicable process codes from the ones provided (if processCodes parameter was supplied).\r\nReturns null if no processCodes were provided or if promo code is not process-specific.","nullable":true}},"additionalProperties":false,"description":"Response from promo code validation"},"Codewolf_Ctrl_Api_Dto_PatchJobDto":{"type":"object","properties":{"description":{"maxLength":500,"type":"string","description":"The job description shown on the job and on your invoice.","nullable":true},"comments":{"maxLength":1000,"type":"string","description":"Notes carried on the job. Sent to the factory with the order.","nullable":true},"orderNumber":{"maxLength":50,"type":"string","description":"Your own PO or order reference for this job.","nullable":true},"mustDate":{"type":"boolean","description":"Whether `dateDue` is a hard requirement rather than a preference. Setting it commits the factory to the date, so only use it when the date genuinely cannot move.","nullable":true},"dateDue":{"type":"string","description":"The ship date you are asking for. Check it against `GET /Jobs/earliest-ship-date` — a date the factory cannot meet is rejected rather than silently moved.","format":"date-time","nullable":true},"locationCode":{"maxLength":50,"type":"string","description":"⚠️ Not available to customer credentials — this field is SuperUser-only. Production location is set by us. Omit it.","nullable":true}},"additionalProperties":false,"description":"DTO for patching job details"},"Codewolf_Ctrl_Api_Dto_ShippingDateExclusionDto":{"type":"object","properties":{"dateFrom":{"type":"string","description":"Start date of the exclusion period (date only, no time)","format":"date"},"dateTo":{"type":"string","description":"End date of the exclusion period (date only, no time)","format":"date"}},"additionalProperties":false,"description":"Date exclusion (holiday/non-working day) for calendar blocking"},"Codewolf_Ctrl_Api_Dto_ShippingDateResponseDto":{"type":"object","properties":{"shippingDateUtc":{"type":"string","description":"Calculated earliest shipping date in UTC","format":"date-time"},"shippingDateLocal":{"type":"string","description":"Calculated earliest shipping date in customer's local timezone","format":"date-time"},"timezone":{"type":"string","description":"IANA timezone used for calculations (e.g., \"Pacific/Auckland\")","nullable":true},"dateExclusions":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dto_ShippingDateExclusionDto"},"description":"List of date exclusions (holidays, non-working days) to block on calendar UI","nullable":true}},"additionalProperties":false,"description":"Response containing calculated shipping date and date exclusions for calendar blocking"},"Codewolf_Ctrl_Api_Dtos_Api_AssetFileDto":{"type":"object","properties":{"fileId":{"type":"string","description":"Hashed file identifier (matches the hashId in cdnUrl)\r\nCan be used to construct CDN URLs or for download requests","nullable":true},"fileName":{"type":"string","description":"Original filename","nullable":true},"fileSize":{"type":"integer","description":"File size in bytes","format":"int64"},"dateUploaded":{"type":"string","description":"Date and time when the file was uploaded","format":"date-time"},"isImage":{"type":"boolean","description":"Indicates whether this file is an image type (jpg, jpeg, png, gif, bmp)\r\nFor image files, clients can append ?size=100 to cdnUrl for thumbnails"},"cdnUrl":{"type":"string","description":"Full CDN URL for accessing the file\r\nFor images, append ?size=50, ?size=100, or ?size=150 for thumbnails","nullable":true}},"additionalProperties":false,"description":"Individual asset file information"},"Codewolf_Ctrl_Api_Dtos_Api_AssetFilesResponseDto":{"type":"object","properties":{"assetTag":{"type":"string","description":"The asset tag (also known as asset code)","nullable":true},"currentFiles":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_AssetFileDto"},{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_HistoricAssetFileDto"}],"description":"Individual asset file information"},"description":"List of current (active) files associated with this asset (ordered by date uploaded descending)","nullable":true},"historicFiles":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_HistoricAssetFileDto"},"description":"List of historic (archived) files associated with this asset (ordered by date uploaded descending)","nullable":true}},"additionalProperties":false,"description":"Response DTO for retrieving asset files"},"Codewolf_Ctrl_Api_Dtos_Api_AssetJobDto":{"type":"object","properties":{"jobNumber":{"type":"integer","description":"Job number","format":"int32"},"orderNumber":{"type":"string","description":"Customer's order number","nullable":true},"description":{"type":"string","description":"Job description","nullable":true},"quantity":{"type":"integer","description":"Quantity from the job line matching this asset (not total job qty)","format":"int32","nullable":true},"dateOut":{"type":"string","description":"Date the job was dispatched (null for active jobs not yet shipped)","format":"date-time","nullable":true},"masterJobStatus":{"type":"string","description":"Current job status","nullable":true}},"additionalProperties":false,"description":"Individual job information in asset jobs response"},"Codewolf_Ctrl_Api_Dtos_Api_AssetJobsResponseDto":{"type":"object","properties":{"assetCode":{"type":"string","description":"The asset code that was queried","nullable":true},"jobs":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_AssetJobDto"},"description":"List of jobs containing this asset","nullable":true},"totalCount":{"type":"integer","description":"Total count of jobs returned","format":"int32"}},"additionalProperties":false,"description":"Response DTO for asset jobs endpoint"},"Codewolf_Ctrl_Api_Dtos_Api_AssetListDto":{"type":"object","properties":{"assetId":{"type":"integer","format":"int32","description":"Internal numeric id. Use `assetTag` when ordering — that is what a job line accepts."},"assetTag":{"type":"string","nullable":true,"description":"The asset's code, and the thing you reorder by: send it as a job line `code` with `itemType: \"Asset\"`. Reordering a tag reproduces the previous run exactly — no artwork upload, no colour re-approval."},"processCode":{"type":"string","nullable":true,"description":"The production process this asset is made with. Values come from `GET /Lookups/process-codes`."},"description":{"type":"string","nullable":true,"description":"The asset's name as it appears on jobs and invoices."},"garment":{"type":"string","nullable":true,"description":"The garment this asset was set up against, where one was recorded."},"priceTierCode":{"type":"string","nullable":true,"description":"The pricing tier the `priceBands` below are quoted at — your account's tier."},"setup":{"type":"number","format":"double","description":"One-off charge to create the asset. Already paid on an existing asset, so a reorder does not incur it."},"reset":{"type":"number","format":"double","description":"Charge applied each time the asset is run again. This is the real cost of a reorder, alongside the unit price."},"priceCode":{"type":"string","nullable":true,"description":"The price code the asset was originally created from."},"assetUrl":{"type":"string","nullable":true,"description":"Link to a preview image of the asset. Null where no preview has been generated."},"createDate":{"type":"string","format":"date-time","description":"When the asset was first created, UTC."},"isGlobal":{"type":"boolean","description":"True for catalogue assets available to every account rather than ones your account created. Global assets are also listed by `GET /Assets/global`."},"isArchived":{"type":"boolean","description":"True when the asset has been retired. An archived asset cannot be reordered."},"priceBands":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Interfaces_IPriceBandDto"},"nullable":true,"description":"Quantity-break pricing for reordering this asset, at your account's tier."}},"additionalProperties":false,"description":"Asset DTO for list endpoints - excludes ExternalId per CW-4024"},"Codewolf_Ctrl_Api_Dtos_Api_CountryDto":{"type":"object","properties":{"name":{"type":"string","description":"Full country name","nullable":true,"example":"United States"},"iso2":{"type":"string","description":"ISO 3166-1 alpha-2 code","nullable":true,"example":"US"},"iso3":{"type":"string","description":"ISO 3166-1 alpha-3 code","nullable":true,"example":"USA"},"hasSuburb":{"type":"boolean","description":"Indicates whether this country uses a suburb/district field in addresses (Dependent Locality)","example":true},"hasState":{"type":"boolean","description":"Indicates whether this country uses a state/province field in addresses (Administrative Area)","example":true},"hasPostalCode":{"type":"boolean","description":"Indicates whether this country uses a postal/zip code field in addresses","example":true}},"additionalProperties":false,"description":"Country information for lookup"},"Codewolf_Ctrl_Api_Dtos_Api_CountryListResponse":{"type":"object","properties":{"countries":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_CountryDto"},"description":"List of available countries","nullable":true},"defaultCountry":{"type":"string","description":"Default country ISO2 code for this tenant","nullable":true,"example":"US"}},"additionalProperties":false,"description":"Response containing list of countries with default"},"Codewolf_Ctrl_Api_Dtos_Api_FulfilmentLocationDto":{"type":"object","properties":{"locationCode":{"type":"string","nullable":true,"description":"Short code for the fulfilment location."},"locationName":{"type":"string","nullable":true,"description":"Human-readable name of the fulfilment location."},"locale":{"type":"string","nullable":true,"description":"The region the location sits in."},"shipFromCity":{"type":"string","nullable":true,"description":"City goods leave from — the origin used when rating shipping."},"shipFromCountryCodeIso2":{"type":"string","nullable":true,"description":"Two-character ISO country code goods ship from."}},"additionalProperties":false,"description":"Nested DTO representing a resolved fulfilment location within a shipping config."},"Codewolf_Ctrl_Api_Dtos_Api_HistoricAssetFileDto":{"type":"object","allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_AssetFileDto"}],"properties":{"action":{"type":"string","description":"Action that caused this file to be archived (e.g., \"Replaced\", \"Archived\")","nullable":true}},"additionalProperties":false,"description":"Historic (archived) asset file information with action details"},"Codewolf_Ctrl_Api_Dtos_Api_InwardsSizeSetDto":{"type":"object","properties":{"id":{"type":"integer","description":"tblSizeMain.ID","format":"int32"},"name":{"type":"string","description":"tblSizeMain.szDesc","nullable":true},"sizes":{"type":"array","items":{"type":"string"},"description":"Active size labels, in position order (sz1..sz20, skipping null/empty).","nullable":true}},"additionalProperties":false,"description":"A size template — e.g. \"2XS-5XL\", \"One Size\"."},"Codewolf_Ctrl_Api_Dtos_Api_PagedActiveJobsDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_ReturnDtos_ActiveJobDto"},"description":"The collection of active jobs for the current page.","nullable":true},"totalCount":{"type":"integer","description":"The total number of active jobs across all pages.","format":"int32"},"pageNumber":{"type":"integer","description":"The current page number (1-based).","format":"int32"},"pageSize":{"type":"integer","description":"The number of items per page.","format":"int32"},"totalPages":{"type":"integer","description":"The total number of pages available.","format":"int32"},"hasPreviousPage":{"type":"boolean","description":"Indicates whether there is a previous page available.","readOnly":true},"hasNextPage":{"type":"boolean","description":"Indicates whether there is a next page available.","readOnly":true}},"additionalProperties":false,"description":"Represents a paginated response containing active jobs."},"Codewolf_Ctrl_Api_Dtos_Api_PricingProcessDto":{"type":"object","properties":{"processCode":{"type":"string","description":"Process code identifier","nullable":true,"example":"WE"},"description":{"type":"string","description":"Human-readable process description","nullable":true,"example":"Wearable Transfers"},"active":{"type":"boolean","description":"Whether process is currently available","example":true},"sheetRank":{"type":"integer","description":"Sort order for UI display","format":"int32","example":10},"sheetColor":{"type":"string","description":"Hex color code for UI display","nullable":true,"example":"ddd9c4"},"tooltip":{"type":"string","description":"Tooltip text for UI","nullable":true,"example":"Wearables"},"mapsToMaster":{"type":"string","description":"Master process code for grouping variants","nullable":true,"example":"WE"},"maximumSheetUnit":{"type":"string","description":"Unit of measure for the maximum sheet dimensions (cm / in / mm)","nullable":true,"example":"mm"},"maximumSheetWidth":{"type":"number","description":"Maximum sheet width in Codewolf.Ctrl.Api.Dtos.Api.PricingProcessDto.MaximumSheetUnit","format":"double","nullable":true,"example":500},"maximumSheetHeight":{"type":"number","description":"Maximum sheet height in Codewolf.Ctrl.Api.Dtos.Api.PricingProcessDto.MaximumSheetUnit","format":"double","nullable":true,"example":700}},"additionalProperties":false,"description":"Pricing process information from the Pricing database"},"Codewolf_Ctrl_Api_Dtos_Api_PricingProcessesResponse":{"type":"object","properties":{"processes":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_PricingProcessDto"},"description":"List of pricing processes","nullable":true}},"additionalProperties":false,"description":"Response wrapper for pricing processes"},"Codewolf_Ctrl_Api_Dtos_Api_ProcessCodeDto":{"required":["description","processCode"],"type":"object","properties":{"processCode":{"minLength":1,"type":"string","description":"Process code identifier","example":"WE"},"description":{"minLength":1,"type":"string","description":"Human-readable process description","example":"Wearable Transfer"},"rank":{"type":"integer","description":"Display order rank (lower values appear first)","format":"int32","example":10},"metadata":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_ProcessCodeMetadataDto"}],"description":"Process metadata containing operational flags","nullable":true}},"additionalProperties":false,"description":"Process code information"},"Codewolf_Ctrl_Api_Dtos_Api_ProcessCodeMetadataDto":{"type":"object","properties":{"setupApplies":{"type":"boolean","description":"Indicates if setup charges apply to this process","example":true},"resetApplies":{"type":"boolean","description":"Indicates if reset charges apply to this process","example":true},"scheduleable":{"type":"boolean","description":"Indicates if this process can be scheduled in production","example":true},"physicalStockRequired":{"type":"boolean","description":"Indicates if physical stock is required for this process","example":false},"printable":{"type":"boolean","description":"Indicates if this process produces printable output","example":true}},"additionalProperties":false,"description":"Process metadata containing operational flags"},"Codewolf_Ctrl_Api_Dtos_Api_StateDto":{"type":"object","properties":{"name":{"type":"string","description":"Full state/province name","nullable":true,"example":"California"},"abbreviation":{"type":"string","description":"State/province abbreviation","nullable":true,"example":"CA"}},"additionalProperties":false,"description":"State/province/region information for lookup"},"Codewolf_Ctrl_Api_Dtos_Api_StateListResponse":{"type":"object","properties":{"countryCode":{"type":"string","description":"Country ISO2 code","nullable":true,"example":"US"},"states":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_StateDto"},"description":"List of states/provinces for the country","nullable":true}},"additionalProperties":false,"description":"Response containing list of states/provinces for a country"},"Codewolf_Ctrl_Api_Dtos_Api_StockItemShipmentTypeOptionDto":{"type":"object","properties":{"code":{"type":"string","description":"Shipment-type code (e.g. \"USPS\", \"Ground\", \"2 Day Air\"). Must be a code\r\nconfigured in the tenant's `JobForm_DeliveryOptions` OrgPref. Matched\r\ncase-insensitively; the server normalises to the canonical casing on\r\npersistence.","nullable":true},"name":{"type":"string","description":"Display label shown to end-users. <b>Server-supplied</b> — populated from\r\nthe matched `IDeliveryOption.Label` on write; client-sent values are\r\nignored. Corresponds to the same Label exposed as `ShipmentType.Name`\r\nat `/account/shipment-settings`.","nullable":true},"price":{"type":"number","description":"Price override. `null` = use rate-API price; `0` = free; positive = flat override.\r\nAlways non-negative when set.","format":"double","nullable":true}},"additionalProperties":false,"description":"A per-method shipping override for a stock item. Determines which shipment\r\nmethods are available for this stock item in this market and what they cost."},"Codewolf_Ctrl_Api_Dtos_Api_StockItemShippingDto":{"type":"object","properties":{"id":{"type":"integer","format":"int32","description":"Identifier for this shipping configuration row."},"stockItemId":{"type":"integer","format":"int32","description":"The stocked item this configuration belongs to."},"markets":{"type":"array","items":{"type":"string"},"nullable":true,"description":"Market codes this configuration applies in. An item can ship differently per market."},"shipMode":{"type":"string","nullable":true,"description":"How the item ships — for example bundled with the rest of the order, or as its own consignment."},"fulfilmentLocations":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_FulfilmentLocationDto"},"nullable":true,"description":"The warehouses this item can ship from."},"weight":{"type":"number","format":"double","nullable":true,"description":"Shipping weight, in `weightUnit`. Null where not captured, in which case rating falls back to defaults."},"weightUnit":{"type":"string","nullable":true,"description":"Unit for `weight` — `kg` or `lb`."},"length":{"type":"number","format":"double","nullable":true,"description":"Package length, in `dimensionUnit`."},"width":{"type":"number","format":"double","nullable":true,"description":"Package width, in `dimensionUnit`."},"height":{"type":"number","format":"double","nullable":true,"description":"Package height, in `dimensionUnit`."},"dimensionUnit":{"type":"string","nullable":true,"description":"Unit for `length`, `width` and `height` — `cm` or `in`."},"fixedShipping":{"type":"number","format":"double","nullable":true,"description":"A flat shipping charge that replaces live carrier rating for this item. Null means rate it normally."},"groundOnly":{"type":"boolean","description":"True when the item cannot travel by air, which removes express methods from its options."},"estimatedLeadDays":{"type":"integer","format":"int32","nullable":true,"description":"Working days to expect before despatch, on top of any production time."},"active":{"type":"boolean","description":"Whether this configuration is in use. Inactive rows are retained for history."},"createdAt":{"type":"string","format":"date-time","description":"When the configuration was created, UTC."},"updatedAt":{"type":"string","format":"date-time","description":"When the configuration was last changed, UTC."},"shipmentTypeOptions":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_StockItemShipmentTypeOptionDto"},"description":"Per-method shipping overrides for this stock item in this market.\r\nEmpty array if no overrides are configured.\r\nOrder is meaningful — rows are returned in the sort order they were saved\r\n(first row may be treated by the consumer as the default method).","nullable":true}},"additionalProperties":false,"description":"Response DTO for a stock item shipping configuration, including resolved\r\nfulfilment location details from the junction table."},"Codewolf_Ctrl_Common_Classes_AssetDtos_AssetDto":{"type":"object","properties":{"assetId":{"type":"integer","description":"Internal Id for Asset","format":"int32"},"assetTag":{"type":"string","description":"The Tag (code) which identifies a unique asset","nullable":true},"processCode":{"type":"string","description":"The Process the Asset is used in","nullable":true},"description":{"type":"string","description":"The Asset Description","nullable":true},"garment":{"type":"string","description":"The Garment the Asset is used on","nullable":true},"priceTierCode":{"type":"string","description":"The price Tier Code","nullable":true},"setup":{"type":"number","description":"The cost to setup for this asset job ($)","format":"double"},"reset":{"type":"number","description":"The reset cost to for this asset job ($)","format":"double"},"priceCode":{"type":"string","description":"Price code used to create the Asset","nullable":true},"assetUrl":{"type":"string","description":"URL to the Asset image","nullable":true},"createDate":{"type":"string","description":"Create Date","format":"date-time"},"isGlobal":{"type":"boolean","description":"Indicates if the Asset is a Global Asset - that anyone can see/use"},"externalId":{"type":"string","description":"External identifier from third-party systems (e.g., BuildAGangSheet designId)","nullable":true},"customerId":{"type":"integer","description":"Owning customer id (ClientId on the underlying asset row). Populated when the asset is fetched\r\nvia the data-reader constructor (e.g. SuperUser flows) so callers can derive the owning customer\r\nfrom the asset itself. Nullable so it is omitted from JSON (NullValueHandling.Ignore) on the\r\nparameterless-constructor path rather than serializing as a misleading 0.","format":"int32","nullable":true},"isArchived":{"type":"boolean","description":"Indicates if the asset is archived (hidden from default view)"},"priceBands":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Interfaces_IPriceBandDto"},"description":"Pricing Bands for the Asset","nullable":true}},"additionalProperties":false,"description":"Describes an Asset Dtos"},"Codewolf_Ctrl_Common_Classes_AssetDtos_AssetTypeDto":{"type":"object","properties":{"process":{"type":"string","description":"The Process Code which normally is included at the front of the AssetCode so you can understand the process that the Asset uses","nullable":true},"assetType":{"type":"string","description":"The description of the Asset Type","nullable":true}},"additionalProperties":false,"description":"Holds the information about an Asset Type"},"Codewolf_Ctrl_Common_Classes_Jobs_BaseAddress":{"type":"object","properties":{"streetAddress":{"type":"string","description":"Street Address for Delivery/Shipping","nullable":true},"address2":{"type":"string","description":"Street Address (2nd line) for Delivery/Shipping","nullable":true},"suburb":{"type":"string","description":"Suburb (or area) for Delivery/Shipping","nullable":true},"city":{"type":"string","description":"City for Delivery/Shipping","nullable":true},"state":{"type":"string","description":"State (or area) for Delivery/Shipping","nullable":true},"stateCode":{"type":"string","description":"State code i.e. NSW, CA, FL","nullable":true},"postalCode":{"type":"string","description":"Postcode for Delivery/Shipping","nullable":true},"countryCodeISO2":{"type":"string","description":"Two-character ISO 3166-1 alpha-2 country code — `\"US\"`, `\"NZ\"`, `\"GB\"`. ⚠️ Two letters, not three: `\"USA\"` is rejected. Valid codes come from `GET /Lookups/countries` (`iso2`).","nullable":true},"country":{"type":"string","description":"Country Name","nullable":true}},"additionalProperties":false},"Codewolf_Ctrl_Common_Classes_Jobs_DeliveryAddress":{"type":"object","allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_DeliveryBaseAddress"}],"additionalProperties":false,"description":"Simplified address class for use in api for entering initial job delivery address."},"Codewolf_Ctrl_Common_Classes_Jobs_DeliveryBaseAddress":{"type":"object","allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_BaseAddress"}],"properties":{"deliveryMethod":{"type":"string","description":"Delivery method for the order shipping\r\nThis must be one of the valid delivery methods available. \r\nsee Http GET: delivery methods","nullable":true},"shippingInstructions":{"type":"string","description":"Any shipping instructions for the delivery","nullable":true},"contactName":{"type":"string","description":"Contact Name for Delivery/Shipping","nullable":true},"organisation":{"type":"string","description":"Organisation for Delivery/Shipping","nullable":true},"phone":{"type":"string","description":"Phone for Delivery/Shipping","nullable":true},"mobile":{"type":"string","description":"Mobile for Delivery/Shipping","nullable":true},"emailAddress":{"type":"string","description":"Email Address for Delivery/Shipping","nullable":true},"isSaturdayDelivery":{"type":"boolean","description":"Indicates whether Saturday delivery is requested for this shipment.\r\nSupported by UPS and FedEx express services. Optional, defaults to false."}},"additionalProperties":false,"description":"Simplified address class for use in api for entering initial job delivery address."},"Codewolf_Ctrl_Common_Classes_Jobs_InvoiceFileDto":{"type":"object","properties":{"uri":{"type":"string","description":"The URI to fetch the invoice PDF. This points at Control's public\r\n`/cdn/invoices/{token}` endpoint, where the token is a Hashids code\r\n(obfuscation, not encryption) keyed by the tenant Salt, carrying the customer,\r\njob and a lease expiry. Control re-validates the lease and job ownership\r\nserver-side on every request. The invoice is served from storage as-is\r\n(Control generates and stores it) — nothing is generated on access.","nullable":true},"uriExpires":{"type":"string","description":"Expiry of the Codewolf.Ctrl.Common.Classes.Jobs.InvoiceFileDto.Uri — the end of the link's lease window. The\r\nCDN endpoint rejects the link once this passes. Populated whenever an invoice\r\nis advertised.","format":"date-time","nullable":true}},"additionalProperties":false,"description":"A slim public representation of a job's invoice file on the Job contract.\r\nOnly exposes the URI to fetch the invoice and an optional expiry; the full\r\ninternal EntityFileLite is never exposed on the public job contract."},"Codewolf_Ctrl_Common_Classes_Jobs_JobBaseDto":{"type":"object","properties":{"jobNumber":{"type":"integer","description":"Job Number which identifies the job","format":"int32"},"description":{"type":"string","description":"The description associated with the Job","nullable":true},"comments":{"type":"string","description":"The comments associated with the Job","nullable":true},"jobStatus":{"type":"string","description":"The current status of the Job","nullable":true},"orderNumber":{"type":"string","description":"Any associated Order Number information for the Job","nullable":true},"dateDue":{"type":"string","description":"The Date the Job is due to complete","format":"date-time"},"mustDate":{"type":"boolean","description":"Indicates if the Due Date is a Must be on time flag"},"creator":{"type":"string","description":"Person who Created the Job","nullable":true},"invoiceNumber":{"type":"string","description":"Invoice Number (if been invoiced)","nullable":true},"orderGroup":{"type":"string","description":"Shared identifier linking multiple jobs from one checkout","nullable":true},"orderGroupSequence":{"type":"integer","description":"Position within the order group (1, 2, 3...)","format":"int32","nullable":true}},"additionalProperties":false,"description":"The Job record"},"Codewolf_Ctrl_Common_Classes_Jobs_JobCandidate":{"type":"object","properties":{"orderNumber":{"type":"string","description":"(optional) Order # reference (for the creating user's companies Order #)","nullable":true},"orderComment":{"type":"string","description":"Any comment associated with the Order","nullable":true},"customerUserId":{"type":"integer","description":"(Optional) The associated Customer User Id - defaults to current logged on user.\r\nWhen supplied, the user must exist, be active, and belong to the customer the job is created for,\r\nand is set as the job's Customer User (owner/contact).","format":"int32","nullable":true},"dateDue":{"type":"string","description":"(optional) The date the Order is due. \r\nIf passed then the date is the requesting Due date for the order to be delivered by\r\nIf not passed OR date is before the earliest due date for the customer then the Job Due date is set to earliest possible due date for the customer","format":"date-time","nullable":true},"mustDate":{"type":"boolean","description":"only applicable if due date is specified. Indicates the Due date is a Must be met date"},"timeSensitive":{"type":"boolean","description":"Indicates whether this job is Time Sensitive which means that the DueDate will incorporate the default Due TIME of the day for the Due date"},"description":{"type":"string","description":"A description of the order","nullable":true},"deliveryAddress":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_DeliveryAddress"}],"description":"Delivery address information","nullable":true},"promocode":{"type":"string","description":"(Optional) Promo code - Must be a valid Promo code or Job will return a validation error","nullable":true},"items":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_JobLineBaseGrouping"},{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_JobLineBom"},{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_JobLineExternalGarment"},{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_JobLinePriceCode"},{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_JobLineStock"},{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_ReturnDtos_JobLineAsset"}],"description":"Abstract class for a basic Job Line"},"description":"A List of Items to add to the Job. Supports adding the inherited classes JobLineAsset, JobLinePriceCode, JobLineStock, JobLineBom \r\nItems will be added in the same order as this supplied list","nullable":true},"orderGroup":{"type":"string","description":"Shared identifier linking multiple jobs from one checkout (e.g. RO-1234567).\r\nNull for single-job orders.","nullable":true},"orderGroupSequence":{"type":"integer","description":"Position within the order group (1, 2, 3...).\r\nNull for single-job orders.","format":"int32","nullable":true},"validateOnly":{"type":"boolean","description":"Used in testing to Validate the data being passed without actually creating the Job itself"},"locationCodeOverride":{"type":"string","description":"(Optional) Override the customer's default factory location.\r\nWhen provided, the job is routed to this location instead of the customer's profile location.\r\nMust reference an active, non-virtual Location.Code (e.g., \"LA\", \"AT\", \"NZ\").\r\nWhen omitted or null, existing behaviour is unchanged.","nullable":true}},"additionalProperties":false,"description":"Job class to enable the creation of jobs from the web API"},"Codewolf_Ctrl_Common_Classes_Jobs_JobDto":{"type":"object","allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_JobBaseDto"}],"properties":{"shippingAddresses":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_ShippingAddress"},"description":"Holds the Shipping addresses and any tracking links","nullable":true},"lines":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_JobLineDto"},"description":"The Lines in the Job","nullable":true},"location":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_JobLocationDto"}],"description":"Location information for the job","nullable":true},"taxTotal":{"type":"number","description":"The total tax amount for all job lines","format":"double","nullable":true},"dateOut":{"type":"string","description":"The date the job was shipped/dispatched","format":"date-time","nullable":true},"dateIn":{"type":"string","description":"The date the job was created/entered","format":"date-time","nullable":true},"shippedDateStatus":{"type":"string","description":"A formatted status string indicating if the job was shipped early, on time, or late\r\n(e.g., \"1.35 Days Early\", \"On Time\", \"2 Days Late\")","nullable":true},"shippedDaysToProcess":{"type":"number","description":"The number of days the job was shipped early or late relative to the due date.\r\nNegative values indicate early shipment, positive values indicate late shipment.","format":"double","nullable":true},"processingDays":{"type":"number","description":"The number of days it took to process the job from creation to shipping","format":"double","nullable":true},"permissions":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_PermissionsDto"}],"description":"Edit permissions for this job","nullable":true},"isCancelable":{"type":"boolean","description":"Indicates whether the job can be cancelled via the API.\r\nThis is determined by the CanCancelCustomer flag on the job's current MasterJobStatus."},"invoiceFile":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_InvoiceFileDto"}],"description":"The downloadable invoice file for this job. Populated only when the job is\r\nDispatched or Closed AND an invoice PDF has been stored for it (Control\r\ngenerates and stores invoices; the API never generates them). Null otherwise.\r\nThe URI points at Control's public, time-limited CDN invoice endpoint.","nullable":true},"customerId":{"type":"integer","description":"Customer ID that owns this job. Hidden from JSON output (matches the\r\n`OwnerId` pattern on Codewolf.Ctrl.Common.Classes.Jobs.JobExtendedDto) — used at the\r\ncontroller layer for a strict customer-isolation re-check after the\r\nlegacy `(CustomerMismatch AND UserMismatch)` ownership check, to\r\ndefend against `OwnerId` collisions on retail rows.","format":"int32"}},"additionalProperties":false,"description":"The Job record"},"Codewolf_Ctrl_Common_Classes_Jobs_JobLineBase":{"required":["itemType"],"type":"object","properties":{"itemType":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_JobLineType"}],"description":"Which kind of line this is, and therefore what `code` must contain. `\"PriceCode\"` — a new print, `code` is a full price code from `GET /PriceCodes/price-codes`. `\"Asset\"` — a reorder, `code` is an asset tag from `GET /Assets`. `\"Stock\"` — stocked goods, `code` is a `stockCode` from `GET /Stock`. The schema does not enumerate these values; this list is the documentation."},"code":{"type":"string","description":"Identifies the item, in the form `itemType` selects: a full price-code string such as `WE_LC:Wearable-4\" x 4\"` (PriceCode), an asset tag such as `WE123456` (Asset), or a stock code such as `5000` (Stock). Passing the wrong form for the type is the most common cause of a rejected job.","nullable":true},"quantity":{"type":"integer","description":"How many to make. Ignored for `Stock` lines, which carry their run in `sizeQuantities` instead. Quantity drives which price band applies, so ordering the same design as two lines costs more than one line of the combined quantity.","format":"int32"},"customerReference":{"type":"string","description":"(optional except when creating PriceCodes) Customer Defined - can be anything to distinguish the Job Line item. e.g could be an internal ID value from the WebAPI consumers system <br />Required for Price codes as these will need to be used when uploading the artwork for the job line","nullable":true}},"additionalProperties":false,"description":"Abstract class for a basic Job Line","discriminator":{"propertyName":"itemType"}},"Codewolf_Ctrl_Common_Classes_Jobs_JobLineBaseGrouping":{"type":"object","allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_JobLineBase"}],"properties":{"groupHead":{"type":"string","description":"(optional) If this Line Item is to be a Grouping for other lines. Note this can contain any string value, but if specified in the head the children will use the same string value \r\nThis means that other Line items with this same value set in the Group field will be grouped under this item","nullable":true},"group":{"type":"string","description":"(optional) If this line is set it should match to the name of a Group Head on another line, and this will create the current line as a child line under the Group Head line (of the same group name)","nullable":true}},"additionalProperties":false},"Codewolf_Ctrl_Common_Classes_Jobs_JobLineBom":{"type":"object","allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_JobLineBase"}],"properties":{"size":{"type":"string","description":"The Size code for the BOM\r\nRequired if the BOM Code does NOT include a size indicator at the end of the code eg. BOM1234-M contains a size indicator of M for the BOM Code BOM1234\r\nIf you pass the size and a BOM Code containing the Size then they must be the same else they will get a validation error","nullable":true},"customName":{"type":"string","description":"(Optional) A customer-supplied personalisation name for this BOM item — e.g. a back name\r\ncaptured from a Shopify \"+ Add Name\" line-item property (CW-4580 Part 3). When present, the\r\nBOM explosion produces a per-name \"Names\" jobline (the name recorded in the comment) instead\r\nof the single aggregated names-component line. Absent/blank preserves the existing behaviour\r\nexactly — nothing is sent to `ConvertBOMToJob`.","nullable":true}},"additionalProperties":false,"description":"Defines a Line of a Job which uses a Bill of Material code to identify an entire process for creating an item"},"Codewolf_Ctrl_Common_Classes_Jobs_JobLineDto":{"type":"object","properties":{"jobLineId":{"type":"integer","description":"Unique Identifier for the Job Line","format":"int32"},"assetSku":{"type":"string","description":"The Program value assigned to the Job Line\r\nThis could be the Asset Code or a new Asset code created from a PriceCode","nullable":true},"processCode":{"type":"string","description":"The production process for this line. Values come from `GET /Lookups/process-codes`.","nullable":true},"garment":{"type":"string","description":"The garment to be used","nullable":true},"description":{"type":"string","description":"The description o the Job line","nullable":true},"comments":{"type":"string","description":"The Comments on the Job line","nullable":true},"quantity":{"type":"integer","description":"The quantity of this Job Line","format":"int32"},"unitPrice":{"type":"number","description":"The price of each unit","format":"double"},"customerReference":{"type":"string","description":"The Customers reference string","nullable":true},"imageUrl":{"type":"string","description":"CDN URL for the jobline image (asset or stock variant thumbnail)","nullable":true},"gang":{"type":"string","description":"Gets or sets the name of the gang associated with the entity.","nullable":true},"jobLineStatus":{"type":"string","description":"The line's current production status. ⚠️ Values come from `GET /Lookups/job-statuses`; do not hardcode them. (Upstream's own description of this field — \"the programmatic comment associated with this instance\" — is a copy-paste error and describes a comment field, not this one.)","nullable":true}},"additionalProperties":false,"description":"defines a Line of a Job"},"Codewolf_Ctrl_Common_Classes_Jobs_JobLineExternalGarment":{"type":"object","allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_JobLineBaseGrouping"}],"properties":{"sizeQuantities":{"type":"object","additionalProperties":{"type":"integer","format":"int32"},"description":"A list of size quantities for a stock item\r\nDictionary indexed via SizeCode","nullable":true},"garment":{"type":"string","description":"The Garment that will be sent in as an External Garment","nullable":true},"description":{"type":"string","description":"Any description for the JobLine","nullable":true},"quantity":{"type":"integer","description":"The quantity from the array of Size * Quantities list","format":"int32","readOnly":true}},"additionalProperties":false,"description":"Defines a new Job Line which uses an existing Stock item"},"Codewolf_Ctrl_Common_Classes_Jobs_JobLinePriceCode":{"type":"object","allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_JobLineBaseGrouping"}],"properties":{"attributes":{"type":"object","additionalProperties":{},"description":"The attributes associated with this brand\r\nEntered into Dictionary using the attribute name, and the associated value","nullable":true},"externalArtworkUrl":{"type":"string","description":"(Optional) If supplied this will be a URL to the Image file for this Price Code\r\nNOTE: If you specify an image URL then we will expect all priceCodes to supply image URL's","nullable":true},"externalId":{"type":"string","description":"(Optional) External identifier from third-party systems (e.g., BuildAGangSheet designId)\r\nUsed to link the asset back to the original external design for editing","nullable":true},"isSample":{"type":"boolean","description":"Gets or sets a value indicating whether this instance is marked as a sample.\r\nThis allows the job line to be identified as a sample item, and therefore bypass the normal quantity minimums"}},"additionalProperties":false,"description":"defines a Job line which is used with a Price Code in the system to define a new Job Asset"},"Codewolf_Ctrl_Common_Classes_Jobs_JobLineStock":{"type":"object","allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_JobLineBaseGrouping"}],"properties":{"variantCode":{"type":"string","description":"a variant code which can also identify the Stock item","nullable":true},"sizeQuantities":{"type":"object","additionalProperties":{"type":"integer","format":"int32"},"description":"A list of size quantities for a stock item\r\nDictionary indexed via SizeCode","nullable":true},"quantity":{"type":"integer","description":"The quantity from the array of Size * Quantities list","format":"int32","readOnly":true}},"additionalProperties":false,"description":"Defines a new Job Line which uses an existing Stock item"},"Codewolf_Ctrl_Common_Classes_Jobs_JobLineType":{"enum":["Asset","PriceCode","Stock","Bom","ExternalGarment"],"type":"string","description":"Job Line Type - used to load the different line types into the Create Job Web API"},"Codewolf_Ctrl_Common_Classes_Jobs_JobLocationDto":{"type":"object","properties":{"name":{"type":"string","description":"The name of the location","nullable":true},"timezone":{"type":"string","description":"The timezone of the location (Time zone identifier in IANA TZ database format)","nullable":true}},"additionalProperties":false,"description":"Location information for a job"},"Codewolf_Ctrl_Common_Classes_Jobs_JobStatusDto":{"type":"object","properties":{"id":{"type":"integer","description":"MasterJobStatusID","format":"int32"},"name":{"type":"string","description":"Name","nullable":true}},"additionalProperties":false,"description":"Configuration for a single supported job status"},"Codewolf_Ctrl_Common_Classes_Jobs_PermissionsDto":{"type":"object","properties":{"canEdit":{"type":"boolean","description":"Whether `PATCH /Jobs/{jobNumber}` will be accepted for this job. Read it before amending rather than catching the rejection: a job locks once it is dispatched, closed, returned or cancelled."},"lockedReason":{"type":"string","description":"Why editing is locked, when `canEdit` is false. Null while the job is still editable.","nullable":true}},"additionalProperties":false,"description":"DTO for edit permissions information"},"Codewolf_Ctrl_Common_Classes_Jobs_ReturnDtos_ActiveJobDto":{"type":"object","properties":{"permissions":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_PermissionsDto"}],"description":"Edit permissions for this job based on its status.","nullable":true},"jobNumber":{"type":"integer","description":"The unique identifier for the job.","format":"int32"},"masterJobStatus":{"type":"string","description":"The job's current status. ⚠️ Read the full set from `GET /Lookups/job-statuses` rather than matching strings you have seen before — statuses are added over time, and an unrecognised one must never break your integration.","nullable":true},"originCode":{"type":"string","description":"The origin code indicating where the job originated from.","nullable":true},"description":{"type":"string","description":"A brief description of the job.","nullable":true},"mustDate":{"type":"boolean","description":"Indicates whether the job has a strict deadline that must be met."},"dateDue":{"type":"string","description":"The date the job is due to be completed.","format":"date-time","nullable":true},"dateOut":{"type":"string","description":"The date the job was shipped or dispatched.","format":"date-time","nullable":true},"shippedDaysToProcess":{"type":"number","description":"The number of days the job was shipped early or late relative to the due date.\r\nNegative values indicate early shipment, positive values indicate late shipment.","format":"double","nullable":true},"orderNumber":{"type":"string","description":"Order number reference","nullable":true},"orderGroup":{"type":"string","description":"Shared identifier linking multiple jobs from one checkout (e.g. RO-1234567).\r\nNull for single-job orders.","nullable":true},"orderGroupSequence":{"type":"integer","description":"Position within the order group (1, 2, 3...).\r\nNull for single-job orders.","format":"int32","nullable":true},"tracking":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_ReturnDtos_TrackingItemDto"},"description":"Tracking information for this job's shipments.\r\nEach entry represents one shipment with its tracking number and optional tracking link.\r\nEmpty list if no tracking data is available.","nullable":true}},"additionalProperties":false,"description":"Represents an active job with essential tracking and status information."},"Codewolf_Ctrl_Common_Classes_Jobs_ReturnDtos_CreateJobReturnDto":{"type":"object","properties":{"jobNumber":{"type":"integer","description":"The new Job number created for the Job","format":"int32","readOnly":true},"location":{"type":"string","description":"indicates the location that the job will be manufactured","nullable":true},"dateDue":{"type":"string","description":"The DueDate. Either the passed DueDate or Calculated due date if requested was earlier than possible\r\nNOTE: that this will always be the date and/or time in the locations timezone","nullable":true,"readOnly":true},"jobLineDetails":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_ReturnDtos_JobLineReturnDto"},{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_ReturnDtos_JobLinePriceCodeReturnDto"}],"description":"Base class returned as an array of items - holds the return information for each Job line\r\nNOTE: Create either a JobItemPriceCodeReturnDto object or one of these which doesn't extend the basic data in here"},"description":"A list of unique key values passed in as part of the CreateJob Item - these should only include job items that require new artwork to be uploaded","nullable":true,"readOnly":true},"totalJobCost":{"type":"number","description":"Total Job Cost","format":"double"},"expectingArtworkToBeUploaded":{"type":"boolean","description":"Indicates to the WebApi User whether this newly created Job is expecting Artwork for any of the lines in the Job Itself","readOnly":true}},"additionalProperties":false,"description":"Returns the information from a successful Job Creation to the caller"},"Codewolf_Ctrl_Common_Classes_Jobs_ReturnDtos_CreateShopJobReturnDto":{"type":"object","allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_ReturnDtos_CreateJobReturnDto"}],"properties":{"customerId":{"type":"integer","description":"The Customer Id for this shopify user","format":"int32"},"userId":{"type":"integer","description":"The User Id for this shopify user","format":"int32"}},"additionalProperties":false,"description":"Returns the information from a successful Job Creation to the caller"},"Codewolf_Ctrl_Common_Classes_Jobs_ReturnDtos_JobLineAsset":{"type":"object","allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_JobLineBaseGrouping"}],"properties":{"garment":{"type":"string","description":"(optional) Garment","nullable":true},"comment":{"type":"string","description":"Any Comment","nullable":true}},"additionalProperties":false,"description":"Create a Job Line Item which uses an existing Asset in the system. Identified via the Asset Code (Code property)"},"Codewolf_Ctrl_Common_Classes_Jobs_ReturnDtos_JobLinePriceCodeReturnDto":{"type":"object","allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_ReturnDtos_JobLineReturnDto"}],"properties":{"newAssetSku":{"type":"string","description":"The associated AssetSKU associated with the job line \r\nShows the new AssetTag code if the JobLine used a Price Code","nullable":true},"jobLineLabelUrl":{"type":"string","description":"If this is an external supplier order, this will contain the link to the jobline label","nullable":true}},"additionalProperties":false,"description":"The Job line information returned to the WEBAPI caller from the Create Job call"},"Codewolf_Ctrl_Common_Classes_Jobs_ReturnDtos_JobLineReturnDto":{"type":"object","properties":{"needsArtworkToBeUploaded":{"type":"boolean","description":"indicates whether artwork NEEDS to be uploaded for this item"},"customerReference":{"type":"string","description":"The customer reference Id value that is passed on new PriceCode lines and passed back when new Artwork is needed to be uploaded for the line","nullable":true},"quantity":{"type":"integer","description":"the unit cost of the job line (priced based on customer price tier etc.)","format":"int32"}},"additionalProperties":false,"description":"Base class returned as an array of items - holds the return information for each Job line\r\nNOTE: Create either a JobItemPriceCodeReturnDto object or one of these which doesn't extend the basic data in here"},"Codewolf_Ctrl_Common_Classes_Jobs_ReturnDtos_TrackingItemDto":{"type":"object","properties":{"trackingNumber":{"type":"string","description":"The carrier tracking number for this shipment.","nullable":true},"trackingLink":{"type":"string","description":"The URL to track this shipment on the carrier's website.\r\nMay be null if the carrier does not provide a tracking link.","nullable":true}},"additionalProperties":false,"description":"Represents a single tracking entry for a job shipment.\r\nContains the tracking number and optional tracking link URL."},"Codewolf_Ctrl_Common_Classes_Jobs_ShippingAddress":{"type":"object","allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_DeliveryBaseAddress"}],"properties":{"trackingLink":{"type":"string","description":"A Tracking link - if one has been allocated","nullable":true},"trackingNumber":{"type":"string","description":"The Tracking number associated to the Shipping address (for the service)","nullable":true}},"additionalProperties":false,"description":"Simplified address class for use in api for entering initial job delivery address."},"Codewolf_Ctrl_Common_Classes_Jobs_ShopJobs_DiscountTargetEnum":{"enum":["Item","Shipping"],"type":"string"},"Codewolf_Ctrl_Common_Classes_Jobs_ShopJobs_DiscountTargetValueEnum":{"enum":["Percentage","FixedValue"],"type":"string"},"Codewolf_Ctrl_Common_Classes_Jobs_ShopJobs_ShopDiscount":{"type":"object","properties":{"name":{"type":"string","description":"The name for Discount - may be either the discount title or the dicount code","nullable":true},"target":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_ShopJobs_DiscountTargetEnum"}],"description":"The target for the discount, shipping or Items"},"value":{"type":"number","description":"The discount Value - as a money value","format":"double"},"targetValue":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_ShopJobs_DiscountTargetValueEnum"}],"description":"the type of value, either a percentage or a fixed value"},"isDiscountCode":{"type":"boolean","description":"Indicates whether this is a discount code or not"}},"additionalProperties":false,"description":"represents a discount application"},"Codewolf_Ctrl_Common_Classes_Jobs_ShopJobs_ShopJobCandidate":{"type":"object","allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_ShopifyJobs_CustomerShopJobCandidate"}],"properties":{"itemsTotal":{"type":"number","description":"Total value of the Items","format":"double"},"taxTotal":{"type":"number","description":"Total amount of the Tax charged","format":"double"},"taxLines":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_TaxLine"},"description":"The TAX lines as divided up and included in the Tax amount","nullable":true},"totalAmount":{"type":"number","description":"The total Amount of the Order","format":"double"},"shippingTotal":{"type":"number","description":"The total amount of shipping paid","format":"double"},"shippingType":{"type":"string","description":"Type of shipping","nullable":true},"paymentType":{"type":"array","items":{"type":"string"},"description":"How was the order paid for - may list multiple sources","nullable":true},"discounts":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_ShopJobs_ShopDiscount"},"description":"Any discount codes that contributed to the price","nullable":true},"userDetails":{"allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_ShopJobs_ShopUserDetails"}],"description":"The Shopify users details (see if we need to create the user at the same time as the Job)\r\n(Optional) - only passed if we need to create the customer and user for the Shopify user","nullable":true},"customerId":{"type":"integer","description":"The customer Id passed in if we know the customer/user has already been created","format":"int32","nullable":true},"userId":{"type":"integer","description":"The user Id passed in if we know the customer/user has already been created","format":"int32","nullable":true}},"additionalProperties":false,"description":"Create Job Candidate for Shop information \r\nExtends the Job Candidate object to include the prices/taxes paid"},"Codewolf_Ctrl_Common_Classes_Jobs_ShopJobs_ShopUserDetails":{"type":"object","allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_UserDetails"}],"properties":{"shopUserId":{"type":"integer","format":"int64","description":"Identifier of the shopper in the originating storefront."},"bypassCustomerMatch":{"type":"boolean","description":"indicates whether to bypass the customer match checks \r\nthis is normally set from the Shopify Admin app once an admin user has decided to create the Customer even though there was a previous customer match"}},"additionalProperties":false},"Codewolf_Ctrl_Common_Classes_Jobs_ShopifyJobs_CustomerShopJobCandidate":{"type":"object","allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_JobCandidate"}],"properties":{"shopName":{"type":"string","description":"The Shop Name\r\nThis is the shop name for the link of the order","nullable":true},"shopOrderName":{"type":"string","description":"The Shopify Order Name","nullable":true},"shopOrderId":{"type":"string","description":"The Shop Order Id\r\nThis is different from the JobCandidate.OrderNumber\r\nThis is the BigInt order id for the shop","nullable":true},"currencyCode":{"type":"string","description":"The paid currency","nullable":true}},"additionalProperties":false},"Codewolf_Ctrl_Common_Classes_Jobs_TaxLine":{"type":"object","properties":{"title":{"type":"string","description":"The type of tax collected","nullable":true},"rate":{"type":"number","description":"the rate for the tax collected","format":"double"},"price":{"type":"number","description":"the tax collected for this type","format":"double"}},"additionalProperties":false},"Codewolf_Ctrl_Common_Classes_Jobs_UserDetails":{"type":"object","properties":{"email":{"type":"string","nullable":true,"description":"Email address for order correspondence about this job."},"firstName":{"type":"string","nullable":true,"description":"Given name of the person the job is for."},"lastName":{"type":"string","nullable":true,"description":"Family name of the person the job is for."},"name":{"type":"string","nullable":true,"description":"Full display name, where supplied instead of the separate name parts."},"phone":{"type":"string","nullable":true,"description":"Contact phone number for queries about the job."},"userAddress":{"oneOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_BaseAddress"},{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_DeliveryAddress"},{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_DeliveryBaseAddress"},{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Jobs_ShippingAddress"}],"nullable":true,"description":"Address associated with the person, where one was supplied."}},"additionalProperties":false},"Codewolf_Ctrl_Common_Classes_Pricing_PriceCodeDto":{"type":"object","properties":{"priceCode":{"type":"string","description":"The price code itself — pass this verbatim as a job line `code` when `itemType` is `\"PriceCode\"`. ⚠️ The size inside the string (`…-4\" x 4\"`) is part of the code's NAME, not a measurement. Never parse it to compute artwork dimensions; read `sizeWidth`/`sizeHeight`/`sizeUnit` instead.","nullable":true},"description":{"type":"string","description":"price code description","nullable":true},"categoryCode":{"type":"string","description":"The Category Code that the PriceCode belongs to","nullable":true},"categoryName":{"type":"string","description":"The Category Name that the PriceCode belongs to","nullable":true},"name":{"type":"string","description":"The name of the item for this Price Code","nullable":true},"processCode":{"type":"string","description":"The Process Code for the Price code","nullable":true},"masterProcessCode":{"type":"string","description":"The Master Process Code for the Price code - this maps to the Asset Type code","nullable":true},"minimumQuantity":{"type":"integer","description":"The fewest units this code can be ordered in. A job line below it is rejected.","format":"int32"},"externalSupplier":{"type":"string","description":"Indicates that this PriceCode is supplied Externally","nullable":true},"externalPriceCode":{"type":"string","description":"The External Price Code for the Price Code","nullable":true},"hasMetaDataAttributes":{"type":"boolean","description":"If a Price code has Meta data properties then it requires the metadata items sent in to get Pricing for a price Code \r\nSo is NOT supplied in the GET all call"},"standardSetup":{"type":"number","description":"The cost to setup for this asset job ($) - if outputs as NULL then the Setup DOES NOT APPLY","format":"double","nullable":true},"standardReset":{"type":"number","description":"The reset cost to for this asset job ($) - if outputs as NULL then the Setup DOES NOT APPLY","format":"double","nullable":true},"sampleAvailable":{"type":"boolean","description":"Gets or sets a value indicating whether the same resource is available for use."},"samplePrice":{"type":"number","description":"Sample value that outputs conditionally based on ShouldSerializeSample - if outputs as NULL then the Sample IS NOT AVAILABLE, and will be removed as a return field","format":"double","nullable":true},"sampleLabel":{"type":"string","description":"Gets or sets the label associated with the sample - if outputs as NULL then the Sample IS NOT AVAILABLE, and will be removed as a return field","nullable":true},"sizeUnit":{"type":"string","description":"Unit of measure for the Category Unit size (cm / in / mm)","nullable":true},"sizeWidth":{"type":"number","description":"The width of the Category Unit in Codewolf.Ctrl.Common.Classes.Pricing.PriceCodeDto.SizeUnit","format":"double","nullable":true},"sizeHeight":{"type":"number","description":"The height of the Category Unit in Codewolf.Ctrl.Common.Classes.Pricing.PriceCodeDto.SizeUnit","format":"double","nullable":true},"attributes":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Pricing_ProcessAttribute"},{"$ref":"#/components/schemas/ProcessNumericAttributeOf1T"},{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Pricing_ProcessTextAttribute"}],"description":"Process Attribute base\r\nType identifies the type of attribute"},"description":"Any attributes available for the Price code (note: some may be required when being used)","nullable":true},"priceBands":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Interfaces_IPriceBandDto"},"description":"The quantity-break ladder at YOUR account's tier. Prices are per-tier, so never cache them across accounts or show them to another customer.","nullable":true}},"additionalProperties":false,"description":"Defines a Price Code that can be used to create new Jobs"},"Codewolf_Ctrl_Common_Classes_Pricing_ProcessAttribute":{"type":"object","properties":{"name":{"type":"string","description":"Name of the attribute - use this to pass values back for an attribute","nullable":true},"type":{"type":"string","description":"Type of the attribute - text, int, decimal, select\r\n<list type=\"bullet\"><item><term>text</term><description>defines a text based attribute (with minLength and maxLength values)</description></item><item><term>int</term><description>defines a integer numeric based attribute (with min and max values)</description></item><item><term>decimal</term><description>defines a decimal numeric based attribute (with min and max values), supports all numbers</description></item><item><term>select</term><description>defines a select list of potential Enumerable text/value pairs</description></item></list>","nullable":true},"label":{"type":"string","description":"Label - this would be used to show a label  for a screen field","nullable":true},"description":{"type":"string","description":"Description of the attribute","nullable":true},"required":{"type":"boolean","description":"Indicates the attribute value MUST be passed"},"isMetaDataAttribute":{"type":"boolean","description":"Indicates that this attribute is a MetaData attribute which affects the Pricing matrix for this Price Code"},"enumerableValues":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"description":{"type":"string"}}},"nullable":true,"description":"The permitted values when this attribute is a choice. Read them from here rather than hardcoding — they change per account and per process."},"assetAttributeName":{"type":"string","description":"Determines that the element must be saved to the AssetAttribute if provided","nullable":true}},"additionalProperties":false,"description":"Process Attribute base\r\nType identifies the type of attribute"},"Codewolf_Ctrl_Common_Classes_Pricing_ProcessTextAttribute":{"type":"object","allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Pricing_ProcessAttribute"}],"properties":{"minLength":{"type":"integer","description":"Min length of string","format":"int32"},"maxLength":{"type":"integer","description":"max length of string","format":"int32"}},"additionalProperties":false,"description":"Text attribute for Process"},"Codewolf_Ctrl_Common_Classes_Stocks_StockDto":{"type":"object","properties":{"supplier":{"type":"string","description":"Stock Supplier","nullable":true},"categoryName":{"type":"string","description":"Stock Category","nullable":true},"categoryUnitId":{"type":"string","description":"Stock Category Unit ID (for Pricing)","nullable":true},"stockItemId":{"type":"integer","description":"Internal StockItemId used to enrich list responses with per-item data\r\n(e.g. markets from StockItemShipping). Never serialised to API consumers.","format":"int32"},"stockCode":{"type":"string","description":"The code which identifies the Stock","nullable":true},"processCode":{"type":"string","description":"the Process Code","nullable":true,"readOnly":true},"stockName":{"type":"string","description":"Stock name","nullable":true},"stockDescription":{"type":"string","description":"Gets or sets the description of the stock item.","nullable":true},"stockSpecifications":{"type":"string","description":"Gets or sets the specifications for the stock item.","nullable":true},"priceCompatibleLookupCode":{"type":"string","description":"The Price Compatible Lookup Code","nullable":true},"rank":{"type":"integer","description":"Gets or sets the rank or position associated with the current instance.","format":"int32"},"stockVariants":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Stocks_StockVariantDto"},"description":"The stock Variants as a list","nullable":true},"stockImageUrl":{"type":"string","description":"Gets or sets the URL or file path of the hero stock image associated with the item.\r\nBackwards compatible field — mirrors `Images[0]?.Url` when the gallery is\r\nnon-empty.","nullable":true},"images":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Stocks_StockImageDto"},"description":"CW-4346: ordered gallery of images for this stock item. Index 0 is the hero\r\n(matches Codewolf.Ctrl.Common.Classes.Stocks.StockDto.StockImageUrl); subsequent entries are additional gallery\r\nimages. Empty list when the stock item has no images. Always serialised.","nullable":true},"showAvailableStock":{"type":"boolean","description":"Gets or sets a value indicating whether the available stock should be displayed to users."},"shippingConfigs":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Stocks_StockItemShippingSummary"},"description":"Per-market shipping configurations for this stock item.\r\nOnly populated on single stock item endpoint (GET /stock/{code}).","nullable":true},"markets":{"type":"array","items":{"type":"string"},"description":"Distinct union of markets (ISO country codes) drawn from this item's active\r\nshipping configurations. An empty array means the item has no active shipping\r\nconfiguration and should be hidden from all locale-filtered catalogues\r\n(fail-closed). Always serialised.","nullable":true},"badges":{"type":"array","items":{"type":"string"},"description":"Short display badges rendered as pills on the product card\r\n(e.g. \"Free shipping\", \"No minimums\", \"Ground only\").\r\nOrder is preserved. Always serialised as an array — consumers\r\ncan rely on the field being present (empty array means no badges).","nullable":true},"slug":{"type":"string","description":"URL-friendly slug for the stock item, used to form canonical\r\nproduct URLs in consuming storefronts (e.g. /products/{slug}).\r\nLowercase, alphanumerics and hyphens only, globally unique across\r\nactive non-deleted stock items.","nullable":true},"seoTitle":{"type":"string","description":"Optional override for the HTML <title> tag on the storefront\r\nproduct page. Falls back to the default title if null or empty.","nullable":true},"seoDescription":{"type":"string","description":"Optional override for the HTML meta description on the storefront\r\nproduct page. Falls back to the default description if null or empty.","nullable":true},"priceBands":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Interfaces_IPriceBandDto"},"nullable":true,"description":"Quantity-break pricing for this stocked item, at your account's tier."}},"additionalProperties":false,"description":"Information about an available Stock"},"Codewolf_Ctrl_Common_Classes_Stocks_StockImageDto":{"type":"object","properties":{"url":{"type":"string","description":"CDN URL of the image. Use this directly for both rendering and linking.","nullable":true},"name":{"type":"string","description":"Optional display name for captions / lightbox titles. May be null.","nullable":true},"altText":{"type":"string","description":"Optional alt text for accessibility. May be null. Consumers should\r\nfall back to a sensible default (e.g. the stock name) when absent.","nullable":true}},"additionalProperties":false,"description":"CW-4346: a single image in a stock item's ordered gallery. Index 0 in\r\nCodewolf.Ctrl.Common.Classes.Stocks.StockDto.Images is the hero (the storefront hero CDN URL,\r\n`StockDto.StockImageUrl`, mirrors that entry's Codewolf.Ctrl.Common.Classes.Stocks.StockImageDto.Url)."},"Codewolf_Ctrl_Common_Classes_Stocks_StockItemShipmentTypeOptionSummary":{"type":"object","properties":{"code":{"type":"string","nullable":true,"description":"Shipment type code, as sent on a job."},"name":{"type":"string","nullable":true,"description":"Short display abbreviation for the shipment type."},"price":{"type":"number","format":"double","nullable":true,"description":"Charge for this shipment type, in the account's currency."}},"additionalProperties":false,"description":"Lightweight shipment-type option summary for StockItemShippingSummary.\r\nMirrors the API-layer DTO shape: per-method override of shipment type availability and price."},"Codewolf_Ctrl_Common_Classes_Stocks_StockItemShippingLocationSummary":{"type":"object","properties":{"locationCode":{"type":"string","nullable":true,"description":"Short code for the fulfilment location."},"locationName":{"type":"string","nullable":true,"description":"Human-readable name of the fulfilment location."},"locale":{"type":"string","nullable":true,"description":"The region the location sits in."}},"additionalProperties":false,"description":"Lightweight fulfilment location summary for StockItemShippingSummary."},"Codewolf_Ctrl_Common_Classes_Stocks_StockItemShippingSummary":{"type":"object","properties":{"id":{"type":"integer","format":"int32","description":"Identifier for this shipping configuration row."},"markets":{"type":"array","items":{"type":"string"},"nullable":true,"description":"Market codes this configuration applies in."},"shipMode":{"type":"string","nullable":true,"description":"How the item ships — bundled with the order, or as its own consignment."},"weight":{"type":"number","format":"double","nullable":true,"description":"Shipping weight, in `weightUnit`."},"weightUnit":{"type":"string","nullable":true,"description":"Unit for `weight` — `kg` or `lb`."},"length":{"type":"number","format":"double","nullable":true,"description":"Package length, in `dimensionUnit`."},"width":{"type":"number","format":"double","nullable":true,"description":"Package width, in `dimensionUnit`."},"height":{"type":"number","format":"double","nullable":true,"description":"Package height, in `dimensionUnit`."},"dimensionUnit":{"type":"string","nullable":true,"description":"Unit for `length`, `width` and `height` — `cm` or `in`."},"fixedShipping":{"type":"number","format":"double","nullable":true,"description":"A flat shipping charge replacing live rating. Null means rate normally."},"groundOnly":{"type":"boolean","description":"True when the item cannot travel by air."},"estimatedLeadDays":{"type":"integer","format":"int32","nullable":true,"description":"Working days to expect before despatch."},"fulfilmentLocations":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Stocks_StockItemShippingLocationSummary"},"nullable":true,"description":"The warehouses this item can ship from."},"shipmentTypeOptions":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Stocks_StockItemShipmentTypeOptionSummary"},"description":"Per-shipment-method overrides for this stock item's shipping entry. Each option's\r\n`price` is null/absent when the rate-API price should be used, `0` for a\r\nfree override on this method, or positive for a flat override amount.","nullable":true}},"additionalProperties":false,"description":"Lightweight shipping configuration summary for inclusion in StockDto responses.\r\nContains only the fields needed for the GET /stock/{code} enrichment."},"Codewolf_Ctrl_Common_Classes_Stocks_StockVariantDto":{"type":"object","properties":{"variantCode":{"type":"string","description":"The unique identifier for the Stock Variant","nullable":true},"colour":{"type":"string","description":"The Stock Variant Colour","nullable":true},"variantImageUrl":{"type":"string","description":"Gets or sets the URL of the image associated with the product variant.","nullable":true},"numberOfSizes":{"type":"integer","description":"The number of sizes available for this variant","format":"int32"},"sizesCsv":{"type":"string","description":"Gets or sets a comma-separated list of sizes.","nullable":true}},"additionalProperties":false,"description":"A Colour variant of a stock item"},"Codewolf_Ctrl_Common_Enums_ActiveJobSortColumn":{"enum":["JobNumber","DateIn","DateDue","DateOut","OrderGroupSequence"],"type":"string"},"Codewolf_Ctrl_Common_Enums_AssetSortColumn":{"enum":["AssetId","AssetTag","PriceCode","CreateDate"],"type":"string"},"Codewolf_Ctrl_Common_Enums_FileStatus":{"enum":["Active","Archived","Deleted"],"type":"string"},"Codewolf_Ctrl_Common_Enums_SortDirection":{"enum":["Ascending","Descending"],"type":"string"},"Codewolf_Ctrl_Common_Enums_StockSortColumn":{"enum":["StockCode","StockName","PriceCompatibleLookupCode"],"type":"string"},"Codewolf_Ctrl_Common_Enums_VariantSortColumn":{"enum":["VariantCode","Colour"],"type":"string"},"Codewolf_Ctrl_Common_Interfaces_IDeliveryOption":{"type":"object","properties":{"code":{"type":"string","nullable":true,"description":"The delivery method code. This is the value to send as `deliveryAddress.deliveryMethod` on `POST /Jobs`."},"label":{"type":"string","nullable":true,"description":"Short display abbreviation, e.g. `GND`. For your UI; do not send it back."},"isCollection":{"type":"boolean","description":"True when the customer collects from the factory rather than the order being shipped. A collection method needs no courier address."},"rank":{"type":"integer","format":"int32","description":"Display order for a normal job. Lower sorts first."},"gangRank":{"type":"integer","format":"int32","description":"Display order when the job is a gang sheet, which can differ from `rank`."},"value":{"type":"string","nullable":true,"description":"The same value as `code`, provided for form bindings."},"deliveryLabelEnabled":{"type":"boolean","description":"Whether a delivery label can be produced for this method."}},"additionalProperties":false},"Codewolf_Ctrl_Common_Interfaces_IPriceBandDto":{"type":"object","properties":{"from":{"type":"integer","format":"int32","description":"Lowest quantity this band applies to, inclusive."},"to":{"type":"integer","format":"int32","nullable":true,"description":"Highest quantity this band applies to, inclusive. Null on the top band, which has no upper limit."},"unitPrice":{"type":"number","format":"double","description":"Price per unit within this band, in the account's currency. ⚠️ Per-tier: this is your account's price, not a list price."}},"additionalProperties":false},"HttpValidationProblemDetails":{"type":"object","allOf":[{"$ref":"#/components/schemas/ProblemDetails"}],"properties":{"errors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}},"nullable":true,"description":"Validation failures keyed by the field that caused them, each with one or more messages. Read this rather than the top-level `detail` when the status is 400."}},"additionalProperties":{}},"PagedDataOf1Codewolf_Ctrl_Api_Dto_Api_AccountUserSummary":{"type":"object","properties":{"pageSize":{"type":"integer","format":"int32","description":"How many records one page can hold — the size requested, not the number returned."},"returnedResults":{"type":"integer","format":"int32","readOnly":true,"description":"How many records this page actually contains. Lower than `pageSize` on the last page."},"totalResults":{"type":"integer","format":"int32","description":"How many records match across every page. Use this for \"N results\", not the page length."},"totalPages":{"type":"integer","format":"int32","description":"How many pages the full result set spans at the current `pageSize`."},"currentPage":{"type":"integer","format":"int32","description":"Which page this is. One-based — the first page is 1, not 0."},"hasNext":{"type":"boolean","description":"Whether another page follows. Prefer this over comparing page numbers yourself."},"hasPrevious":{"type":"boolean","description":"Whether a page precedes this one."},"filter":{"type":"string","nullable":true,"description":"The filter applied to produce this result set, echoed back. Null when unfiltered."},"nextUrl":{"type":"string","nullable":true,"description":"Ready-made URL for the next page. Follow it rather than assembling your own — it carries the filter and page size already. Null on the last page."},"previousUrl":{"type":"string","nullable":true,"description":"Ready-made URL for the previous page. Null on the first page."},"entities":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dto_Api_AccountUserSummary"},"nullable":true,"description":"The records themselves. Everything else on this object describes the page, not the data."}},"additionalProperties":false},"PagedDataOf1Codewolf_Ctrl_Api_Dto_Api_PaymentTransaction":{"type":"object","properties":{"pageSize":{"type":"integer","format":"int32","description":"How many records one page can hold — the size requested, not the number returned."},"returnedResults":{"type":"integer","format":"int32","readOnly":true,"description":"How many records this page actually contains. Lower than `pageSize` on the last page."},"totalResults":{"type":"integer","format":"int32","description":"How many records match across every page. Use this for \"N results\", not the page length."},"totalPages":{"type":"integer","format":"int32","description":"How many pages the full result set spans at the current `pageSize`."},"currentPage":{"type":"integer","format":"int32","description":"Which page this is. One-based — the first page is 1, not 0."},"hasNext":{"type":"boolean","description":"Whether another page follows. Prefer this over comparing page numbers yourself."},"hasPrevious":{"type":"boolean","description":"Whether a page precedes this one."},"filter":{"type":"string","nullable":true,"description":"The filter applied to produce this result set, echoed back. Null when unfiltered."},"nextUrl":{"type":"string","nullable":true,"description":"Ready-made URL for the next page. Follow it rather than assembling your own — it carries the filter and page size already. Null on the last page."},"previousUrl":{"type":"string","nullable":true,"description":"Ready-made URL for the previous page. Null on the first page."},"entities":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dto_Api_PaymentTransaction"},"nullable":true,"description":"The records themselves. Everything else on this object describes the page, not the data."}},"additionalProperties":false},"PagedDataOf1Codewolf_Ctrl_Api_Dtos_Api_AssetListDto":{"type":"object","properties":{"pageSize":{"type":"integer","format":"int32","description":"How many records one page can hold — the size requested, not the number returned."},"returnedResults":{"type":"integer","format":"int32","readOnly":true,"description":"How many records this page actually contains. Lower than `pageSize` on the last page."},"totalResults":{"type":"integer","format":"int32","description":"How many records match across every page. Use this for \"N results\", not the page length."},"totalPages":{"type":"integer","format":"int32","description":"How many pages the full result set spans at the current `pageSize`."},"currentPage":{"type":"integer","format":"int32","description":"Which page this is. One-based — the first page is 1, not 0."},"hasNext":{"type":"boolean","description":"Whether another page follows. Prefer this over comparing page numbers yourself."},"hasPrevious":{"type":"boolean","description":"Whether a page precedes this one."},"filter":{"type":"string","nullable":true,"description":"The filter applied to produce this result set, echoed back. Null when unfiltered."},"nextUrl":{"type":"string","nullable":true,"description":"Ready-made URL for the next page. Follow it rather than assembling your own — it carries the filter and page size already. Null on the last page."},"previousUrl":{"type":"string","nullable":true,"description":"Ready-made URL for the previous page. Null on the first page."},"entities":{"type":"array","items":{"$ref":"#/components/schemas/Codewolf_Ctrl_Api_Dtos_Api_AssetListDto"},"nullable":true,"description":"The records themselves. Everything else on this object describes the page, not the data."}},"additionalProperties":false},"ProblemDetails":{"type":"object","properties":{"type":{"type":"string","nullable":true,"description":"URI identifying the problem type (RFC 7807). Stable enough to branch on; the human-readable part is `title`."},"title":{"type":"string","nullable":true,"description":"Short summary of the problem, the same for every occurrence of this type."},"status":{"type":"integer","format":"int32","nullable":true,"description":"The HTTP status code, repeated in the body so it survives logging."},"detail":{"type":"string","nullable":true,"description":"What went wrong on THIS request. The most useful field for a human reading a failure."},"instance":{"type":"string","nullable":true,"description":"The path that produced the problem."}},"additionalProperties":{}},"ProcessNumericAttributeOf1T":{"type":"object","allOf":[{"$ref":"#/components/schemas/Codewolf_Ctrl_Common_Classes_Pricing_ProcessAttribute"}],"properties":{"minValue":{"allOf":[{"$ref":"#/components/schemas/T"}],"description":"Minimum value for number","nullable":true},"maxValue":{"allOf":[{"$ref":"#/components/schemas/T"}],"description":"max number for number value","nullable":true}},"additionalProperties":false,"description":"Text attribute for Process"},"T":{"type":"object","additionalProperties":false}},"securitySchemes":{"oauth2":{"type":"oauth2","description":"OAuth2 client credentials against THIS region's token endpoint. Credentials belong to exactly one region and only work here.","flows":{"clientCredentials":{"tokenUrl":"https://api.supacolour.co.uk/api/auth/token","scopes":{}}}},"Bearer":{"type":"apiKey","description":"JWT Authorization header using the Bearer scheme.\n                      Enter 'Bearer' [space] and then your token in the text input below.\n                      Example: 'Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...'","name":"Authorization","in":"header"}}},"security":[{"oauth2":[]},{"Bearer":[]}],"tags":[{"name":"PriceCodes","description":"What your account can order and what it costs. The first call in any integration — process availability and pricing are per-account, so never hardcode them."},{"name":"Jobs","description":"Orders. Create a job, attach artwork, then track to despatch. `validateOnly: true` dry-runs a payload so you can build without creating real jobs."},{"name":"Assets","description":"Prints you have made before. Reorder by asset tag — no artwork upload, no colour re-approval."},{"name":"Account","description":"Your account: address, users, tax certificates, transactions. `GET /account` confirms which account a set of credentials belongs to."},{"name":"Lookups","description":"Reference data — countries, states, job statuses, process codes, size sets. Read these instead of hardcoding values that change."},{"name":"Stock","description":"Stocked items — heat presses and supplies — and their shipping options."},{"name":"PromoCodes","description":"Validate a promotional code before applying it to a job."},{"name":"StockItemShipping","description":"Shipping options for stocked items, by stock item and market."}],"servers":[{"url":"https://api.supacolour.co.uk","description":"United Kingdom"}]}