Build on Turbine

Submit orders, track production, search products, and check inventory — through the REST API or MCP. Everything you need to integrate, in one place.

  REST API v3   MCP Native   Per-User Tokens   Multi-Tenant Secure

REST API

The Turbine API v3 — order submission, status, designs, SKUs, stock and shipping rates. Also available as an OpenAPI / Swagger spec.

Introduction

Welcome to the Turbine API documentation. If you have any questions please contact: admin@240tech.com

Format

This API supports JSON for requests and responses.

Getting Your Credentials

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:

  • API URL — the base URL for every request (e.g. https://turbine-app.240tech.com/api/v3/).
  • API Key — your account's token. Click Show to reveal it, Copy to copy it. Used in the Authorization header on every request.
  • Account ID — the account_id value sent in the body of a new order.
  • Account ZIP — the 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.

Authentication

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>

Account Identifier (Optional)

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>

New Order

Submit a new order request.

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

New Order Parameters

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:

  • USPS
  • UPS
  • FedEx
  • OSMWorldwideV2
  • Pre-Paid (use this if shipping_label_url is provided with a pre-paid label)

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.

  • first_name
  • last_name
  • company_name
  • address
  • address_2
  • city
  • state
  • zip_code
  • country
  • email
  • telephone

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.

  • first_name
  • last_name
  • company_name
  • address
  • address_2
  • city
  • state
  • zip_code
  • country

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.

  • quantity: Integer of 1 or greater.
  • decoration_type: The decoration type for the item. Options currently include: 'dtg', 'dtf', 'embroidery', 'laser_etching', and 'none'
  • sku: Internal Turbine SKU. Optional if attributes below are provided. The sku or attributes need to match a Turbine 'print_sku' or the order will be rejected.
  • attributes (optional if sku provided): If the sku is not provided, the attributes must be provided. Not all combinations are available. Refer to the Turbine SKUs list provided for your account.
    • style: Short identifier matching Turbine garment style.
    • color: Short identifier matching Turbine colors by style.
    • size: Short identifier matching Turbine size by style.
  • product_sku (optional): An identifier used in Turbine to create a product that includes a 'sku' and 'designs'. Must be pre-created in Turbine and will bypass the sku lookup.
  • gtin (optional): Global Trade Item Number (UPC/EAN barcode). Looked up before sku identifier, after product_sku. Case-insensitive match. Global SKUs are preferred over location-specific SKUs.
  • customer_sku (optional): For your internal tracking. Can be the item purchase order or a descriptive name for the item. This will be returned in order status notifications for each item.
  • item_reference_number (optional): For your internal tracking. Can be the item purchase order or a descriptive name for the item.
  • tech_pack_url (optional): URL to a tech pack or garment spec sheet. Turbine will retrieve it asynchronously from this url.
  • external_design_id (optional): Vendor's own design identifier (e.g., a sublimation vendor's internal design ID). Stored on the item for downstream routing and reporting. Can also be provided at the design level.
  • personalization_csv_url (optional): URL to a CSV file whose header row defines the required personalization field names for this item. Turbine stores the URL; we do not currently fetch or validate the CSV. Can also be provided at the design level.
  • customization_options (optional): Object containing dynamic key/value pairs for per-item personalization. Keys are field names (matching the 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 (optional): Reference an existing design from your account's design library. When provided, the design's artwork and settings will be reused. Use the GET /api/v3/designs endpoint to find available design IDs. If design_id is provided, art_url and thumbnail_url are not required.
  • placement: Unspecified is default and will result in a default placement print for the sku type. Print locations are approximate and any placement within the artwork can affect the position. Common default placements include:
    • 'Full Front' - Artwork will be printed on the front and center of the garment.
    • 'Full Back' - Artwork will be printed on the back and center of the garment.
    • 'Left Chest' - Artwork will be printed on the front and left chest area of the garment.
    • 'Right Chest' - Artwork will be printed on the front and right chest area of the garment.
    • 'Neck' - Artwork will be printed on the interior neck area of the garment.

For a complete list of all available print placement locations, see Print Placement Locations in the Appendix.

  • art_url: URL of print ready art. If art_file is not available locally, we will retrieve it asynchronously from this url. Supported formats include but are not limited to: PNG, TIFF, DST, and JPG. (Note: Transparent files are required for most decoration processes.)
  • thumbnail_url: URL to mockup or preview image of the product. We will retrieve it asynchronously from this url.
  • art_file (optional): Filename for print ready art. We will retrieve asynchronously from the art_url and name the retrieved file with this art_file name.
  • identifier (optional): Unique identifier string for the design. If matched to an existing identifier in your account, then the design will be reused.
  • underbase (optional): true (default) or false. Indicate whether a white underbase layer should be applied to the print for certain decoration types.
  • width (optional): decimal value in inches (in) to scale the artwork.
  • height (optional): decimal value in inches (in) to scale the artwork.
  • note (optional): Any additional information for the artwork team to review if using artwork customization or review.
  • x_offset (optional): integer in millimeters (mm) to place the artwork horizontally from the origin point of the printer. Only supported by some DTG printers.
  • y_offset (optional): integer in millimeters (mm) to place the artwork vertically from the origin point of the printer. Only supported by some DTG printers.
  • stitch_count (required for embroidery decoration type): integer value of the stitch count for embroidery designs.
  • tech_pack_url (optional): URL to a tech pack or design spec sheet for this specific design. Turbine will retrieve it asynchronously from this url.
  • external_design_id (optional): Vendor's own design identifier (e.g., a sublimation vendor's internal design ID). Stored on the design for downstream routing and reporting. Can also be provided at the item level.
  • personalization_csv_url (optional): URL to a CSV file whose header row defines the required personalization field names for this design. Turbine stores the URL; we do not currently fetch or validate the CSV. Can also be provided at the item level.
  • customization_options (optional): Object containing dynamic key/value pairs for per-design personalization. Keys are field names (matching the 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.

  • personalization_text: The text to be embroidered (e.g., a name or initials).
  • personalization_text_2 (optional): A second line of text to be embroidered (e.g., a jersey number).
  • personalization_font: The font style to use for the embroidered text.
  • personalization_color: The thread color for the personalized text.
  • personalization_size: The size of the personalized text.

design_process_steps (optional)
Array of one or more color steps for the design. Required for embroidery decoration type.

  • ordinal: Integer value of the step order.
  • color_code: PMS or Pantone color code for the thread color.
  • color_name: Name of the thread color.

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.

  • tag_code: Unique identifier string for a custom tag. If matched to an existing identifier in your account, then the custom tag settings will be reused.
  • tag_type: Type of custom tag to notify team of application type ie. 'hang tag', 'sticker'
  • image: Location of preview image of the custom tag. We will retrieve the image asynchronously from this url.
  • printable: Should this tag be printed on a label and affixed to the garment after production? Defaults to: false

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.

  • identifier: Unique identifier string for an insert. If matched to an existing identifier in your account, then the insert graphic will be reused.
  • preview_url: Location of preview image. We will retrieve the image asynchronously from this url.

easy_post_object (optional)
JSON representing overrides for easy post object values.

  • customs_info
    • contents_type: Contents declaration for international customs - Recommended values are: ["merchandise", "gift"]
    • customs_item_value: Float value of items to declare at customs, defaults to 5.00 if not specified.

New Order Response

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

Failed New Order Response Examples

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>"
}

