{
  "openapi": "3.1.0",
  "info": {
    "title": "Spectrum Integration API",
    "version": "v1",
    "description": "Public integration API for the Spectrum product customizer. Covers order acknowledgement and management, pricing & availability, saved assets, image rendering, web-to-print, design sharing, and user administration. All requests are authenticated with the `SPECTRUM_API_TOKEN` header."
  },
  "servers": [
    {
      "url": "https://api.spectrumcustomizer.com",
      "description": "Production"
    }
  ],
  "tags": [
    {
      "name": "Orders",
      "description": "Order acknowledgement, status, shipment and search."
    },
    {
      "name": "Pricing & Availability",
      "description": "Product availability and pricing adjustments."
    },
    {
      "name": "Assets",
      "description": "Saved uploaded assets (e.g. customer artwork)."
    },
    {
      "name": "Rendering",
      "description": "Generated / rendered images of customized products."
    },
    {
      "name": "Web-to-Print",
      "description": "Print-ready output generation and retrieval."
    },
    {
      "name": "Share",
      "description": "Share customized designs via email and SMS."
    },
    {
      "name": "Users",
      "description": "User invitation and credential verification."
    }
  ],
  "security": [
    {
      "SpectrumApiToken": []
    }
  ],
  "paths": {
    "/api/order/acknowledgement": {
      "post": {
        "tags": [
          "Orders"
        ],
        "operationId": "acknowledgeOrder",
        "summary": "Acknowledge a single order",
        "description": "Submit (acknowledge) a single purchase order into Spectrum. Requires an API token.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OrderAcknowledgementApiModel"
              },
              "example": {
                "purchaseOrderNumber": "PO-100245",
                "orderDate": "2026-06-30T14:05:00Z",
                "accountNumber": "ACCT-9910",
                "organizationId": "org-4471",
                "emailAddress": "jane.doe@example.com",
                "orderReference": "WEB-55231",
                "phoneNumber": "+1-555-201-3345",
                "priority": 2,
                "fulfillmentType": "DirectToConsumer",
                "shippingAddress": {
                  "firstName": "Jane",
                  "lastName": "Doe",
                  "address1": "123 Market St",
                  "city": "Portland",
                  "state": "OR",
                  "postalCode": "97201",
                  "country": "US"
                },
                "recipeSets": [
                  {
                    "recipeSetId": "rs-abc123",
                    "skuQuantities": [
                      {
                        "sku": "SHOE-BLK-10",
                        "quantity": 1
                      }
                    ]
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Order accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrderAcknowledgementStatusApiModel"
                }
              }
            }
          },
          "404": {
            "description": "Referenced recipe set not found.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "description": "The purchase order has already been submitted.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "description": "Server error while processing the order.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/order/acknowledgements": {
      "post": {
        "tags": [
          "Orders"
        ],
        "operationId": "acknowledgeOrders",
        "summary": "Acknowledge multiple orders",
        "description": "Submit a batch of purchase orders in a single request.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/OrderAcknowledgementApiModel"
                }
              },
              "example": [
                {
                  "purchaseOrderNumber": "PO-100245",
                  "orderDate": "2026-06-30T14:05:00Z",
                  "accountNumber": "ACCT-9910",
                  "organizationId": "org-4471",
                  "emailAddress": "jane.doe@example.com",
                  "orderReference": "WEB-55231",
                  "phoneNumber": "+1-555-201-3345",
                  "priority": 2,
                  "fulfillmentType": "DirectToConsumer",
                  "shippingAddress": {
                    "firstName": "Jane",
                    "lastName": "Doe",
                    "address1": "123 Market St",
                    "city": "Portland",
                    "state": "OR",
                    "postalCode": "97201",
                    "country": "US"
                  },
                  "recipeSets": [
                    {
                      "recipeSetId": "rs-abc123",
                      "skuQuantities": [
                        {
                          "sku": "SHOE-BLK-10",
                          "quantity": 1
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          }
        },
        "responses": {
          "200": {
            "description": "All orders accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/OrderAcknowledgementStatusApiModel"
                  }
                }
              }
            }
          },
          "404": {
            "description": "Referenced recipe set not found.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "description": "A purchase order has already been submitted.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "description": "One or more orders failed to process.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/order": {
      "post": {
        "tags": [
          "Orders"
        ],
        "operationId": "acknowledgeOrderWithCustomerInfo",
        "summary": "Acknowledge an order with customer information",
        "description": "Submit a single purchase order including customer/shipping information.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OrderAcknowledgementApiModel"
              },
              "example": {
                "purchaseOrderNumber": "PO-100245",
                "orderDate": "2026-06-30T14:05:00Z",
                "accountNumber": "ACCT-9910",
                "organizationId": "org-4471",
                "emailAddress": "jane.doe@example.com",
                "orderReference": "WEB-55231",
                "phoneNumber": "+1-555-201-3345",
                "priority": 2,
                "fulfillmentType": "DirectToConsumer",
                "shippingAddress": {
                  "firstName": "Jane",
                  "lastName": "Doe",
                  "address1": "123 Market St",
                  "city": "Portland",
                  "state": "OR",
                  "postalCode": "97201",
                  "country": "US"
                },
                "recipeSets": [
                  {
                    "recipeSetId": "rs-abc123",
                    "skuQuantities": [
                      {
                        "sku": "SHOE-BLK-10",
                        "quantity": 1
                      }
                    ]
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Order accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrderAcknowledgementStatusApiModel"
                }
              }
            }
          },
          "404": {
            "description": "Referenced recipe set not found.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "description": "The purchase order has already been submitted.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "description": "Server error while processing the order.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/order/ship-notification": {
      "post": {
        "tags": [
          "Orders"
        ],
        "operationId": "updateShipNotification",
        "summary": "Update shipment tracking",
        "description": "Attach shipment tracking information to the line items of an existing order.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ShipNotificationApiModel"
              },
              "example": {
                "purchaseOrderNumber": "PO-100245",
                "lineItems": [
                  {
                    "recipeSetReadableId": "rs-abc123",
                    "shipmentTracking": "1Z999AA10123456784",
                    "shipmentVendor": "UPS",
                    "serialNumbers": [
                      "SN-0001"
                    ]
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Tracking updated.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateShipNotificationResultApiModel"
                }
              }
            }
          },
          "404": {
            "description": "Order or line item(s) not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateShipNotificationResultApiModel"
                }
              }
            }
          },
          "500": {
            "description": "Server error while processing the ship notification.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/order/status": {
      "post": {
        "tags": [
          "Orders"
        ],
        "operationId": "updateOrderWorkflowStatus",
        "summary": "Update order workflow status",
        "description": "Update the workflow (production) status of one or more line items of an order.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkflowStatusApiModel"
              },
              "example": {
                "purchaseOrderNumber": "PO-100245",
                "lineItems": [
                  {
                    "recipeSetReadableId": "rs-abc123",
                    "workflowStatus": "completed"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Workflow status updated.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateShipNotificationResultApiModel"
                }
              }
            }
          },
          "404": {
            "description": "Order or line item(s) not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateShipNotificationResultApiModel"
                }
              }
            }
          },
          "500": {
            "description": "Server error while updating workflow status.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Orders"
        ],
        "operationId": "updateOrderWorkflowStatusPut",
        "summary": "Update order workflow status (PUT)",
        "description": "Update the workflow (production) status of one or more line items of an order.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkflowStatusApiModel"
              },
              "example": {
                "purchaseOrderNumber": "PO-100245",
                "lineItems": [
                  {
                    "recipeSetReadableId": "rs-abc123",
                    "workflowStatus": "completed"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Workflow status updated.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateShipNotificationResultApiModel"
                }
              }
            }
          },
          "404": {
            "description": "Order or line item(s) not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateShipNotificationResultApiModel"
                }
              }
            }
          },
          "500": {
            "description": "Server error while updating workflow status.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/orders/client/{clientHandle}/from-date/{fromDate}/status/{status}": {
      "get": {
        "tags": [
          "Orders"
        ],
        "operationId": "getOrderedRecipeSets",
        "summary": "List ordered recipe set IDs by status",
        "description": "Return the IDs of recipe sets for a client that have a given status since a given date.",
        "parameters": [
          {
            "name": "clientHandle",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "required": true,
            "description": "Client handle."
          },
          {
            "name": "fromDate",
            "in": "path",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "required": true,
            "description": "Return recipe sets modified on or after this date."
          },
          {
            "name": "status",
            "in": "path",
            "schema": {
              "$ref": "#/components/schemas/RecipeStatuses"
            },
            "required": true,
            "description": "RecipeSet status to filter by."
          },
          {
            "name": "idType",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/IdType"
            },
            "required": false,
            "description": "Identifier type to return (Guid or Readable). Defaults to Guid."
          }
        ],
        "responses": {
          "200": {
            "description": "List of recipe set identifiers.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/order/order-number/{purchaseOrderNumber}": {
      "get": {
        "tags": [
          "Orders"
        ],
        "operationId": "getOrderByNumber",
        "summary": "Get an order by purchase order number",
        "description": "Retrieve a full purchase order by its purchase order number.",
        "parameters": [
          {
            "name": "purchaseOrderNumber",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "required": true,
            "description": "Purchase order number."
          }
        ],
        "responses": {
          "200": {
            "description": "The purchase order.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PurchaseOrderApiModel"
                }
              }
            }
          },
          "404": {
            "description": "Purchase order not found.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "description": "Server error.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/orders/search": {
      "post": {
        "tags": [
          "Orders"
        ],
        "operationId": "searchOrders",
        "summary": "Search orders by modification date and status",
        "description": "Return purchase orders modified within a date range and matching the given workflow statuses.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OrderSearchModel"
              },
              "example": {
                "lastModificationStartDate": "2026-06-01T00:00:00Z",
                "lastModificationEndDate": "2026-06-30T23:59:59Z",
                "workflowStatuses": [
                  "in-progress",
                  "completed"
                ],
                "ignoreDateRestriction": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Matching purchase orders.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PurchaseOrderApiModel"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Date range exceeds the allowed maximum (31 days).",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "description": "Server error.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/availability": {
      "get": {
        "tags": [
          "Pricing & Availability"
        ],
        "operationId": "getAvailability",
        "summary": "Availability overview",
        "description": "Returns the availability adjustments overview page for all clients. Requires Spectrum authorization.",
        "responses": {
          "200": {
            "description": "Availability overview page.",
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "description": "Not authorized.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/availability/details/{clientHandle}": {
      "get": {
        "tags": [
          "Pricing & Availability"
        ],
        "operationId": "getAvailabilityDetails",
        "summary": "Availability details for a client",
        "description": "Returns product set pricing and availability adjustments for a single client. Requires a valid API token for the client.",
        "parameters": [
          {
            "name": "clientHandle",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "required": true,
            "description": "Client handle."
          }
        ],
        "responses": {
          "200": {
            "description": "Availability details page.",
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "description": "Not authorized.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/assets/saved/client/{clientHandle}/organization/{clientIdentifier}": {
      "get": {
        "tags": [
          "Assets"
        ],
        "operationId": "getSavedAssetsForOrganization",
        "summary": "List saved assets for an organization",
        "description": "Return a pageable list of saved uploaded assets for a client's organization identifier.",
        "parameters": [
          {
            "name": "clientHandle",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "required": true,
            "description": "Client handle."
          },
          {
            "name": "clientIdentifier",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "required": true,
            "description": "Organization / client account identifier."
          },
          {
            "name": "includeUploadedAssets",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "required": false,
            "description": "Include full uploaded asset details. Defaults to false."
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "required": false,
            "description": "1-based page number."
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "required": false,
            "description": "Page size. Omit to disable paging."
          },
          {
            "name": "service",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "Optional service filter."
          },
          {
            "name": "sortOrder",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "Sort order (e.g. RecentlyUsed)."
          }
        ],
        "responses": {
          "200": {
            "description": "Pageable list of saved assets.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/SavedUploadedAssetApiModel"
                      }
                    },
                    "paging": {
                      "type": "object",
                      "additionalProperties": true
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/assets/saved/{id}": {
      "get": {
        "tags": [
          "Assets"
        ],
        "operationId": "getSavedAsset",
        "summary": "Get a saved asset by ID",
        "description": "Return a single saved uploaded asset by its numeric ID.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "required": true,
            "description": "Saved asset ID."
          }
        ],
        "responses": {
          "200": {
            "description": "The saved asset.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SavedUploadedAssetApiModel"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Saved asset not found.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "description": "Server error.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/assets/generated/recipeset/readable/{readableId}/{viewAngleHandle}": {
      "get": {
        "tags": [
          "Rendering"
        ],
        "operationId": "getGeneratedRecipeSetImage",
        "summary": "Render a generated image for a recipe set",
        "description": "Generate (or return a cached) rendered image of a customized recipe set from a given view angle. Optional path/query segments allow specifying render state, camera, dimensions and caching. Additional query-string parameters control image manipulation (see the Image QueryString API docs).",
        "parameters": [
          {
            "name": "readableId",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "required": true,
            "description": "RecipeSet readable ID."
          },
          {
            "name": "viewAngleHandle",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "required": true,
            "description": "View angle handle (e.g. 'north')."
          },
          {
            "name": "renderStateHandle",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "Optional render state handle."
          },
          {
            "name": "camera",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "Optional camera handle."
          },
          {
            "name": "width",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "required": false,
            "description": "Optional output width in pixels."
          },
          {
            "name": "height",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "required": false,
            "description": "Optional output height in pixels."
          },
          {
            "name": "useCache",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "required": false,
            "description": "Whether to use the render cache. Defaults to true."
          }
        ],
        "responses": {
          "200": {
            "description": "The rendered image.",
            "content": {
              "image/png": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "image/jpeg": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "404": {
            "description": "RecipeSet not found.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "description": "Server error while rendering.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/webtoprint/{recipeSetReadableId}": {
      "get": {
        "tags": [
          "Web-to-Print"
        ],
        "operationId": "getWebToPrintByReadableId",
        "summary": "Get web-to-print output by recipe set readable ID",
        "description": "Check the status of, and if complete retrieve, the web-to-print output for a recipe set.",
        "parameters": [
          {
            "name": "recipeSetReadableId",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "required": true,
            "description": "RecipeSet readable ID (or GUID)."
          },
          {
            "name": "priority",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/SpectrumPriorities"
            },
            "required": false,
            "description": "Job priority. Defaults to Normal (2)."
          }
        ],
        "responses": {
          "200": {
            "description": "Web-to-print output is ready (URL or content).",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "202": {
            "description": "The web-to-print job is still processing.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "303": {
            "description": "Redirect to the completed web-to-print output.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "description": "Bad request.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "description": "RecipeSet is not available for lookup.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "RecipeSet not found.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "description": "Server error.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/webtoprint/uuid/{recipeUuid}": {
      "get": {
        "tags": [
          "Web-to-Print"
        ],
        "operationId": "getWebToPrintByUuid",
        "summary": "Get web-to-print output by recipe set UUID",
        "description": "Check the status of, and if complete retrieve, the web-to-print output for a recipe set by UUID.",
        "parameters": [
          {
            "name": "recipeUuid",
            "in": "path",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true,
            "description": "RecipeSet UUID."
          },
          {
            "name": "priority",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/SpectrumPriorities"
            },
            "required": false,
            "description": "Job priority. Defaults to Normal (2)."
          }
        ],
        "responses": {
          "200": {
            "description": "Web-to-print output is ready (URL or content).",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "202": {
            "description": "The web-to-print job is still processing.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "303": {
            "description": "Redirect to the completed web-to-print output.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "description": "Bad request.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "description": "RecipeSet is not available for lookup.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "RecipeSet not found.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "description": "Server error.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/webtoprint/{recipeSetReadableId}/location/{location}": {
      "get": {
        "tags": [
          "Web-to-Print"
        ],
        "operationId": "getWebToPrintLocation",
        "summary": "Get web-to-print output for a specific location",
        "description": "Retrieve the web-to-print output for a specific location (part) of a recipe set.",
        "parameters": [
          {
            "name": "recipeSetReadableId",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "required": true,
            "description": "RecipeSet readable ID (or GUID)."
          },
          {
            "name": "location",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "required": true,
            "description": "Location (part) of the recipe set."
          }
        ],
        "responses": {
          "202": {
            "description": "The web-to-print job is still processing.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "303": {
            "description": "Redirect to the completed web-to-print output.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "description": "Bad request.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "description": "RecipeSet is not available for lookup.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "RecipeSet not found.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "description": "Server error.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/share/send": {
      "post": {
        "tags": [
          "Share"
        ],
        "operationId": "sendShare",
        "summary": "Share a design via email/SMS",
        "description": "Send a link to a customized recipe set to one or more email addresses and/or phone numbers.",
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserShareApiModel"
              },
              "example": {
                "emailAddresses": [
                  "friend@example.com"
                ],
                "phoneNumbers": [
                  "+15552013345"
                ],
                "recipeSetReadableId": "rs-abc123",
                "locale": "en-US"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Share sent (or nothing to send)."
          },
          "401": {
            "description": "RecipeSet is not available for sharing.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "RecipeSet not found.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "description": "Server error while sharing.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/user/invite": {
      "post": {
        "tags": [
          "Users"
        ],
        "operationId": "inviteUser",
        "summary": "Invite a user",
        "description": "Invite a new user to the current client account. Requires an Admin or Spectrum Admin role.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InviteUserViewModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The invited user.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "object",
                      "additionalProperties": true
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "User could not be added.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/user/invite/{userId}": {
      "get": {
        "tags": [
          "Users"
        ],
        "operationId": "resendInvite",
        "summary": "Resend a user invitation email",
        "description": "Resend the invitation email to a user who has not yet accepted. Requires an Admin or Spectrum Admin role.",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "required": true,
            "description": "User ID."
          }
        ],
        "responses": {
          "200": {
            "description": "Invitation email resent (if applicable)."
          }
        }
      }
    },
    "/api/user/check-credentials": {
      "post": {
        "tags": [
          "Users"
        ],
        "operationId": "checkCredentials",
        "summary": "Verify user credentials",
        "description": "Verify an email/password combination and return the matching user ID if valid.",
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CredentialsModel"
              },
              "example": {
                "email": "user@example.com",
                "password": "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The matching user ID, or null if invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "SpectrumApiToken": {
        "type": "apiKey",
        "in": "header",
        "name": "SPECTRUM_API_TOKEN",
        "description": "Spectrum API token. Send it in the SPECTRUM_API_TOKEN request header."
      }
    },
    "schemas": {
      "WorkflowStatuses": {
        "type": "string",
        "description": "Workflow/production status of a line item.",
        "enum": [
          "not-started",
          "user-proof-requested",
          "in-progress",
          "in-progress-step-1",
          "completed",
          "revision",
          "on-hold",
          "approved",
          "released",
          "delivered",
          "cancelled"
        ]
      },
      "OrderTypes": {
        "type": "string",
        "enum": [
          "self",
          "gift",
          "internal-marketing"
        ]
      },
      "ProductionStatuses": {
        "type": "string",
        "enum": [
          "unprocessed",
          "print-started",
          "print-completed",
          "submitted",
          "in-progress",
          "completed",
          "approved",
          "cancelled"
        ]
      },
      "ProofStatuses": {
        "type": "string",
        "enum": [
          "Requested",
          "Fulfilled"
        ]
      },
      "FulfillmentType": {
        "type": "string",
        "description": "Fulfillment channel for the order.",
        "enum": [
          "DirectToConsumer",
          "BusinessToBusiness",
          "Kiosk"
        ]
      },
      "SpectrumPriorities": {
        "type": "integer",
        "format": "int32",
        "description": "Processing priority. 0=Lowest, 1=Lower, 2=Normal, 3=Higher, 4=Highest.",
        "enum": [
          0,
          1,
          2,
          3,
          4
        ]
      },
      "ProofStatusCode": {
        "type": "integer",
        "format": "int32",
        "description": "Proof status. 1=Requested, 2=Fulfilled.",
        "enum": [
          1,
          2
        ]
      },
      "RecipeStatuses": {
        "type": "string",
        "description": "RecipeSet lifecycle status.",
        "enum": [
          "Created",
          "Ordered",
          "Fulfilled",
          "Processing",
          "ProcessingWebToPrintInitiated",
          "ProcessingWebToPrintCompleted",
          "ProcessingWebToPrintApproved",
          "OnHold",
          "ProcessingFailure",
          "ProcessingComplete",
          "Cancelled"
        ]
      },
      "IdType": {
        "type": "string",
        "enum": [
          "Guid",
          "Readable"
        ]
      },
      "CustomOrderAddressModel": {
        "type": "object",
        "properties": {
          "firstName": {
            "type": [
              "string",
              "null"
            ]
          },
          "lastName": {
            "type": [
              "string",
              "null"
            ]
          },
          "address1": {
            "type": [
              "string",
              "null"
            ]
          },
          "address2": {
            "type": [
              "string",
              "null"
            ]
          },
          "city": {
            "type": [
              "string",
              "null"
            ]
          },
          "state": {
            "type": [
              "string",
              "null"
            ]
          },
          "province": {
            "type": [
              "string",
              "null"
            ]
          },
          "postalCode": {
            "type": [
              "string",
              "null"
            ]
          },
          "country": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "description": "Customer or shipping address."
      },
      "SkuQuantityModel": {
        "type": "object",
        "properties": {
          "sku": {
            "type": [
              "string",
              "null"
            ]
          },
          "quantity": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "RecipeSetSkuQuantityModel": {
        "type": "object",
        "properties": {
          "recipeSetId": {
            "type": [
              "string",
              "null"
            ]
          },
          "recipeSetUuid": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "skuQuantities": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/SkuQuantityModel"
            }
          }
        }
      },
      "SkuQuantityApiModel": {
        "type": "object",
        "properties": {
          "sku": {
            "type": [
              "string",
              "null"
            ]
          },
          "quantity": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "ComponentApiModel": {
        "type": "object",
        "properties": {
          "name": {
            "type": [
              "string",
              "null"
            ]
          },
          "clientIdentifier": {
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "quantity": {
            "type": "integer",
            "format": "int32"
          },
          "unitPrice": {
            "type": "number",
            "format": "double"
          }
        }
      },
      "LineItemApiModel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "recipeSetId": {
            "type": [
              "string",
              "null"
            ]
          },
          "recipeSetUuid": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "externalLineItemId": {
            "type": [
              "string",
              "null"
            ]
          },
          "giftMessage": {
            "type": [
              "string",
              "null"
            ]
          },
          "workflowStatus": {
            "$ref": "#/components/schemas/WorkflowStatuses"
          },
          "proofStatus": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ProofStatuses"
              },
              {
                "type": "null"
              }
            ]
          },
          "isReorder": {
            "type": "boolean"
          },
          "lastModification": {
            "type": "string",
            "format": "date-time"
          },
          "shipmentVendor": {
            "type": [
              "string",
              "null"
            ]
          },
          "shipmentTracking": {
            "type": [
              "string",
              "null"
            ]
          },
          "sku": {
            "type": [
              "string",
              "null"
            ]
          },
          "quantity": {
            "type": "integer",
            "format": "int32"
          },
          "unitPrice": {
            "type": "number",
            "format": "double"
          },
          "size": {
            "type": [
              "string",
              "null"
            ]
          },
          "productName": {
            "type": [
              "string",
              "null"
            ]
          },
          "estimatedDeliveryDate": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "skuQuantities": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/SkuQuantityApiModel"
            }
          },
          "components": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/ComponentApiModel"
            }
          },
          "serialNumbers": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            }
          }
        },
        "description": "A single ordered line item."
      },
      "OrderAcknowledgementApiModel": {
        "type": "object",
        "properties": {
          "purchaseOrderNumber": {
            "type": [
              "string",
              "null"
            ]
          },
          "orderDate": {
            "type": "string",
            "format": "date-time"
          },
          "accountNumber": {
            "type": [
              "string",
              "null"
            ]
          },
          "organizationId": {
            "type": [
              "string",
              "null"
            ]
          },
          "emailAddress": {
            "type": [
              "string",
              "null"
            ]
          },
          "orderReference": {
            "type": [
              "string",
              "null"
            ]
          },
          "customerServiceContact": {
            "type": [
              "string",
              "null"
            ]
          },
          "phoneNumber": {
            "type": [
              "string",
              "null"
            ]
          },
          "serialNumber": {
            "type": [
              "string",
              "null"
            ]
          },
          "proofStatus": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ProofStatusCode"
              },
              {
                "type": "null"
              }
            ]
          },
          "priority": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SpectrumPriorities"
              },
              {
                "type": "null"
              }
            ]
          },
          "fulfillmentType": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FulfillmentType"
              },
              {
                "type": "null"
              }
            ]
          },
          "customerAddress": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CustomOrderAddressModel"
              },
              {
                "type": "null"
              }
            ]
          },
          "shippingAddress": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CustomOrderAddressModel"
              },
              {
                "type": "null"
              }
            ]
          },
          "recipeSets": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/RecipeSetSkuQuantityModel"
            }
          },
          "lineItems": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/LineItemApiModel"
            }
          }
        },
        "description": "Payload used to acknowledge (submit) a purchase order into Spectrum."
      },
      "SubmissionStatus": {
        "type": "object",
        "properties": {
          "recipeSetId": {
            "type": [
              "string",
              "null"
            ]
          },
          "success": {
            "type": "boolean"
          },
          "message": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "OrderAcknowledgementStatusApiModel": {
        "type": "object",
        "properties": {
          "purchaseOrderNumber": {
            "type": [
              "string",
              "null"
            ]
          },
          "statuses": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/SubmissionStatus"
            }
          },
          "allSuccessful": {
            "type": "boolean",
            "readOnly": true
          }
        },
        "description": "Result of an order acknowledgement submission."
      },
      "ShipNotificationLineItemApiModel": {
        "type": "object",
        "properties": {
          "recipeSetReadableId": {
            "type": [
              "string",
              "null"
            ]
          },
          "shipmentTracking": {
            "type": [
              "string",
              "null"
            ]
          },
          "shipmentVendor": {
            "type": [
              "string",
              "null"
            ]
          },
          "serialNumbers": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            }
          }
        }
      },
      "ShipNotificationApiModel": {
        "type": "object",
        "properties": {
          "purchaseOrderNumber": {
            "type": [
              "string",
              "null"
            ]
          },
          "lineItems": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/ShipNotificationLineItemApiModel"
            }
          }
        },
        "description": "Shipment tracking update for one or more line items of an order."
      },
      "WorkflowStatusLineItemApiModel": {
        "type": "object",
        "properties": {
          "recipeSetReadableId": {
            "type": [
              "string",
              "null"
            ]
          },
          "workflowStatus": {
            "$ref": "#/components/schemas/WorkflowStatuses"
          }
        }
      },
      "WorkflowStatusApiModel": {
        "type": "object",
        "properties": {
          "purchaseOrderNumber": {
            "type": [
              "string",
              "null"
            ]
          },
          "lineItems": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/WorkflowStatusLineItemApiModel"
            }
          }
        },
        "description": "Workflow status update for one or more line items of an order."
      },
      "PurchaseOrderApiModel": {
        "type": "object",
        "properties": {
          "emailAddress": {
            "type": [
              "string",
              "null"
            ]
          },
          "phoneNumber": {
            "type": [
              "string",
              "null"
            ]
          },
          "clientHandle": {
            "type": [
              "string",
              "null"
            ]
          },
          "purchaseOrderNumber": {
            "type": [
              "string",
              "null"
            ]
          },
          "orderDateTime": {
            "type": "string",
            "format": "date-time"
          },
          "productionStartDateTime": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "dateDeliveredToFactory": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "customerAddress": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CustomOrderAddressModel"
              },
              {
                "type": "null"
              }
            ]
          },
          "shippingAddress": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CustomOrderAddressModel"
              },
              {
                "type": "null"
              }
            ]
          },
          "locale": {
            "type": [
              "string",
              "null"
            ]
          },
          "orderType": {
            "$ref": "#/components/schemas/OrderTypes"
          },
          "orderStatus": {
            "$ref": "#/components/schemas/ProductionStatuses"
          },
          "userId": {
            "type": [
              "string",
              "null"
            ]
          },
          "accountId": {
            "type": [
              "string",
              "null"
            ]
          },
          "organizationId": {
            "type": [
              "string",
              "null"
            ]
          },
          "message": {
            "type": [
              "string",
              "null"
            ]
          },
          "metadata": {
            "type": [
              "string",
              "null"
            ]
          },
          "shipmentTrackingNumber": {
            "type": [
              "string",
              "null"
            ]
          },
          "customerServiceContact": {
            "type": [
              "string",
              "null"
            ]
          },
          "lineItems": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/LineItemApiModel"
            }
          }
        },
        "description": "A full purchase order as stored in Spectrum."
      },
      "OrderSearchModel": {
        "type": "object",
        "properties": {
          "lastModificationStartDate": {
            "type": "string",
            "format": "date-time"
          },
          "lastModificationEndDate": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "workflowStatuses": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/WorkflowStatuses"
            }
          },
          "ignoreDateRestriction": {
            "type": "boolean"
          }
        },
        "description": "Search criteria for finding modified orders. Date range is limited to 31 days unless ignoreDateRestriction is true."
      },
      "UpdateShipNotificationResultApiModel": {
        "type": "object",
        "properties": {
          "purchaseOrderNumber": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": [
              "string",
              "null"
            ]
          },
          "details": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "description": "Result of a ship notification or workflow status update."
      },
      "UserShareApiModel": {
        "type": "object",
        "properties": {
          "emailAddresses": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            }
          },
          "phoneNumbers": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            }
          },
          "recipeSetReadableId": {
            "type": [
              "string",
              "null"
            ]
          },
          "locale": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "description": "Share a customized design via email and/or SMS."
      },
      "SavedUploadedAssetApiModel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "uploadedAssetId": {
            "type": "integer",
            "format": "int32"
          },
          "uploadedAssetUuid": {
            "type": "string",
            "format": "uuid"
          },
          "uploadedAssetUri": {
            "type": [
              "string",
              "null"
            ]
          },
          "metaData": {},
          "spectrumAssetReference": {
            "type": [
              "string",
              "null"
            ]
          },
          "clientAccountReference": {
            "type": [
              "string",
              "null"
            ]
          },
          "organizationIdentifier": {
            "type": [
              "string",
              "null"
            ]
          },
          "userFacingFileName": {
            "type": [
              "string",
              "null"
            ]
          },
          "uploadedAsset": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true
          },
          "productionJobs": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "hasProductionJob": {
            "type": "boolean"
          },
          "reuse": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true
          },
          "clientHandle": {
            "type": [
              "string",
              "null"
            ]
          },
          "active": {
            "type": "boolean"
          },
          "createdDate": {
            "type": "string",
            "format": "date-time"
          }
        },
        "description": "A saved uploaded asset (e.g. customer artwork)."
      },
      "InviteUserViewModel": {
        "type": "object",
        "properties": {
          "firstName": {
            "type": [
              "string",
              "null"
            ]
          },
          "lastName": {
            "type": [
              "string",
              "null"
            ]
          },
          "email": {
            "type": [
              "string",
              "null"
            ]
          },
          "permissionIds": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "integer",
              "format": "int32"
            }
          },
          "roleHandles": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            }
          }
        },
        "description": "Details for inviting a new user to a client account."
      },
      "CredentialsModel": {
        "type": "object",
        "properties": {
          "email": {
            "type": [
              "string",
              "null"
            ]
          },
          "password": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "description": "Email/password credentials to verify."
      }
    }
  }
}