Submit orders, track production, search products, and check inventory — through the REST API or MCP. Everything you need to integrate, in one place.
The Turbine API v3 — order submission, status, designs, SKUs, stock and shipping rates. Also available as an OpenAPI / Swagger spec.
Welcome to the Turbine API documentation. If you have any questions please contact: admin@240tech.com
This API supports JSON for requests and responses.
Everything you need to make your first request is on the Settings → API Integration page in Turbine. Log in and go to Settings → APIs, or open https://turbine-app.240tech.com/settings/apis directly.
That page gives you:
https://turbine-app.240tech.com/api/v3/).Authorization header on every request.account_id value sent in the body of a new order.account_zip value sent alongside account_id. Together they verify the order is being submitted for the right account.You can also set your Webhook URL on the same page.
Each request requires an API key in the request header. Each account is assigned an API key, available on the Settings → API Integration page.
Name: Authorization
Value: Token token=<key>
You can optionally include an account identifier in the request header. This is useful for tracking requests by account. Contact support for your account identifier.
Name: X-Account-Identifier
Value: <account_identifier>
Submit a new order request.
POST https://turbine-sandbox.240tech.com/api/v3/orders
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
Sample JSON request body with required fields: JSON
Example
{
"type": "order",
"account_id": 1,
"location_id": 1,
"account_zip": "92704",
"purchase_order": "1729598549",
"order_reference_number": "1729598549-1",
"federal_tax_identifier": "123555567",
"ship_provider": "USPS",
"ship_method": "First",
"ship_to": {
"first_name": "Bob",
"last_name": "Smith",
"company_name": "The Turbine",
"address": "123 Main St",
"address_2": "Apt 1",
"city": "Portland",
"state": "OR",
"zip_code": "97034",
"country": "US",
"email": "johnsmith@gmail.com",
"telephone": "800-555-1212"
},
"ship_from": {
"first_name": "",
"last_name": "",
"company_name": "240 Tech",
"address": "1915 S Susan St",
"address_2": "",
"city": "Santa Ana",
"state": "CA",
"zip_code": "92704",
"country": "US"
},
"shipping_label_url": "https://clientdomain.com/shipments/shipping-label.pdf",
"packing_slip_url": "https://clientdomain.com/shipments/packing-slip.pdf",
"addtl_ship_docs_url": "https://clientdomain.com/shipments/customs-declaration.pdf",
"production_priority": "normal",
"sales_channel": "TikTok",
"organization_name": "Northeast Division",
"organization_id": "ORG-1042",
"items": [
{
"customer_sku": "574247-15",
"item_reference_number": "574247-15",
"decoration_type": "dtg",
"gtin": "00191533598499",
"sku": "BC3001-BLACK-L",
"product_sku": "DTF-GHOSTTEE-BC3001-BLACK-L",
"quantity": "1",
"attributes": {
"style": "BC3001",
"color": "BLACK",
"size": "L"
},
"tech_pack_url": "https://clientdomain.com/wp-content/assets/tech-pack.pdf",
"external_design_id": "TCA-DSN-123",
"personalization_csv_url": "https://vendor.example.com/tca/fields.csv",
"customization_options": {
"Player Name": "John Smith",
"Player Number": "23"
},
"custom_tags": [
{
"tag_code": "NewTag",
"tag_type": "hang tag",
"image": "https://s3.amazonaws.com/pms-masters/2/IN.HO/BRJZ02101/M/S.png",
"printable": false
},
{
"tag_code": "ExistingTag"
}
],
"designs": [
{
"placement": "Front Center",
"art_file": "art.tif",
"identifier": "UUID-1234567890",
"art_url": "https://clientdomain.com/wp-content/assets/art.tif",
"tech_pack_url": "https://clientdomain.com/wp-content/assets/tech-pack.pdf",
"thumbnail_url": "https://clientdomain.com/wp-content/assets/thumbnail.jpg",
"underbase": true,
"x_offset": 20,
"y_offset": 10,
"width": 12.0,
"height": 14.0,
"stitch_count": 0,
"note": "This is a note for the artwork team to review.",
"external_design_id": "TCA-DSN-123",
"personalization_csv_url": "https://vendor.example.com/tca/fields.csv",
"customization_options": {
"Team": "Falcons"
},
"personalization": {
"personalization_text": "Kenny",
"personalization_text_2": "12",
"personalization_font": "Basic Block",
"personalization_color": "Celtic Green",
"personalization_size": "32"
},
"design_process_steps": [
{
"ordinal": 1,
"color_code": "2297",
"color_name": "Snow White"
},
{
"ordinal": 2,
"color_code": "1825",
"color_name": "Summer Sun"
}
]
}
]
}
],
"inserts": [
{
"identifier": "insert-card-10-off-spring",
"preview_url": "https://clientdomain.com/wp-content/assets/insert.jpg"
}
],
"easy_post_object": {
"customs_info": {
"contents_type": "gift"
},
"customs_item_value": 10.00
}
}
type
Set to order
account_id
Assigned during your account setup. Contact support for your account number. We use this to verify your order submissions.
location_id (optional)
For Turbine installations with more than one fulfillment location, the location_id can be used to override the default production location. Please talk to your account manager about using the location override function. Location id will default to 1 and use internal routing logic if not set.
account_zip
Assigned during your account setup. Contact support for your account zip. We use this to verify your order submissions.
purchase_order
Any purchase order or internally assigned identifier. Must be unique to each order submission.
ship_provider (optional)
The shipping provider to be used for the order. This can be optional if shipping_label_url is provided with a pre-paid label or your account is configured with a default shipping provider for domestic and international shipments. Common providers include:
For a complete list of all available shipping providers, see Shipping Providers in the Appendix.
ship_method (optional)
Describe service level for shipping provider. Please contact support for a list of supported methods by provider.
shipping_label_url (optional)
The url of a pre-paid shipping label for this order. Turbine will request the label and prepare it for our shipping system at the time of order print completion. Accepted formats include: JPG, GIF, PNG and PDF.
packing_slip_url (optional)
The url of a packing slip document. Turbine will request the document and prepare it for our shipping system at the time of order print completion. Accepted formats include: JPG, GIF, PNG and PDF. If needed please contact your Turbine account manager as an additional cost may incur.
addtl_ship_docs_url (optional)
The url of a additional shipping documents for this order. Turbine will request the document and prepare it for our shipping system at the time of order print completion. Accepted formats include: JPG, GIF, PNG and PDF. If needed please contact your Turbine account manager as an additional cost may incur.
ship_to
Provide as much information as possible. Address information is verified at the time of order print completion. Missing data can delay an order from entering production.
ship_from (optional)
Company name or first and last name are required. Address fields are required to override account level ship from address for shipping labels.
order_notes (optional)
Any additional information for this order.
order_reference_number (optional)
Internal reference number or string.
federal_tax_identifier (optional)
Federal Tax Identifier number or string to be used with international shipments to the EU for Import VATS.
production_priority
normal (default) or rush. Rush orders will incur an additional fee to expedite the production of the order.
sales_channel (optional)
The origin of the order, such as the marketplace or storefront it came from (e.g. TikTok, Shopify, Etsy). Free-text string. Turbine stores this value and surfaces it to the fulfillment team during shipping.
organization_name (optional)
The organization the order belongs to, such as a division, plant, franchise or dealer (e.g. Northeast Division). Free-text string. Turbine stores this value and surfaces it to the fulfillment team during shipping.
organization_id (optional)
Your own identifier for the organization above (e.g. ORG-1042). Free-text string. Returned on order status so you can reconcile orders back to your organization records.
items
Array of one or more items.
sku identifier, after product_sku. Case-insensitive match. Global SKUs are preferred over location-specific SKUs.personalization_csv_url headers if provided); values are the customer-supplied strings. Accepts any keys — this is a flexible pass-through bag. Can also be provided at the design level.designs
Array of one or more designs to use to decorate an item. You can either provide artwork URLs to create a new design, or reference an existing design from your library using design_id.
design_id is provided, art_url and thumbnail_url are not required.For a complete list of all available print placement locations, see Print Placement Locations in the Appendix.
personalization_csv_url headers if provided); values are the customer-supplied strings. Accepts any keys — this is a flexible pass-through bag. Can also be provided at the item level.personalization (optional)
Object containing personalization details for embroidery designs. Used for adding custom text or names to garments.
design_process_steps (optional)
Array of one or more color steps for the design. Required for embroidery decoration type.
custom_tags (optional)
Array of one or more custom application tags to apply to an item in an order. Custom tags must be prearranged with the Turbine as they are physical goods and may incur an additional charge per item.
inserts (optional)
Array of one or more inserts to apply to an order. Inserts must be prearranged with the Turbine as they are physical goods and may incur an additional charge per insert.
easy_post_object (optional)
JSON representing overrides for easy post object values.
Status Code 200 OK
{
"status": "ok",
"message": "Order <order_id> successfully created.",
"order": <order_id>,
"purchase_order": <purchase_order>,
"items": [
<item_id>,
<item_id>
]
}
Status Code 200 OK
Status Code 422 Unprocessable Entity
Defective SKU in Order Status Code 422 Unprocessable Entity
{
"status": "unprocessable_content",
"message": "Defective SKU cannot be used in production. SKU: <sku_name>"
}
Duplicate Order Status Code 422 Unprocessable Entity
{
"status": "unprocessable_content",
"message": "Validation failed: Purchase order has already been taken.",
"order": <order_id>
}
Invalid Embroidery Data - Stitch Count Status Code 422 Unprocessable Entity
{
"status": "unprocessable_content",
"message": "Embroidery item in this order is missing stitch count data that is required for vendor fulfillment."
}
Invalid Embroidery Data - Design Process Steps Status Code 422 Unprocessable Entity
{
"status": "unprocessable_content",
"message": "Embroidery item in this order is missing valid design process steps that is required for vendor fulfillment. Error: 'error_message'"
}
Invalid Product Status Code 422 Unprocessable Entity
{
"status": "unprocessable_content",
"message": "Product found but the SKU attached to the product was not found. Possibly the product wasn't configured correctly. SKU: 'product_sku'"
}
Missing Items Status Code 422 Unprocessable Entity
{
"status": "unprocessable_content",
"message": "Order is missing one or more items."
}
Missing Decoration Type Status Code 422 Unprocessable Entity
{
"status": "unprocessable_content",
"message": "Supplied decoration type: 'decoration_type' cannot be found to process this item."
}
Missing Designs Status Code 422 Unprocessable Entity
{
"status": "unprocessable_content",
"message": "Item is missing one or more designs."
}
Missing Design URL Status Code 422 Unprocessable Entity
{
"status": "unprocessable_content",
"message": "Item is printable but the design is missing an art: 'true' and thumbnail: 'true' URI."
}
Missing Quantity Status Code 422 Unprocessable Entity
{
"status": "unprocessable_content",
"message": "Item quantity must be greater than zero."
}
Missing Skus Status Code 422 Unprocessable Entity
{
"status": "unprocessable_content",
"message": "SKU cannot be found to process this item. SKU: <sku_name>"
}
Request status of a single order
id
Internal order id used by Turbine.
purchase_order
Customer purchase order provided with the order.
GET https://turbine-sandbox.240tech.com/api/v3/orders/<order_id>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
GET https://turbine-sandbox.240tech.com/api/v3/orders/6724120
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
GET https://turbine-sandbox.240tech.com/api/v3/orders/show?purchase_order=<purchase_order>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
GET https://turbine-sandbox.240tech.com/api/v3/orders/show?purchase_order=5697626056
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
{
"id": 6724120,
"purchase_order": "5697626056",
"location": "Santa Ana",
"received_at": "2020-02-01T23:00:24.691 -07:00",
"created_at": "2020-02-01T23:56:24.691 -07:00",
"shipped_at": "2020-02-02T12:21:24.691 -07:00",
"canceled_at": "2020-02-02T12:21:24.691 -07:00",
"status": "completed",
"sales_channel": "TikTok",
"organization_name": "Northeast Division",
"organization_id": "ORG-1042",
"location_address": {
"company_name": "240tech Fulfillment",
"address": "123 Production Blvd",
"address_2": "Suite 100",
"city": "Santa Ana",
"state": "CA",
"zip_code": "92704",
"country": "US",
"email": "fulfillment@240tech.com",
"telephone": "800-555-1234"
},
"client_amount": 5.25,
"order_notes": "Job 10315476 - 5000_RED_L on order in the following purchase order(s) | PO: 131671 - Arriving: 02/01/20 - From: Alpha Broder | ",
"fulfillment_notes": "",
"items": [
{
"id": 7,
"location_id": 1,
"customer_sku": "125737211",
"sku_id": 3668,
"description": "T-SHIRT",
"workflow_state": "intake_hold",
"quantity": 1,
"client_item_num": null,
"original_sku_id": 3668,
"neck_tag": false,
"printable": true,
"issues": "",
"sku": {
"id": 3668,
"brand": "Hanes",
"identifier": "5250_BLACK_L",
"supplier_identifier": "5250",
"color": "BLACK",
"size": "L",
"weight": "7.3",
"fleece": false,
"replacement_sku": null,
"garment_provider": "Alpha Broder",
"gtin": null,
"case_quantity": 72
},
"designs": [
{
"id": 5,
"location": "Front Center",
"art": "PR106086.tif",
"art_uri": "https://dl.dropboxusercontent.com/s/afp48fo08nvmcay/PR106086.tif",
"thumbnail_uri": "https://dl.dropboxusercontent.com/s/s46uxz9pf13f29x/PR106086_0775_NAV.jpg",
"width": "11.0",
"height": "13.28",
"resolution_ppi": "300.0"
}
],
"jobs": [
{
"id": 19,
"location_id": 1,
"workflow_state": "intake_hold",
"print_state": null,
"rip_processed": false,
"issues": "Job 19 - 5250_BLACK_L is not assigned to an inventory bin for picking.,Job 19 - cannot be fulfilled as 5250_BLACK_L is out of stock and needs to be ordered."
}
]
}
],
"shipments": [
{
"shipping_carrier": "DHL",
"shipping_method": "Smartmail Expedited",
"tracking_number": "9374869903500930473876",
"search_link": "https://webtrack.dhlglobalmail.com/?trackingnumber=9374869903500930473876",
"delivered": false,
"postage_amount": 6.25,
"shipping_label_url": "https://turbine-demo.s3.us-west-1.amazonaws.com/shipment_labels/16/9047527/9047527-3258.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAI2I4LYRQFXLAY2RA%2F20210616%2Fus-west-1%2Fs3%2Faws4_request&X-Amz-Date=20210616T163532Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=71bf3edfa6ce4b9689c218e8ad8b113ca280f8fabd815d211c983b219720f1f6"
}
],
"order_status_notes": [
{
"note": "Job 10315476 - 5000_RED_L on order in the following purchase order(s) | PO: 131622 - Arriving: 02/06/20 - From: Alpha Broder |",
"created_at": "2020-02-05T11:53:08-08:00"
}
],
"service_requests": [
{
"reason": "Order status inquiry",
"workflow_state": "open",
"items_count": 1,
"created_at": "2020-02-10T15:20:14-08:00"
}
]
}
id
Internal order id.
purchase_order
Customer purchase order number or string.
location
The name of the location where the order will be produced.
location_address
The physical address of the production facility fulfilling this order. Useful for customers who need to send pre-paid shipping labels to the fulfillment location.
received_at
The timestamp of when the order was submitted via the API.
created_at
The timestamp of when the order was released to production.
shipped_at
The timestamp of when the order was shipped. Present if the order has been shipped.
canceled_at
The timestamp of when the order was canceled. Present if the order has been canceled.
status
Order status can be:
sales_channel
The origin of the order (e.g. TikTok, Shopify, Etsy) as supplied at order submission. Returns null if none was provided.
organization_name
The organization the order belongs to as supplied at order submission. Returns null if none was provided.
organization_id
Your identifier for the organization as supplied at order submission. Returns null if none was provided.
client_amount
Order cost expected to be billed to client. Note: This can change as the order changes within our system and does not typically include the shipping carrier charges.
order_notes
The latest order status note. A full list of notes is also available.
fulfillment_notes
A list of issues that are blocking the order or items from production. Our automated systems will update this list and customer service will contact the account when it is possible to rectify.
items
The items that comprise an order
sku
The sku of the item to be produced
designs
The designs attached to an item for use in printing
jobs
The jobs generated for production based on the item data submitted. Jobs are each unit to be produced.
shipments
Shipments generated to fulfill an order. This is the authoritative source for tracking. An order may have more than one shipment when it ships in multiple boxes.
archived is true — their tracking numbers are dead. Only shipments with archived: false are live.related_orders
Orders split off from, or reprinted for, this order. Each carries its own id, purchase_order, workflow_state, items and shipments — and ships separately with its own tracking.
If an order is split in production, the tracking for the split-off items appears on the related order, not in this order's shipments. To collect all tracking for an order you submitted, read its shipments and then the shipments array of each entry in related_orders. Orders that are never split have an empty related_orders array.
address
Current delivery address for the order.
order_status_notes
Manual and automated notes created during the production of an order
service_requests
A list of all order service requests in Turbine for an order
Status Code 404 Not Found
{
"status": "not_found",
"message": "An order with that ID cannot be located"
}
Request status of 100 most recent orders, with pagination.
GET https://turbine-sandbox.240tech.com/api/v3/orders
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
GET https://turbine-sandbox.240tech.com/api/v3/orders
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
{
"orders": [
{
"order": {
"id": 6724120,
"purchase_order": "5697626056",
"location": "California",
"received_at": "2020-02-01T23:00:24.691 -07:00",
"created_at": "2020-02-01T23:56:24.691 -07:00",
"shipped_at": "2020-02-02T12:21:24.691 -07:00",
"status": "completed",
"location_address": {
"company_name": "240tech Fulfillment",
"address": "123 Production Blvd",
"address_2": "Suite 100",
"city": "Santa Ana",
"state": "CA",
"zip_code": "92704",
"country": "US",
"email": "fulfillment@240tech.com",
"telephone": "800-555-1234"
},
"client_amount": 5.25,
"order_notes": "Job 10315476 - 5000_RED_L on order in the following purchase order(s) | PO: 131671 - Arriving: 02/01/20 - From: Alpha Broder | ",
"fulfillment_notes": "",
"items": [
{
"id": 7,
"location_id": 1,
"customer_sku": "125737211",
"sku_id": 3668,
"description": "T-SHIRT",
"workflow_state": "intake_hold",
"quantity": 1,
"client_item_num": null,
"original_sku_id": 3668,
"neck_tag": false,
"printable": true,
"issues": "",
"sku": {
"id": 3668,
"brand": "Hanes",
"identifier": "5250_BLACK_L",
"supplier_identifier": "5250",
"color": "BLACK",
"size": "L",
"weight": "7.3",
"fleece": false,
"replacement_sku": null,
"garment_provider": "Alpha Broder",
"gtin": null,
"case_quantity": 72
},
"designs": [
{
"id": 5,
"location": "Front Center",
"art": "PR106086.tif",
"art_uri": "https://dl.dropboxusercontent.com/s/afp48fo08nvmcay/PR106086.tif",
"thumbnail_uri": "https://dl.dropboxusercontent.com/s/s46uxz9pf13f29x/PR106086_0775_NAV.jpg",
"width": "11.0",
"height": "13.28",
"resolution_ppi": "300.0"
}
],
"jobs": [
{
"id": 19,
"location_id": 1,
"workflow_state": "intake_hold",
"print_state": null,
"rip_processed": false,
"issues": "Job 19 - 5250_BLACK_L is not assigned to an inventory bin for picking.,Job 19 - cannot be fulfilled as 5250_BLACK_L is out of stock and needs to be ordered."
}
]
}
],
"shipments": [
{
"shipping_carrier": "DHL",
"shipping_method": "Smartmail Expedited",
"tracking_number": "9374869903500930473876",
"search_link": "https://webtrack.dhlglobalmail.com/?trackingnumber=9374869903500930473876",
"delivered": false
}
],
"order_status_notes": [
{
"note": "Job 10315476 - 5000_RED_L on order in the following purchase order(s) | PO: 131622 - Arriving: 02/06/20 - From: Alpha Broder |",
"created_at": "2020-02-05T11:53:08-08:00"
}
],
"service_requests": [
{
"reason": "Order status inquiry",
"workflow_state": "open",
"items_count": 1,
"created_at": "2020-02-10T15:20:14-08:00"
}
]
},
{
"order": {
"id": 998,
"purchase_order": "987654321",
"created_at": "2018-06-30T23:00:25.492-07:00",
"status": "open",
...
}
Notice: For element details, please refer to the Order Status request above.
To retrieve a list of orders, optional url parameters listed below can be used in conjunction to retrieve a filtered list of orders:
order_status
The status of the orders to retrieve. Order status can be received, open, packaged, shipped and canceled.
created_at_min
Show orders created after date (format: 02-25-2018).
created_at_max
Show orders created before date (format: 02-26-2018).
limit
Amount of results. Default is 100. Maximum is 200.
page
The page number to retrieve the next list orders based on specified parameters.
GET https://turbine-sandbox.240tech.com/api/v3/orders?order_status=<order_status>&limit=<limit_number>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
GET https://turbine-sandbox.240tech.com/api/v3/orders?order_status=shipped&limit=50
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
Notice: If you would prefer that the Turbine system send order notifications instead of polling for order status please contact your Turbine representative. We can POST order notifications as the order status updates through to shipped.
Submit an order change request for the shipping carrier, shipping method, pre-provided label, shipping address or production priority.
PUT https://turbine-sandbox.240tech.com/api/v3/orders/<order_id>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
PUT https://turbine-sandbox.240tech.com/api/v3/orders/7048816
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
Example
{
"ship_provider": "UPS",
"ship_method": "Ground",
"shipping_label_url": "https://client.domain.com/label_file.png",
"packing_slip_url": "https://client.domain.com/packing_slip.pdf",
"production_priority": "rush",
"ship_to": {
"first_name": "Customer",
"last_name": "Name",
"company_name": "",
"address": "1915 S Susan St",
"address_2": "",
"city": "Santa Ana",
"state": "",
"zip_code": "92704",
"country": "US",
"email": "customer@domain.com",
"telephone": "5555555555"
},
"ship_from": {
"first_name": "Customer",
"last_name": "Name",
"company_name": "",
"address": "1915 S Susan St",
"address_2": "",
"city": "Santa Ana",
"state": "",
"zip_code": "92704",
"country": "US"
}
}
status
Response type (ok, unprocessable_entity). Expected status codes are: [200, 422].
message
Message string describing success or reason for failure.
order
The id of the order requested.
{
"status": "ok",
"message": "Order 7048816 successfully updated.",
"order": 7048816
}
{
"status": "unprocessable_content",
"message": "This order is already packaged or shipped and cannot be updated.",
"order": 7048816
}
Submit an order cancellation request.
DELETE https://turbine-sandbox.240tech.com/api/v3/orders/<order_id>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
DELETE https://turbine-sandbox.240tech.com/api/v3/orders/7048816
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
status
Response type (ok, unprocessable_entity). Expected status codes are: [200, 422].
message
Message string describing success or reason for failure.
order
The id of the order requested.
{
"status": "ok",
"message": "Order 7048816 successfully canceled.",
"order": 7048816
}
{
"status": "unprocessable_content",
"message": "This order is already canceled.",
"order": 7048816
}
{
"status": "unprocessable_content",
"message": "This order is already in production and cannot be canceled.",
"order": 7048816
}
Request status of a single item
id
Internal item id used by Turbine.
client_item_num
Customer client item number provided with the item.
GET https://turbine-sandbox.240tech.com/api/v3/items/<item_id>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
GET https://turbine-sandbox.240tech.com/api/v3/items/6724120
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
GET https://turbine-sandbox.240tech.com/api/v3/items/show?client_item_num=<client_item_num>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
GET https://turbine-sandbox.240tech.com/api/v3/items/show?client_item_num=5697626056
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
{
"id": 7,
"location_id": 1,
"customer_sku": "125737211",
"sku_id": 3668,
"description": "T-SHIRT",
"workflow_state": "intake_hold",
"quantity": 1,
"client_item_num": null,
"original_sku_id": 3668,
"neck_tag": false,
"printable": true,
"issues": "",
"sku": {
"id": 3668,
"brand": "Hanes",
"identifier": "5250_BLACK_L",
"supplier_identifier": "5250",
"color": "BLACK",
"size": "L",
"weight": "7.3",
"fleece": false,
"replacement_sku": null,
"garment_provider": "Alpha Broder",
"gtin": null,
"case_quantity": 72
},
"designs": [
{
"id": 5,
"location": "Front Center",
"art": "PR106086.tif",
"art_uri": "https://dl.dropboxusercontent.com/s/afp48fo08nvmcay/PR106086.tif",
"thumbnail_uri": "https://dl.dropboxusercontent.com/s/s46uxz9pf13f29x/PR106086_0775_NAV.jpg",
"width": "11.0",
"height": "13.28",
"resolution_ppi": "300.0"
}
],
"jobs": [
{
"id": 19,
"location_id": 1,
"workflow_state": "intake_hold",
"print_state": null,
"rip_processed": false,
"issues": "Job 19 - 5250_BLACK_L is not assigned to an inventory bin for picking.,Job 19 - cannot be fulfilled as 5250_BLACK_L is out of stock and needs to be ordered."
}
],
"created_at": "2021-07-27T11:42:55-07:00"
}
Notice: For element details, please refer to the Order Status request above.
Status Code 404 Not Found
{
"status": "not_found",
"message": "An item with that ID cannot be located."
}
Submit an update to an existing item.
PUT https://turbine-sandbox.240tech.com/api/v3/items/2
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
PUT https://turbine-sandbox.240tech.com/api/v3/items/update?client_item_num=<client_item_num>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
Example
{ "sku": "5250_BLACK_XL" }
sku
The sku identifier to update the item sku. Will be used to search for a valid sku.
Status Code 200 OK
{
"status": "ok",
"message": "Item <item_id> successfully updated.",
"item": <item_id>
}
Status Code 200 OK
Status Code 422 Unprocessable Entity
Sku Not Found Status Code 422 Unprocessable Entity
{
"status": "unprocessable_content",
"message": "The sku could not be found or is already updated for this item.",
"item": <item_id>
}
Status Code 422 Unprocessable Entity
Item In Production Status Code 422 Unprocessable Entity
{
"status": "unprocessable_content",
"message": "This item is already in production and cannot be changed.",
"item": <item_id>
}
Submit an item cancellation request.
DELETE https://turbine-sandbox.240tech.com/api/v3/items/<item_id>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
DELETE https://turbine-sandbox.240tech.com/api/v3/items/2
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
status
Response type (ok, unprocessable_entity). Expected status codes are: [200, 422].
message
Message string describing success or reason for failure.
item
The id of the item requested.
{
"status": "ok",
"message": "Item 7048816 successfully canceled.",
"item": 2
}
{
"status": "unprocessable_content",
"message": "This item is already canceled.",
"item": 2
}
{
"status": "unprocessable_content",
"message": "This item is already in production and cannot be canceled.",
"item": 2
}
Request status of a single job
id
Internal job id used by Turbine.
GET https://turbine-sandbox.240tech.com/api/v3/jobs/<job_id>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
GET https://turbine-sandbox.240tech.com/api/v3/jobs/6724120
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
{
"id": 19,
"location_id": 1,
"workflow_state": "intake_hold",
"print_state": null,
"rip_processed": false,
"issues": "Job 19 - 5250_BLACK_L is not assigned to an inventory bin for picking.,Job 19 - cannot be fulfilled as 5250_BLACK_L is out of stock and needs to be ordered.",
"sku": {
"id": 3668,
"brand": "Hanes",
"identifier": "5250_BLACK_L",
"supplier_identifier": "5250",
"color": "BLACK",
"size": "L",
"weight": "7.3",
"fleece": false,
"replacement_sku": null,
"garment_provider": "Alpha Broder",
"gtin": null,
"case_quantity": 72
},
"stock": {
"id": 67253,
"sku_identifier": "5250_BLACK_L",
"sku_gtin": null,
"sku_volume_tier": "C",
"location_id": 1,
"location_name": "Santa Ana",
"quantity": 0,
"amt_on_order": 0,
"expected_etas": []
},
"created_at": "2021-07-27T11:43:03-07:00"
}
Notice: For element details, please refer to the Order Status request above.
Status Code 404 Not Found
{
"status": "not_found",
"message": "A job with that ID cannot be located."
}
Submit an job cancellation request.
DELETE https://turbine-sandbox.240tech.com/api/v3/jobs/<job_id>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
DELETE https://turbine-sandbox.240tech.com/api/v3/jobs/2
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
status
Response type (ok, unprocessable_entity). Expected status codes are: [200, 422].
message
Message string describing success or reason for failure.
job
The id of the job requested.
{
"status": "ok",
"message": "job 7048816 successfully canceled.",
"job": 2
}
{
"status": "unprocessable_content",
"message": "This job is already canceled.",
"job": 2
}
{
"status": "unprocessable_content",
"message": "This job is already in production and cannot be canceled.",
"job": 2
}
Search and retrieve designs from your account's design library. Designs can be reused across multiple orders by referencing their ID when creating orders.
GET https://turbine-sandbox.240tech.com/api/v3/designs
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
limit (optional)
Number of results per page (default: 50, max: 200)
page (optional)
Page number for pagination (default: 1)
file_name (optional)
Filter by file name (partial match, case-insensitive)
unique_id (optional)
Filter by exact unique ID
decoration_location_id (optional)
Filter by decoration location ID
created_after (optional)
Filter designs created after this date (ISO 8601 format, e.g., "2024-01-15T00:00:00Z")
created_before (optional)
Filter designs created before this date (ISO 8601 format)
GET https://turbine-sandbox.240tech.com/api/v3/designs?limit=10&page=1&file_name=logo
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
pagination
Pagination metadata object containing:
- current_page: Current page number
- total_pages: Total number of pages
- total_count: Total number of designs
- per_page: Number of results per page
designs
Array of design objects
design object
id
The unique identifier for the design. Use this when creating orders to reference an existing design.
unique_id
Custom unique identifier set during design creation (may be null).
file_name
The name of the design file.
location
The print location name (e.g., "Front Center", "Full Back").
decoration_location
The standardized decoration location name.
art_uri
URL to the original artwork file.
thumbnail_uri
URL to the thumbnail image.
tech_pack_uri
URL to the tech pack file (may be null).
width
Design width in inches.
height
Design height in inches.
original_width
Original design width before any scaling (may be null).
original_height
Original design height before any scaling (may be null).
max_width
Maximum allowed width for this design (may be null).
max_height
Maximum allowed height for this design (may be null).
x_offset
Horizontal offset for placement (may be null).
y_offset
Vertical offset for placement (may be null).
stitch_count
Stitch count for embroidery designs (may be null).
note
Additional notes about the design (may be null).
garment_color
The garment color this design was created for (may be null).
garment_style
The garment style this design was created for (may be null).
art_content_type
The content type of the artwork (e.g., "image/png").
resolution_ppi
Resolution in pixels per inch.
account_name
Name of the account that owns the design.
created_at
Timestamp when the design was created (ISO 8601 format).
updated_at
Timestamp when the design was last updated (ISO 8601 format).
{
"pagination": {
"current_page": 1,
"total_pages": 5,
"total_count": 47,
"per_page": 10
},
"designs": [
{
"id": 12345,
"unique_id": "LOGO-001",
"file_name": "company-logo.png",
"location": "Front Center",
"decoration_location": "Front Center",
"art_uri": "https://example.com/art/company-logo.png",
"thumbnail_uri": "https://example.com/thumbs/company-logo.png",
"tech_pack_uri": null,
"width": "12.0",
"height": "14.0",
"original_width": null,
"original_height": null,
"max_width": "13.0",
"max_height": "15.0",
"x_offset": 0,
"y_offset": 0,
"stitch_count": null,
"note": "Main company logo",
"garment_color": "WHITE",
"garment_style": "2000",
"art_content_type": "image/png",
"resolution_ppi": "300.0",
"account_name": "Example Company",
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T10:30:00Z"
}
]
}
GET https://turbine-sandbox.240tech.com/api/v3/designs/<design_id>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
design_id
The unique ID of the design to retrieve.
GET https://turbine-sandbox.240tech.com/api/v3/designs/12345
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
The response contains the same structure as individual items in the list designs response, but returns a single design object instead of an array with pagination.
{
"id": 12345,
"unique_id": "LOGO-001",
"file_name": "company-logo.png",
"location": "Front Center",
"decoration_location": "Front Center",
"art_uri": "https://example.com/art/company-logo.png",
"thumbnail_uri": "https://example.com/thumbs/company-logo.png",
"tech_pack_uri": null,
"width": "12.0",
"height": "14.0",
"original_width": null,
"original_height": null,
"max_width": "13.0",
"max_height": "15.0",
"x_offset": 0,
"y_offset": 0,
"stitch_count": null,
"note": "Main company logo",
"garment_color": "WHITE",
"garment_style": "2000",
"art_content_type": "image/png",
"resolution_ppi": "300.0",
"account_name": "Example Company",
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T10:30:00Z"
}
Status Code 404 Not Found
{
"status": "not_found",
"message": "A design with this ID cannot be located in your account."
}
When creating a new order, you can reference an existing design by its ID instead of providing artwork URLs. This allows you to reuse designs across multiple orders.
{
"type": "order",
"purchase_order": "PO-12345",
"ship_to": {
"first_name": "John",
"last_name": "Doe",
"address": "123 Main St",
"city": "Los Angeles",
"state": "CA",
"zip_code": "90001",
"country": "US",
"email": "john@example.com"
},
"items": [
{
"sku": "2000_WHITE_L",
"quantity": 10,
"designs": [
{
"design_id": 12345
}
]
}
]
}
When using design_id:
- The design must belong to your account
- The design_id field takes precedence over artwork URLs
- The design's stored placement/location will be used automatically
- If the design is not found, the order will be rejected with an error
Retrieve a list of updated quote invoice numbers.
updated_after
(Optional) ISO 8601 timestamp of the last updated quote. If not provided, the API will return all quotes updated in the last 24 hours.
GET https://turbine-sandbox.240tech.com/api/v3/quotes?updated_after=<ISO 8601 timestamp>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
{
"quotes": [
"74",
"75",
"76"
]
}
Request status of a single quote
invoice_number
Internal quote id used by Turbine.
GET https://turbine-sandbox.240tech.com/api/v3/quotes/<invoice_number>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
GET https://turbine-sandbox.240tech.com/api/v3/quotes/74
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
{
"quote_id": "74",
"customer_id": 1234,
"customer_company": "Dangen Apparel",
"customer_name": "Joe Dangen",
"customer_email": "joe@dangen.com",
"quote_creation_date": "2025-07-29T11:45:33-05:00",
"quote_status": "open",
"total": 300.3,
"products": [
{
"decoration_type": "dtg",
"sku_style_color": "BC3001",
"sizes": [
[
"XS",
"0"
],
[
"S",
"0"
],
[
"M",
"2"
],
[
"L",
"20"
],
[
"XL",
"20"
],
[
"2XL",
"0"
],
[
"3XL",
"0"
],
[
"4XL",
"0"
],
[
"5XL",
"0"
]
],
"total_quantity": 42,
"blank_price": 4.15,
"decoration_price": 3.0,
"description": "Black Butterfly",
"total": 300.3,
"designs": [
{
"id": 12345,
"location": "Front Center",
"file_name": "company-logo.png",
"art_uri": "https://example.com/art/company-logo.png",
"thumbnail_uri": "https://example.com/thumbs/company-logo.png",
"width": "12.0",
"height": "10.0",
"resolution_ppi": "300.0"
}
]
}
]
}
quote_id
Internal quote id.
customer_id
Internal customer id (same value as customer_id on the orders endpoint).
customer_company
Customer company name.
customer_name
Customer name.
customer_email
Customer email.
quote_creation_date
The timestamp of when the quote was created.
quote_status
The status of the quote.
total
The total dollar amount of the quote.
products
An array of products in the quote.
products.decoration_type
The type of decoration on the product.
products.sku_style_color
The style and color of the product.
products.sizes
An array of sizes in the product.
products.sizes[].size
The size of the product.
products.sizes[].quantity
The quantity of the size in the product.
products.total_quantity
The total units quantity of the product.
products.blank_price
The price of the blank product.
products.decoration_price
The price of the decoration on the product.
products.description
The description of the product.
products.total
The total price of the product in the quote.
products.designs
An array of the artwork on the product, using the same fields as designs on the orders endpoint.
products.designs[].id
Internal design id.
products.designs[].location
The print location name.
products.designs[].file_name
The artwork file name.
products.designs[].art_uri
URL to the original artwork file.
products.designs[].thumbnail_uri
URL to the thumbnail image.
products.designs[].width
Design width in inches.
products.designs[].height
Design height in inches.
products.designs[].resolution_ppi
Design resolution in PPI.
Status Code 404 Not Found
{
"status": "not_found",
"message": "A quote with this id cannot be located in your account."
}
Search for available SKUs based on various criteria such as brand, supplier identifier, color, and size.
POST https://turbine-sandbox.240tech.com/api/v3/skus/search
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
This endpoint is POST only — the filters are sent as a JSON body, not as query
parameters. A GET to this path returns 404.
All parameters are optional; omitting all of them returns the first 100 SKUs available to your account. Results are capped at 100.
identifier (optional)
Exact SKU identifier (e.g., "AC5081-ECRU-S")
brand (optional)
The brand name to filter by (e.g., "AS Colour")
supplier_identifier (optional)
The supplier's identifier for the SKU, matched as a prefix (e.g., "AC5081")
color (optional)
The color name to filter by (e.g., "ECRU")
size (optional)
The size to filter by (e.g., "S", "M", "L", "XL")
POST https://turbine-sandbox.240tech.com/api/v3/skus/search
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
{
"brand": "AS Colour",
"supplier_identifier": "AC5081",
"color": "ECRU",
"size": "S"
}
A successful search returns a JSON array of SKU objects. When nothing matches, the response is an object instead:
{
"status": "ok",
"message": "No SKUs found matching criteria",
"skus": []
}
id
The serialized id for the SKU.
identifier
The full SKU identifier string.
brand
The brand name of the garment.
short_brand
Abbreviated brand name.
supplier_identifier
The supplier's identifier for this SKU.
manufacturer_identifier
The manufacturer's identifier for this SKU.
style
The style name of the garment.
garment_type
The type of garment (e.g., "T-SHIRT").
size
The size of the garment.
sleeve
The sleeve type (e.g., "LS" for long sleeve).
description
Additional description of the SKU (may be null).
color
The color name of the garment.
hex_color
The hex color code (may be null).
gender
The target gender for the garment (e.g., "UNISEX").
weight
The weight of the garment.
garment_provider
The provider/manufacturer of the garment.
fleece
Boolean indicating if the garment is fleece.
has_pocket
Boolean indicating if the garment has pockets.
high_volume
Boolean indicating if this is a high-volume SKU.
discontinued
Boolean indicating if the SKU is discontinued.
defective
Boolean indicating if the SKU is defective.
gtin
Global Trade Item Number (may be null).
harmonization_tariff_schedule
Tariff schedule information (may be null).
fabric_content
Information about fabric composition (may be null).
case_quantity
Quantity per case.
minimum_quantity
Minimum order quantity.
volume_tier
Volume tier classification ("A", "B", or "C").
order_product
Boolean indicating if this SKU can be ordered.
always_stocked
Boolean indicating if this SKU is always in stock.
replacement_sku
ID of replacement SKU if this one is discontinued (may be null).
max_width
Maximum print width (may be null).
max_height
Maximum print height (may be null).
printable
Boolean indicating if the SKU is printable.
premium_fabric
Boolean indicating if this is premium fabric.
premium_style
Boolean indicating if this is a premium style.
ovaljet_double_spray
Boolean for OvalJet double spray capability.
include_in_zero_linear_feet_report
Boolean for reporting purposes.
oj_priority
OvalJet priority setting (may be null).
y_offset
Y-axis offset for printing (may be null).
table_type
Type of table used for processing.
created_at
Timestamp when the SKU was created.
updated_at
Timestamp when the SKU was last updated.
location
Location information (may be null indicating a global sku).
[
{
"id": 197022,
"identifier": "AC5081-ECRU-S",
"brand": "AS Colour",
"short_brand": "AC",
"supplier_identifier": "AC5081",
"manufacturer_identifier": "AC5081",
"style": "HEAVY L/S TEE",
"garment_type": "T-SHIRT",
"size": "S",
"sleeve": "LS",
"description": null,
"color": "ECRU",
"hex_color": null,
"gender": "UNISEX",
"weight": "8.2",
"garment_provider": "AS Colour",
"fleece": false,
"has_pocket": false,
"high_volume": false,
"discontinued": false,
"defective": false,
"gtin": null,
"harmonization_tariff_schedule": null,
"fabric_content": null,
"case_quantity": 0,
"minimum_quantity": 1,
"volume_tier": "C",
"order_product": true,
"always_stocked": false,
"replacement_sku": null,
"max_width": null,
"max_height": null,
"printable": true,
"premium_fabric": false,
"premium_style": false,
"ovaljet_double_spray": false,
"include_in_zero_linear_feet_report": true,
"oj_priority": null,
"y_offset": null,
"table_type": "Standard pallet",
"created_at": "2025-08-05T13:51:36.914-05:00",
"updated_at": "2025-08-26T12:20:05.675-05:00",
"location": null
}
]
Retrieve detailed information for a specific SKU by its unique identifier.
GET https://turbine-sandbox.240tech.com/api/v3/skus/<sku_id>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
sku_id
The serialized id of the SKU to retrieve.
GET https://turbine-sandbox.240tech.com/api/v3/skus/197022
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
The response contains the same structure as individual items in the SKU search response, but returns a single SKU object instead of an array.
{
"id": 197022,
"identifier": "AC5081-ECRU-S",
"brand": "AS Colour",
"short_brand": "AC",
"supplier_identifier": "AC5081",
"manufacturer_identifier": "AC5081",
"style": "HEAVY L/S TEE",
"garment_type": "T-SHIRT",
"size": "S",
"sleeve": "LS",
"description": null,
"color": "ECRU",
"hex_color": null,
"gender": "UNISEX",
"weight": "8.2",
"garment_provider": "AS Colour",
"fleece": false,
"has_pocket": false,
"high_volume": false,
"discontinued": false,
"defective": false,
"gtin": null,
"harmonization_tariff_schedule": null,
"fabric_content": null,
"case_quantity": 0,
"minimum_quantity": 1,
"volume_tier": "C",
"order_product": true,
"always_stocked": false,
"replacement_sku": null,
"max_width": null,
"max_height": null,
"printable": true,
"premium_fabric": false,
"premium_style": false,
"ovaljet_double_spray": false,
"include_in_zero_linear_feet_report": true,
"oj_priority": null,
"y_offset": null,
"table_type": "Standard pallet",
"created_at": "2025-08-05T13:51:36.914-05:00",
"updated_at": "2025-08-26T12:20:05.675-05:00",
"location": null
}
Retrieve account-specific pricing for a SKU. The price is determined using a hierarchical cost lookup that considers stock label costs, garment provider costs, account-specific overrides, and base SKU costs. Account markup is applied when configured.
GET https://turbine-sandbox.240tech.com/api/v3/skus/<sku_id>/price
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
sku_id
The serialized id of the SKU to retrieve pricing for.
GET https://turbine-sandbox.240tech.com/api/v3/skus/197022/price
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
sku_id
The id of the SKU.
identifier
The string identifier of the SKU.
cost
The base cost of the SKU determined by the hierarchical cost lookup.
cost_with_markup
The cost with the account's base SKU markup percentage applied. Equal to cost if no markup is configured.
cost_source
The source of the cost in the hierarchy. Possible values: stock_label, garment_provider, account_sku, sku_actual, sku_base.
{
"sku_id": 197022,
"identifier": "AC5081-ECRU-S",
"cost": 5.25,
"cost_with_markup": 5.78,
"cost_source": "garment_provider"
}
Submit a new SKU, or changes to one of your existing SKUs, to the product catalog.
Catalog data is shared, so submissions are not applied immediately. Each request creates a pending SKU that Turbine staff review. Once it is approved, the SKU goes live and — if you have a SKU webhook URL configured — Turbine posts a SKU webhook back to you. If a submission is rejected, no webhook is sent.
POST https://turbine-sandbox.240tech.com/api/v3/skus
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
identifier
Your unique identifier for the SKU, for example BC3001-BLACK-M. Identifiers are stored upper-case.
brand
Brand name, for example Bella+Canvas. Register the brand first with Create Brand if it is new.
short_brand
Short brand code, for example BC.
supplier_identifier
The supplier's style number, for example BC3001.
color
Color name, for example BLACK.
size
Size, for example M.
manufacturer_identifier, style, garment_type, sleeve, gender, description, hex_color, weight, recent_cost, actual_cost, case_quantity, minimum_quantity, gtin, harmonization_tariff_schedule, fabric_content, replacement_sku, max_width, max_height, garment_provider, printable, fleece, has_pocket, premium_fabric, premium_style, always_stocked, high_volume, order_product, discontinued, defective, decoration_type_ids.
The SKU is always filed under your account's default location. Location and print settings are managed by Turbine and cannot be set through the API.
{
"sku": {
"identifier": "BC3001-BLACK-M",
"brand": "Bella+Canvas",
"short_brand": "BC",
"supplier_identifier": "BC3001",
"color": "BLACK",
"size": "M",
"garment_type": "T-SHIRT",
"weight": 4.2,
"case_quantity": 72,
"garment_provider": "S&S Activewear"
}
}
201 Created
{
"status": "ok",
"message": "SKU submitted for approval",
"pending_sku_id": 88213,
"identifier": "BC3001-BLACK-M"
}
pending_sku_id identifies the submission, not the finished SKU. The live SKU id arrives with the approval webhook.
If the identifier already exists at your location, the submission is an update rather than a create. The response says so and returns 202 Accepted instead of 201 Created, and approval sends sku_updated rather than sku_created.
{
"status": "ok",
"message": "SKU update submitted for approval",
"pending_sku_id": 618139,
"identifier": "BC3001-BLACK-M"
}
PATCH https://turbine-sandbox.240tech.com/api/v3/skus/<sku_id>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
Send only the fields you want to change. The same parameters as create are accepted.
Only SKUs at your account's default location can be updated. Shared catalog SKUs and SKUs belonging to other locations are read-only and return 404.
{
"sku": {
"description": "Unisex Jersey Short Sleeve Tee",
"case_quantity": 60
}
}
202 Accepted
{
"status": "ok",
"message": "SKU update submitted for approval",
"pending_sku_id": 88214,
"identifier": "BC3001-BLACK-M"
}
If the values you send match the SKU exactly, the request returns 422 with NO_CHANGES_DETECTED — there is nothing to approve.
POST https://turbine-sandbox.240tech.com/api/v3/brands
{
"brand": {
"name": "Bella+Canvas",
"short_brand": "BC",
"logo_url": "https://your-domain.com/logos/bella-canvas.png"
}
}
name and short_brand are required and must both be unique. logo_url is optional; Turbine downloads and stores the image.
A brand with the same name is returned as-is with 200 instead of being duplicated, so this call is safe to repeat. A short_brand already taken by a different brand returns 422 — short codes are unique, so pick another one.
{
"status": "ok",
"message": "Brand created",
"id": 412,
"name": "Bella+Canvas",
"short_brand": "BC"
}
POST https://turbine-sandbox.240tech.com/api/v3/garment_providers
{
"garment_provider": { "name": "S&S Activewear" }
}
Matching ignores case and spaces, so an existing provider is returned with 200 rather than duplicated. Vendor API integration settings are configured by Turbine staff, not through this endpoint.
{
"status": "ok",
"message": "Garment provider created",
"id": 19,
"name": "S&S Activewear"
}
Posting a csv_data string to POST /api/v3/skus instead of a sku object queues a bulk import of the same pending SKUs. Contact your account manager for the CSV column format.
Request the current inventory status by SKU identifier.
GET https://turbine-sandbox.240tech.com/api/v3/stocks/<sku_identifier>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
GET https://turbine-sandbox.240tech.com/api/v3/stocks/2001_BLACK_S
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
id
The id of the sku queried.
sku_identifier
The string identifier of the sku.
sku_gtin
The GTIN (Global Trade Item Number) of the sku.
sku_volume_tier
The volume tier of the sku. The tiers are: A, B, C, with A being the highest volume tier and C being the lowest.
location_id
The id of the stock warehouse location.
location_name
The name of the stock warehouse location.
quantity
The quantity of stock on hand.
available_for_production
The quantity free to start new production: quantity on hand minus jobs on hold and jobs out to pick. For JIT skus, which are never stocked, this reports vendor_available instead.
vendor_available
For JIT skus, the units the garment vendor holds in the warehouses this location buys from. 0 for stocked skus.
amt_on_order
The quantity of stock on order and arriving from a garment provider.
expected_etas
An array indicating the delivery dates for replenishment of the sku inventory.
{
"stocks": [
{
"id": 2174,
"sku_identifier": "BC3001-BLACK-XL",
"sku_gtin": "00821780001020",
"sku_volume_tier": "A",
"location_id": 2,
"location_name": "Cedar Park, TX",
"quantity": 57,
"available_for_production": 45,
"vendor_available": 0,
"amt_on_order": 0,
"expected_etas": [
"2025-08-01T15:32:23.000-07:00"
]
},
{
"id": 20658,
"sku_identifier": "G2000_BLACK_L",
"sku_gtin": "00821780001021",
"sku_volume_tier": "B",
"location_id": 38,
"location_name": "Orange, CA",
"quantity": 1000,
"available_for_production": 1000,
"vendor_available": 0,
"amt_on_order": 0,
"expected_etas": []
}
]
}
Search stock by supplier (style) identifier instead of a single sku identifier — useful when you
want every color/size of a style, or don't know how the sku identifier is spelled.
GET https://turbine-sandbox.240tech.com/api/v3/stocks/search?supplier_identifier=<style>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
supplier_identifier (required)
The supplier (style) identifier to match, case-insensitive. Ex. BC3001.
color (optional)
Narrows results to one color, case-insensitive. Punctuation and spacing are ignored, so
WHITE/TEAM BLACK, WHITE_TEAM_BLACK and whiteteamblack all match the same colorway.
size (optional)
Narrows results to one size, case-insensitive. Ex. S.
If supplier_identifier is missing or blank the request returns 400 with
{ "status": "bad_request", "message": "supplier_identifier is required." }.
GET https://turbine-sandbox.240tech.com/api/v3/stocks/search?supplier_identifier=BC3001&color=BLACK&size=S
Content-Type: application/json
Authorization: Token token=<16-24 character API key>
The response is identical in shape to the Stock Check response above — one entry per matching sku
per stock location. An unmatched search returns an empty stocks array rather than a 404.
{
"stocks": [
{
"id": 2174,
"sku_identifier": "BC3001_BLACK_S",
"sku_gtin": "00821780001020",
"sku_volume_tier": "A",
"location_id": 2,
"location_name": "Cedar Park, TX",
"quantity": 57,
"available_for_production": 45,
"vendor_available": 0,
"amt_on_order": 0,
"expected_etas": [
"2025-08-01T15:32:23.000-07:00"
]
}
]
}
{
"to_address": {
"name": "John Doe",
"company": "Test Company Inc",
"street1": "123 Main Street",
"street2": "Suite 100",
"city": "San Francisco",
"state": "CA",
"zip": "94105",
"country": "US",
"phone": "415-123-4567",
"email": "john@testcompany.com",
"residential": false
},
"from_address": {
"name": "Custom Warehouse",
"company": "240tech Shipping",
"street1": "999 Warehouse Dr",
"city": "Dallas",
"state": "TX",
"zip": "75201",
"phone": "214-555-0199"
},
"skus": [
{
"sku_code": "QTT200-AZALEA-OS",
"quantity": 10,
"decoration_type_name": "Screen Print"
},
{
"sku_code": "QTT200-BLACK-OS",
"gtin": "00194136415387",
"quantity": 5
}
],
"location_id": 1
}
The above command returns JSON structured like this:
{
"package": {
"name": "Small Box",
"dimensions": {
"length": 12.0,
"width": 9.0,
"height": 3.0,
"weight": 1.5
},
"parcel": {
"length": 12.0,
"width": 9.0,
"height": 3.0,
"weight": 39.0
}
},
"rates": [
{
"carrier": "USPS",
"service": "Priority",
"rate": "8.45",
"currency": "USD",
"est_delivery_days": 2,
"delivery_days": 2,
"delivery_date": "2024-08-16T17:00:00Z",
"delivery_date_guaranteed": false
},
{
"carrier": "USPS",
"service": "Express",
"rate": "28.50",
"currency": "USD",
"est_delivery_days": 1,
"delivery_days": 1,
"delivery_date": "2024-08-15T12:00:00Z",
"delivery_date_guaranteed": true
},
{
"carrier": "UPS",
"service": "Ground",
"rate": "12.75",
"currency": "USD",
"est_delivery_days": 3,
"delivery_days": 3,
"delivery_date": "2024-08-17T23:00:00Z",
"delivery_date_guaranteed": false
}
]
}
This endpoint calculates shipping rates for a set of SKUs using EasyPost. The system automatically determines the appropriate package type based on the items and calculates rates from multiple carriers.
POST https://turbine-sandbox.240tech.com/api/v3/shipments/calculate_rates
| Parameter | Required | Description |
|---|---|---|
| to_address | true | Destination address object |
| from_address | false | Origin address object (uses account default if not provided) |
| skus | true | Array of SKU objects with quantities |
| location_id | false | Specific location ID to use (defaults to account's first location) |
| Parameter | Required | Description |
|---|---|---|
| name | false | Recipient name |
| company | false | Company name |
| street1 | true | Primary street address |
| street2 | false | Apartment, suite, or additional address info |
| city | true | City name |
| state | true | State/province code (2 letters) |
| zip | true | Postal/ZIP code |
| country | false | Country code (defaults to "US") |
| phone | false | Contact phone number |
| false | Contact email address | |
| residential | false | Whether address is residential (affects some carrier rates) |
| Parameter | Required | Description |
|---|---|---|
| sku_code | conditional | SKU identifier (can be SKU identifier or SkuAlias). Required if gtin is not provided |
| gtin | conditional | GTIN/UPC lookup. Takes precedence over sku_code; if the GTIN finds no match, lookup falls back to sku_code. Required if sku_code is not provided |
| quantity | true | Number of items |
| decoration_type_name | false | Name of decoration type (e.g., "Screen Print", "Embroidery") |
The response contains two main sections:
Each rate object contains:
| Status Code | Meaning |
|---|---|
| 422 | Unprocessable Entity -- Missing required parameters, SKU not found, or no suitable package type |
| 503 | Service Unavailable -- EasyPost API error |
| 404 | Not Found -- SKU or location not found |
| 401 | Unauthorized -- Invalid or missing API token |
gtin provided — takes precedence over sku_code)sku_code or gtin; if both are provided and the GTIN finds no match, lookup falls back to sku_codeInstead of polling Order Status, Turbine can push the order to you every time its status changes.
Set your endpoint on the Settings → API Integration page, under Webhook Configuration. Enter your Webhook URL and click Save Webhook URL. Clearing the field turns webhooks off.
To notify more than one endpoint — for example while migrating from one integration to another — enter the URLs separated by commas. Turbine posts the same payload to each URL in turn.
POST https://your-domain.com/webhooks/turbine
Content-Type: application/json
Authorization: Token token=<your API key>
Requirements and behavior:
Authorization header on HTTPS (port 443) endpoints, so you can use it to verify the request came from us.POST with a JSON body.2xx status code. Turbine treats 404, 410 and 422 as permanent failures and does not retry; any other failure is retried in the background.id plus status.webhook_accepted or webhook_failed.Turbine sends the webhook on every change in order status, including:
shipments.You can also re-send the current state at any time from the order screen in Turbine using Resend Order Status.
Turbine can also send the webhook a second time once the carrier confirms delivery. When the carrier reports the package as delivered, the order is re-sent with delivered set to true on the matching shipment.
Delivery confirmation notifications are enabled per account — contact your account manager or admin@240tech.com to turn them on. They depend on carrier tracking updates, so they arrive whenever the carrier reports delivery and may lag the actual delivery by a few hours.
SKUs you submit through Create and Update SKUs are reviewed by Turbine staff before they go live. Set a SKU Webhook URL on the Settings → API Integration page to be told when that happens.
SKU webhooks use a separate URL from order webhooks, so you can point them at different handlers. They follow the same delivery rules: POST, JSON body, Authorization: Token token=<your API key> on HTTPS endpoints, and a 2xx response expected. Failed deliveries are retried in the background.
Two events are sent:
Only the account that submitted the SKU is notified. Nothing is sent when a submission is rejected, or for SKUs created by Turbine staff on your behalf.
{
"event": "sku_created",
"sku": {
"id": 197022,
"identifier": "BC3001-BLACK-M",
"brand": "Bella+Canvas",
"short_brand": "BC",
"supplier_identifier": "BC3001",
"color": "BLACK",
"size": "M",
"garment_type": "T-SHIRT",
"weight": "4.2",
"case_quantity": 72,
"garment_provider": "S&S Activewear",
"created_at": "2026-08-06T09:14:02-05:00",
"updated_at": "2026-08-06T11:47:19-05:00"
}
}
The sku object is the same payload as the SKU Search response. Use sku.id for subsequent API calls — the pending_sku_id you received on submission no longer exists.
The body is the same JSON as the Order Status response, so every field documented there applies. Check status for the order state and shipments for tracking and delivery — including the archived and related_orders notes documented there.
{
"id": 6724120,
"purchase_order": "5697626056",
"location_id": 1,
"sales_channel": "TikTok",
"sales_channel_id": null,
"organization_name": "Northeast Division",
"organization_id": "ORG-1042",
"status": "shipped",
"order_notes": "",
"fulfillment_notes": "",
"location": "Santa Ana",
"items": [
{
"id": 7,
"location_id": 1,
"customer_sku": "125737211",
"sku_id": 3668,
"description": "T-SHIRT",
"workflow_state": "shipped",
"quantity": 1,
"client_item_num": null,
"original_sku_id": 3668,
"neck_tag": false,
"printable": true,
"issues": null,
"sku": {
"id": 3668,
"brand": "Hanes",
"identifier": "5250_BLACK_L",
"supplier_identifier": "5250",
"color": "BLACK",
"size": "L",
"weight": "7.3",
"fleece": false,
"replacement_sku": null,
"garment_provider": "Alpha Broder",
"gtin": null,
"case_quantity": 72
},
"designs": [
{
"id": 5,
"location": "Front Center",
"file_name": "PR106086.tif",
"art_uri": "https://clientdomain.com/art/PR106086.tif",
"thumbnail_uri": "https://clientdomain.com/art/PR106086_thumb.jpg",
"width": "11.0",
"height": "13.28",
"resolution_ppi": "300.0"
}
],
"jobs": [
{
"id": 19,
"location_id": 1,
"workflow_state": "shipped",
"print_state": null,
"rip_processed": true,
"issues": null
}
]
}
],
"shipments": [
{
"id": 9047527,
"shipping_carrier": "DHL",
"shipping_method": "Smartmail Expedited",
"tracking_number": "9374869903500930473876",
"search_link": "https://webtrack.dhlglobalmail.com/?trackingnumber=9374869903500930473876",
"postage_amount": 6.25,
"delivered": true,
"archived": false,
"shipping_label_url": "https://turbine-demo.s3.us-west-1.amazonaws.com/shipment_labels/16/9047527/9047527-3258.pdf?X-Amz-Signature=...",
"created_at": "2020-02-02T10:04:11-08:00",
"shipped_at": "2020-02-02T12:21:24-08:00"
}
],
"order_status_notes": [],
"service_requests": [],
"related_orders": [],
"location_address": {
"company_name": "240tech Fulfillment",
"address": "123 Production Blvd",
"address_2": "Suite 100",
"city": "Santa Ana",
"state": "CA",
"zip_code": "92704",
"country": "US",
"email": "fulfillment@240tech.com",
"telephone": "800-555-1234"
},
"received_at": "2020-02-01T23:00:24-08:00",
"created_at": "2020-02-01T23:56:24-08:00",
"shipped_at": "2020-02-02T12:21:24-08:00",
"address": {
"ship_to_first_name": "Bob",
"ship_to_last_name": "Smith",
"ship_to_company_name": "The Turbine",
"ship_to_address": "123 Main St",
"ship_to_address_2": "Apt 1",
"ship_to_city": "Portland",
"ship_to_state": "OR",
"ship_to_zip_code": "97034",
"ship_to_country": "US",
"ship_to_email": "johnsmith@gmail.com",
"ship_to_telephone": "800-555-1212"
}
}
| Error Code | Meaning |
|---|---|
| 401 | Unauthorized -- Please check the Auth Token is valid and present in the HTTP header. |
| 404 | Not Found |
| 422 | Unprocessable Entity |
| 500 | Bad Request - Please check the JSON validity of the request here: https://jsonlint.com/. |
The following table lists all available print placement locations supported by Turbine. Print locations are approximate and artwork dimensions can affect the final position on the garment.
| Placement | Description |
|---|---|
| Back Layer | A secondary print layer on the back of the garment, typically used for layered or multi-color designs. |
| Back Oversize | An oversized print area covering a large portion of the back of the garment, ideal for DTF graphics. |
| Front Layer | A secondary print layer on the front of the garment, typically used for layered or multi-color designs. |
| Front Oversize | An oversized print area covering a large portion of the front of the garment, ideal for DTF graphics. |
| Full Back | Artwork will be printed on the back and center of the garment in a standard full-size print area. |
| Full Front | Artwork will be printed on the front and center of the garment in a standard full-size print area. |
| Left Chest | Artwork will be printed on the front left chest area of the garment, commonly used for logos and small designs. |
| Left Hem | Artwork will be printed near the bottom left hem of the front of the garment. |
| Left Leg | Artwork will be printed on the left leg area, typically used for pants, shorts, or joggers. |
| Left Sleeve | Artwork will be printed on the left sleeve of the garment. |
| Neck | Artwork will be printed on the interior or exterior neck area of the garment, often used for inside neck labels or back neck prints. |
| Pouch Pocket | Artwork will be printed on the pouch pocket area, typically found on hoodies and sweatshirts. |
| Right Chest | Artwork will be printed on the front right chest area of the garment. |
| Right Hem | Artwork will be printed near the bottom right hem of the front of the garment. |
| Right Leg | Artwork will be printed on the right leg area, typically used for pants, shorts, or joggers. |
| Right Sleeve | Artwork will be printed on the right sleeve of the garment. |
| Unknown | A catch-all placement for custom or non-standard print locations. Contact support for configuration. |
| Yoke | Artwork will be printed on the yoke area, which is the upper back section across the shoulders. |
The following table lists all available shipping providers supported by Turbine.
| Provider | Description |
|---|---|
| AsendiaUsa, Globegistics | Asendia USA international shipping service for lightweight packages and e-commerce shipments. |
| DhlEcs | DHL eCommerce Solutions for cost-effective international e-commerce shipping. |
| DHLExpress | DHL Express for time-definite international shipping with faster delivery times. |
| FedEx | FedEx shipping services for domestic and international delivery. |
| OSMWorldwideV2 | OSM Worldwide parcel delivery service for domestic shipments. |
| Pre-Paid | Customer-provided pre-paid shipping label. Turbine will use the label URL provided in the order. |
| UPS, UPSDAP | Standard UPS shipping services for domestic delivery. |
| UPSMailInnovations | UPS Mail Innovations for lightweight packages utilizing USPS for final mile delivery. |
| USPS | United States Postal Service for domestic and international mail and package delivery. |
| WillCall | Customer or designated party will pick up the order at the fulfillment location. |
Connect Claude, GPT, Cursor or any MCP-compatible agent to your Turbine data.
Log in to Turbine and go to Settings → MCP Tokens. Create a personal token — each user gets their own, so your account API key stays private.
Add the Turbine MCP server to your tool's config. Works with Claude Desktop, Cursor, Windsurf, and any MCP-compatible client.
Ask your AI to look up orders, check inventory, track shipments, or search the product catalog. All data is scoped to your account.
// Add to your MCP settings JSON { "mcpServers": { "turbine": { "url": "https://turbine-app.240tech.com/api/mcp", "headers": { "Authorization": "Bearer YOUR_MCP_TOKEN" } } } }
# List available tools curl -X POST https://turbine-app.240tech.com/api/mcp \ -H "Authorization: Bearer YOUR_MCP_TOKEN" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' # Search recent orders curl -X POST https://turbine-app.240tech.com/api/mcp \ -H "Authorization: Bearer YOUR_MCP_TOKEN" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":2,"method":"tools/call", "params":{"name":"search_orders", "arguments":{"limit":5}}}'
20 tools your AI agent can call via MCP.
| Tool | Description | Parameters |
|---|---|---|
| lookup_order | Look up an order by Turbine ID or purchase order number. Returns full details with items, jobs, shipments, and tracking. | order_id or purchase_order |
| search_orders | Search orders with filters. Returns paginated list with status, item count, and dates. | status, date_from, date_to, page, limit |
| track_shipment | Get shipment tracking — carrier, tracking number, URL, and delivery status. | order_id or tracking_number |
| search_skus | Search the product catalog by brand, style, color, or size. | brand, supplier_identifier, color, size |
| sku_price | Get pricing for a specific SKU including base cost and account markup. | sku_id or identifier |
| item_status | Get production status of an item — jobs, workflow states, decoration type, designs. | item_id or client_item_num |
| check_stock | Check inventory stock levels for a SKU across your locations. | identifier |
| search_jobs | Search production jobs with filters. Returns jobs sorted by SLA urgency. Defaults to active jobs. | status, account_name, decoration_type, sku_identifier, date_from, date_to, page, limit |
| get_production_dashboard | Comprehensive production dashboard — SLA status by account, order pipeline, daily volumes, machine status, bottleneck analysis. | none (manager/executive) |
| get_catalog_stats | Catalog statistics — total SKUs, stocked vs JIT breakdown, unique SKUs in production, top SKUs by shipped volume. | days |
| get_operator_stats | Operator performance — operations completed today, efficiency (jobs/hour), current activity, shift info. | none (manager/executive) |
| get_account_analytics | Detailed order analytics for a specific account — daily volumes, decoration type breakdown, JIT vs stocked vs mill-only sourcing. | account_name, days |
| get_sku_replacements | SKU substitution history — which SKUs were ordered vs. fulfilled, with frequency counts. Includes reorder-less and reorder-more summaries for sourcing decisions. | date_from, date_to, sku_identifier |
| get_stock_minimums | Stock minimum levels for daily sourcing — current stock, thresholds, amount on order, daily burn rate, days until stockout, recommended order quantities. | urgency, page, limit (manager/executive) |
| get_purchase_orders | Purchase order tracking — PO details with SKU breakdown, quantities ordered vs. received, and delivery status. Check what's already on order. | status, supplier, sku_identifier, page, limit (manager/executive) |
| get_reorder_recommendations | Smart reorder recommendations — combines stock levels, velocity, amounts on order, and substitution patterns. Applies 125-150% multiplier, rounds to case quantities, differentiates mill vs distributor. | urgency, supplier_type, supplier, limit (manager/executive) |
| debug | Deep production debug — pulls comprehensive data for an order, item, job, batch, or SKU including related records and activity history. | order_id, item_id, job_id, batch_id, sku_identifier (manager/executive) |
| ask | Ask a natural language question about your account data. AI-powered fallback for complex queries. | question |
| get_account_sku_breakdown | SKU distribution for an account's active jobs — stock levels, minimums, on-order amounts, batch tier distribution, and per-state job counts. For routing and sourcing prioritization. | account_name, limit (manager/executive) |
| get_bin_anomalies | Bin spot-check variability and inventory bin errors (no_stock, wrong_sku) for anomaly and trend detection. Returns recent activity plus aggregates by employee, SKU, and error type, with net/absolute quantity variance. | days, limit (manager/executive) |
Designed from the ground up for AI agent consumption.
Full Model Context Protocol support. Works out of the box with Claude Desktop, Cursor, Windsurf, and any MCP client.
Each user gets their own MCP token. Revoke or refresh individually without affecting the account API key or other users.
All queries scoped to your account. Parent accounts can view sub-account data. Zero cross-tenant data leakage.
Token roles (client, worker, manager, executive) automatically derived from user permissions. Right data for the right person.
Structured error responses with corrective hints so AI agents can self-correct and retry with better parameters.
Full REST API (v3) for programmatic access alongside MCP. OpenAPI docs for easy integration.
Contact support for your REST API key, or log in to create your own MCP token.
Get MCP Token OpenAPI Spec