Order Status

Request status of a single order

Order Status Arguments

id
Internal order id used by Turbine.

purchase_order
Customer purchase order provided with the order.

Order Status Request by Order ID

GET https://turbine-sandbox.240tech.com/api/v3/orders/<order_id>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Example Request by Order ID

GET https://turbine-sandbox.240tech.com/api/v3/orders/6724120
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Order Status Request by Purchase Order

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>

Example Request by Purchase Order

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>

Order Status Example Response

{
  "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.

  • company_name: The company name of the fulfillment facility.
  • address: The street address of the fulfillment facility.
  • address_2: Additional address line (suite, unit, etc.).
  • city: City of the fulfillment facility.
  • state: State or province of the fulfillment facility.
  • zip_code: Postal or zip code of the fulfillment facility.
  • country: Country code of the fulfillment facility.
  • email: Contact email for the fulfillment facility.
  • telephone: Contact phone number for the fulfillment facility.

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:

  • received - Order has been received and is enqueued.
  • production_hold - Order production location is being evaluated for optimal production.
  • intake_hold - Order is being reviewed for address, artwork and inventory availability.
  • open - The order is in production.
  • completed - All items in the order have been printed.
  • shipped - The order has been packaged and shipped.
  • canceled - The order was canceled on request.

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

  • id: Internal item id.
  • location_id: The id of the fulfillment location.
  • customer_sku: Customer-provided SKU name if provided.
  • sku_id: Internal sku id number in Turbine.
  • description: A description of the item garment type or sku.
  • workflow_state: Item workflow state can be:
    • production_hold - The item production location is being evaluated for optimal production.
    • intake_hold - Item order is being reviewed for address, artwork and inventory availability.
    • open - The item is in production.
    • completed - The item has been printed.
    • shipped - The item has been shipped.
    • canceled - The item was canceled on request.
  • quantity: The quantity ordered of an item.
  • client_item_num: The customer id number for the item to reference.
  • original_sku_id: The sku_id for the item. Used to store the sku id if replacement occurs via API or manually.
  • neck_tag: Whether the item has a neck tag - true or false.
  • printable: Is the item or sku printable or non-decorated - true or false.
  • issues: Item level issues preventing production.

sku
The sku of the item to be produced

  • id: The internal sku id.
  • brand: The brand of the sku item.
  • identifier: The string based identifier for the sku. Typically in style_color_size format.
  • supplier_identifier: The style string for the sku item.
  • color: The color of the sku item.
  • size: The size of the sku item.
  • weight: The weight of the sku used for shipping calculations.
  • fleece: For garment skus whether the garment is fleece. Impacts the inventory and printing systems - true or false.
  • replacement_sku: A replacement sku to use if the original sku ordered is out of stock or unorderable.
  • garment_provider: The supplier used for the sku to replenish inventory.
  • gtin: The global trade identification number of the sku to automate ordering and replenishment.
  • case_quantity: The number of skus included in an ordered case. Used in the inventory system.

designs
The designs attached to an item for use in printing

  • id: The internal design id.
  • location: The print location for the artwork - Front Center, Front Neck Center, Back Center
  • art: The file name of the artwork or design.
  • art_uri: The url of the printable artwork to be fetched to print.
  • thumbnail_uri: The url of the image of the decorated product to be fetched to print and quality control.
  • width: The width in inches of the artwork.
  • height: The height in inches of the artwork.
  • resolution_ppi: The calculated pixels per inch of the artwork file.

jobs
The jobs generated for production based on the item data submitted. Jobs are each unit to be produced.

  • id: The internal job id.
  • location_id: The id of the fulfillment location.
  • workflow_state: Job workflow state can be:
    • intake_hold - Job is being reviewed for address, artwork and inventory availability.
    • pending - Job is in a queue ready to be assigned to a pick batch
    • open - The job is in production.
    • labeled - Job is in a pick batch waiting to be picked.
    • picked - Job has been picked and assigned to an inventory unit. Ready to print.
    • scanned - Job has been scanned by an operator at the printer.
    • printed - Job has been printed and passed quality control.
    • completed - The job has been printed and is ready for consolidation or shipping.
    • shipped - The job has been shipped.
    • canceled - The job was canceled on request.
  • print_state: If a job has multiple prints - front and back - the print state is used to track the state - front_printed and back_printed.
  • rip_processed: Has the job gone through the RIP software and ready to print - true or false.
  • issues: Job level issues preventing production.

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.

  • shipping_carrier: The name of the shipping carrier.
  • shipping_method: Shipping method returned by the shipping provider.
  • tracking_number: Tracking number returned by the shipping provider for the package.
  • search_link: Link to shipping carrier website for tracking information and progress.
  • postage_amount: The cost in postage to ship an order when available from the carrier.
  • delivered: If tracking allows, a boolean with delivery confirmation.
  • archived: True when the shipment's label was voided or replaced. Ignore shipments where archived is true — their tracking numbers are dead. Only shipments with archived: false are live.
  • shipping_label_url: A presigned url to the shipping label generated for shipment.
  • created_at / shipped_at: ISO 8601 timestamps.

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.

  • ship_to_first_name
  • ship_to_last_name
  • ship_to_company_name
  • ship_to_address
  • ship_to_address_2
  • ship_to_city
  • ship_to_state
  • ship_to_zip_code
  • ship_to_country
  • ship_to_email
  • ship_to_telephone

order_status_notes
Manual and automated notes created during the production of an order

  • note: The text contents of the note created by our production staff or inventory system.
  • created_at: Timestamp of the date the note was created.

service_requests
A list of all order service requests in Turbine for an order

  • reason: The reason provided for the service request.
  • items_count: The number of items affected by the service request reason.
  • created_at: Timestamp of the date the note was created.
  • workflow_state: The status of the service request. Service Request workflow state can be:
    • open - The service request is open and enqueued to be reviewed.
    • rejected - A Turbine employee has rejected the request with a follow-up.
    • approved - The request has been approved and next steps are provided.
    • closed - The request has been closed and can be completed or reopened.
    • canceled - Customer has canceled the request.
    • completed - The request has been closed and now completed. A request can still be reopened if not satisfactory.

Order Status Response (no order found)

Status Code 404 Not Found

{
  "status": "not_found",
  "message": "An order with that ID cannot be located"
}

Multiple Order Status

Request status of 100 most recent orders, with pagination.

Multiple Order Status Request

GET https://turbine-sandbox.240tech.com/api/v3/orders
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Example Request

GET https://turbine-sandbox.240tech.com/api/v3/orders
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Multiple Order Status Response

{
  "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.

Additional Parameters

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.

Example Request with 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>

Example Request with Filters

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>

Order Notifications

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.

Update Order

Submit an order change request for the shipping carrier, shipping method, pre-provided label, shipping address or production priority.

Update Order Request

PUT https://turbine-sandbox.240tech.com/api/v3/orders/<order_id>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Update Order Example Request

PUT https://turbine-sandbox.240tech.com/api/v3/orders/7048816
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Update Order Parameters

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"
  }
}

Update Order Example Response

Response Parameters

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.

Update Order Success

{
  "status": "ok",
  "message": "Order 7048816 successfully updated.",
  "order": 7048816
}

Update Order Failure

{
  "status": "unprocessable_content",
  "message": "This order is already packaged or shipped and cannot be updated.",
  "order": 7048816
}

Cancel Order

Submit an order cancellation request.

Order Cancel Request

DELETE https://turbine-sandbox.240tech.com/api/v3/orders/<order_id>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Order Cancel Example Request

DELETE https://turbine-sandbox.240tech.com/api/v3/orders/7048816
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Order Cancel Example Response

Response Parameters

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.

Cancel Order Success

{
  "status": "ok",
  "message": "Order 7048816 successfully canceled.",
  "order": 7048816
}

Cancel Order Failure

{
  "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
}

Item Status

Request status of a single item

Item Status Arguments

id
Internal item id used by Turbine.

client_item_num
Customer client item number provided with the item.

Item Status Request by Item ID

GET https://turbine-sandbox.240tech.com/api/v3/items/<item_id>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Example Request by Item ID

GET https://turbine-sandbox.240tech.com/api/v3/items/6724120
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Item Status Request by Client Item Number

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>

Example Request by Client Item Number

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>

Item Status Example Response

{
    "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.

Item Status Response (no item found)

Status Code 404 Not Found

{
  "status": "not_found",
  "message": "An item with that ID cannot be located."
}

Update Item

Submit an update to an existing item.

Update Item Request

PUT https://turbine-sandbox.240tech.com/api/v3/items/2
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Update Item Request by Client Item Number

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>

Update Item Body

Example

{ "sku": "5250_BLACK_XL" }

sku
The sku identifier to update the item sku. Will be used to search for a valid sku.

Update Item Response

Status Code 200 OK

{
  "status": "ok",
  "message": "Item <item_id> successfully updated.",
  "item": <item_id>
}

Status Code 200 OK

Failed Update Item Response Examples

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>
}

Cancel Item

Submit an item cancellation request.

Item Cancel Request

DELETE https://turbine-sandbox.240tech.com/api/v3/items/<item_id>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Item Cancel Example Request

DELETE https://turbine-sandbox.240tech.com/api/v3/items/2
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Item Cancel Example Response

Response Parameters

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.

Cancel Item Success

{
  "status": "ok",
  "message": "Item 7048816 successfully canceled.",
  "item": 2
}

Cancel Item Failure

{
  "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
}

Job Status

Request status of a single job

Job Status Arguments

id
Internal job id used by Turbine.

Job Status Request by Job ID

GET https://turbine-sandbox.240tech.com/api/v3/jobs/<job_id>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Example Request by Job ID

GET https://turbine-sandbox.240tech.com/api/v3/jobs/6724120
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Job Status Example Response

{
    "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.

Job Status Response (no job found)

Status Code 404 Not Found

{
  "status": "not_found",
  "message": "A job with that ID cannot be located."
}

Cancel Job

Submit an job cancellation request.

Job Cancel Request

DELETE https://turbine-sandbox.240tech.com/api/v3/jobs/<job_id>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Job Cancel Example Request

DELETE https://turbine-sandbox.240tech.com/api/v3/jobs/2
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Job Cancel Example Response

Response Parameters

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.

Cancel Job Success

{
  "status": "ok",
  "message": "job 7048816 successfully canceled.",
  "job": 2
}

Cancel Job Failure

{
  "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
}

Designs

Search and retrieve designs from your account's design library. Designs can be reused across multiple orders by referencing their ID when creating orders.

List Designs Request

GET https://turbine-sandbox.240tech.com/api/v3/designs
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Query Parameters

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)

List Designs Example Request

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>

List Designs Example Response

Response Parameters

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 Single Design Request

GET https://turbine-sandbox.240tech.com/api/v3/designs/<design_id>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Path Parameters

design_id
The unique ID of the design to retrieve.

Get Single Design Example Request

GET https://turbine-sandbox.240tech.com/api/v3/designs/12345
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Get Single Design Example Response

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"
}

Design Not Found Response

Status Code 404 Not Found

{
    "status": "not_found",
    "message": "A design with this ID cannot be located in your account."
}

Using Designs in Order Creation

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.

Example Order with Design ID

{
    "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

Quote Status

Retrieve a list of updated quote invoice numbers.

Updated Quote List Request

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>

Updated Quote List Example Response

{
  "quotes": [
    "74",
    "75",
    "76"
  ]
}

Quote Status Request

Request status of a single quote

invoice_number
Internal quote id used by Turbine.

Quote Status Request by Invoice Number

GET https://turbine-sandbox.240tech.com/api/v3/quotes/<invoice_number>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Example Request by Invoice Number

GET https://turbine-sandbox.240tech.com/api/v3/quotes/74
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Quote Status Example Response

{
    "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.

Quote Status Response (no quote found)

Status Code 404 Not Found

{
  "status": "not_found",
  "message": "A quote with this id cannot be located in your account."
}

SKU Search

Search for available SKUs based on various criteria such as brand, supplier identifier, color, and size.

SKU Search Request

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.

Body Parameters

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")

SKU Search Example Request

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"
}

SKU Search Example Response

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": []
}

Response Parameters

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
    }
]

Single SKU Lookup

Retrieve detailed information for a specific SKU by its unique identifier.

Single SKU Request

GET https://turbine-sandbox.240tech.com/api/v3/skus/<sku_id>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Path Parameters

sku_id
The serialized id of the SKU to retrieve.

Single SKU Example Request

GET https://turbine-sandbox.240tech.com/api/v3/skus/197022
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Single SKU Example Response

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
}

SKU Price

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.

SKU Price Request

GET https://turbine-sandbox.240tech.com/api/v3/skus/<sku_id>/price Content-Type: application/json Authorization: Token token=<16-24 character API key>

Path Parameters

sku_id
The serialized id of the SKU to retrieve pricing for.

SKU Price Example Request

GET https://turbine-sandbox.240tech.com/api/v3/skus/197022/price Content-Type: application/json Authorization: Token token=<16-24 character API key>

SKU Price Example Response

Response Parameters

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"
}

Create and Update SKUs

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.

Create SKU Request

POST https://turbine-sandbox.240tech.com/api/v3/skus Content-Type: application/json Authorization: Token token=<16-24 character API key>

Required Parameters

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.

Optional Parameters

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.

Create SKU Example Request

{
  "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"
  }
}

Create SKU Example Response

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"
}

Update SKU Request

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.

Update SKU Example Request

{
  "sku": {
    "description": "Unisex Jersey Short Sleeve Tee",
    "case_quantity": 60
  }
}

Update SKU Example Response

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.

Create Brand

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"
}

Create Garment Provider

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"
}

Bulk Import

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.

Stock Check

Request the current inventory status by SKU identifier.

Stock Check Request

GET https://turbine-sandbox.240tech.com/api/v3/stocks/<sku_identifier>
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Stock Check Example Request

GET https://turbine-sandbox.240tech.com/api/v3/stocks/2001_BLACK_S
Content-Type: application/json
Authorization: Token token=<16-24 character API key>

Stock Check Example Response

Response Parameters

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": []
    }
  ]
}

Stock Search Request

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>

Request Parameters

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." }.

Stock Search Example Request

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>

Stock Search Example Response

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"
      ]
    }
  ]  
}

Shipping Rates

Calculate Shipping Rates

{
  "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.

HTTP Request

POST https://turbine-sandbox.240tech.com/api/v3/shipments/calculate_rates

Parameters

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)

Address Object

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
email false Contact email address
residential false Whether address is residential (affects some carrier rates)

SKU Object

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")

Response Fields

The response contains two main sections:

Package Object

  • name: The selected package type name
  • dimensions: The empty box dimensions (length, width, height, weight in oz)
  • parcel: The actual shipping parcel with total weight (box + items)

Rates Array

Each rate object contains:

  • carrier: Shipping carrier name (e.g., "USPS", "UPS", "FedEx")
  • service: Service level (e.g., "Priority", "Ground", "Express")
  • rate: Shipping cost as a string
  • currency: Currency code (typically "USD")
  • est_delivery_days: Estimated delivery days
  • delivery_days: Actual delivery days
  • delivery_date: Expected delivery date/time (ISO 8601 format)
  • delivery_date_guaranteed: Whether delivery date is guaranteed

Error Responses

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

Notes

  • SKU lookup follows this hierarchy:
    1. Global SKU by GTIN (if gtin provided — takes precedence over sku_code)
    2. Location-specific SKU by GTIN
    3. Global SKU by identifier (case-insensitive)
    4. Location-specific SKU by identifier
    5. Account-level SkuAlias
    6. Global SkuAlias
  • Each SKU entry must include either sku_code or gtin; if both are provided and the GTIN finds no match, lookup falls back to sku_code
  • The system automatically selects the best package type based on item quantity and decoration types
  • If no EasyPost configuration exists for the account, the endpoint returns an error
  • Rates are calculated in real-time from EasyPost and may vary based on current carrier pricing

Webhooks

Instead of polling Order Status, Turbine can push the order to you every time its status changes.

Webhook Setup

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:

  • The URL must be publicly reachable. HTTPS is strongly recommended — Turbine only sends the Authorization header on HTTPS (port 443) endpoints, so you can use it to verify the request came from us.
  • Requests are sent as POST with a JSON body.
  • Respond with a 2xx status code. Turbine treats 404, 410 and 422 as permanent failures and does not retry; any other failure is retried in the background.
  • Make your handler idempotent. Retries and duplicate deliveries are possible, and when several URLs are configured a retry re-posts to all of them. De-duplicate on the order id plus status.
  • Notifications are enqueued with a short delay and de-duplicated, so a burst of changes on one order may arrive as a single call with the latest state.
  • Deliveries are logged on the order's activity feed as webhook_accepted or webhook_failed.

Webhook Events

Turbine sends the webhook on every change in order status, including:

  • completed — all items in the order have been printed.
  • shipped — the order has been packaged and shipped; tracking numbers are included in shipments.
  • canceled — the order was canceled.

You can also re-send the current state at any time from the order screen in Turbine using Resend Order Status.

Webhook Delivery Confirmation

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.

SKU Webhooks

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:

  • sku_created — a SKU you submitted was approved and added to the catalog.
  • sku_updated — changes you submitted to an existing SKU were approved and applied.

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.

Webhook Payload

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"
  }
}

Errors

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/.

Appendix

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.

Shipping Providers

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.

MCP / AI Tools

Connect Claude, GPT, Cursor or any MCP-compatible agent to your Turbine data.

1

Get your MCP token

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.

2

Configure your AI tool

Add the Turbine MCP server to your tool's config. Works with Claude Desktop, Cursor, Windsurf, and any MCP-compatible client.

3

Start querying

Ask your AI to look up orders, check inventory, track shipments, or search the product catalog. All data is scoped to your account.

MCP Configuration

Claude Desktop / Cursor
// Add to your MCP settings JSON
{
  "mcpServers": {
    "turbine": {
      "url": "https://turbine-app.240tech.com/api/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_MCP_TOKEN"
      }
    }
  }
}
cURL
# 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}}}'

Available MCP Tools

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)

Built for AI

Designed from the ground up for AI agent consumption.

MCP Native

Full Model Context Protocol support. Works out of the box with Claude Desktop, Cursor, Windsurf, and any MCP client.

Per-User Tokens

Each user gets their own MCP token. Revoke or refresh individually without affecting the account API key or other users.

Multi-Tenant Secure

All queries scoped to your account. Parent accounts can view sub-account data. Zero cross-tenant data leakage.

Role-Aware

Token roles (client, worker, manager, executive) automatically derived from user permissions. Right data for the right person.

Agent-Friendly Errors

Structured error responses with corrective hints so AI agents can self-correct and retry with better parameters.

REST API + Docs

Full REST API (v3) for programmatic access alongside MCP. OpenAPI docs for easy integration.

Ready to connect?

Contact support for your REST API key, or log in to create your own MCP token.

Get MCP Token OpenAPI Spec