openapi: 3.0.3 info: title: Gooten API description: >- The Gooten API is a REST interface for the Gooten print-on-demand and global manufacturing / fulfillment platform. It is hosted at api.print.io (the platform Gooten was built on) and lets you browse the product catalog and per-region SKUs, retrieve print templates, create print-ready products from artwork, quote shipping and order prices, and submit and manage manufacturing orders. The API is organized around resource-oriented URLs and standard HTTP verbs (GET, POST, PUT, DELETE) and returns JSON. All requests must use HTTPS. Authentication is by two credentials passed as query parameters. Every request requires a `RecipeID` (a public identifier for your integration). Order-writing and billing operations additionally require a `PartnerBillingKey` (a private key that must never be exposed client-side and must be URL-encoded). Most catalog endpoints live under the source API base `/api/v/5/source/api`; print-ready product (PRP) management lives under the versioned base `/api/v2/recipes/{recipeId}`. This description was authored by API Evangelist from Gooten's public documentation. Field-level request/response shapes are modeled from the documented examples and are approximate; consult the Gooten docs for exact payloads. version: '5' contact: name: Gooten url: https://www.gooten.com/api-documentation/getting-started/ servers: - url: https://api.print.io description: Gooten API (hosted on the Print.io platform) security: - recipeId: [] tags: - name: Products description: Catalog products, per-region SKUs, supported countries and currencies. - name: Shipping description: Shipping option lookup and order price estimates for a cart. - name: Orders description: Submit, retrieve, search, and update manufacturing orders. - name: Print Assets description: Product templates and print-ready product (PRP) management. paths: /api/v/5/source/api/products: get: operationId: listProducts tags: - Products summary: List products description: >- Lists catalog products. In Gooten a "product" is a category (for example "Canvas Wraps") that has many SKUs / variants beneath it. parameters: - $ref: '#/components/parameters/RecipeID' - name: countryCode in: query required: false description: Two-character ISO 3166-1 alpha-2 country code for the shipping destination. schema: type: string example: US - name: all in: query required: false description: When true, returns the full catalog rather than only enabled products. schema: type: boolean responses: '200': description: A list of products. content: application/json: schema: type: object properties: HadError: type: boolean Products: type: array items: $ref: '#/components/schemas/Product' '401': $ref: '#/components/responses/Unauthorized' /api/v/5/source/api/productvariants: get: operationId: listProductVariants tags: - Products summary: List product variants (SKUs) description: >- Lists the available variants (SKUs) and pricing for a product. SKUs can differ by region - for example US canvas wraps use inch formats and European ones use centimeter formats - so a country code is required. parameters: - $ref: '#/components/parameters/RecipeID' - name: productId in: query required: true description: The product identifier obtained from the products endpoint. schema: type: string - name: countryCode in: query required: true description: Two-character ISO 3166-1 alpha-2 country code for the shipping destination. schema: type: string example: US - name: currencyCode in: query required: false description: ISO currency code for returned pricing. Defaults to USD. schema: type: string default: USD - name: compression in: query required: false description: When true, reduces the response payload size. schema: type: boolean - name: pageSize in: query required: false schema: type: integer - name: page in: query required: false schema: type: integer responses: '200': description: A list of product variants (SKUs) with pricing. content: application/json: schema: type: object properties: HadError: type: boolean ProductVariants: type: array items: $ref: '#/components/schemas/ProductVariant' '401': $ref: '#/components/responses/Unauthorized' /api/v/5/source/api/countries: get: operationId: listCountries tags: - Products summary: List supported shipping countries description: >- Returns the countries Gooten can ship to, each with a name, ISO code, support flag, measurement system, flag image URL, and default currency. parameters: - $ref: '#/components/parameters/RecipeID' responses: '200': description: A list of supported shipping countries. content: application/json: schema: type: object properties: HadError: type: boolean Countries: type: array items: $ref: '#/components/schemas/Country' '401': $ref: '#/components/responses/Unauthorized' /api/v/5/source/api/currencies: get: operationId: listCurrencies tags: - Products summary: List supported currencies description: Returns the currencies supported for pricing and order submission. parameters: - $ref: '#/components/parameters/RecipeID' responses: '200': description: A list of supported currencies. content: application/json: schema: type: object properties: HadError: type: boolean Currencies: type: array items: type: string example: USD '401': $ref: '#/components/responses/Unauthorized' /api/v/5/source/api/shippingprices: post: operationId: getShippingOptions tags: - Shipping summary: Get shipping options for a cart description: >- Returns the available shipping options and their costs for a set of line items shipping to a given destination. parameters: - $ref: '#/components/parameters/RecipeID' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ShippingPricesRequest' responses: '200': description: Available shipping options. content: application/json: schema: type: object properties: HadError: type: boolean ShippingOptions: type: array items: $ref: '#/components/schemas/ShippingOption' '401': $ref: '#/components/responses/Unauthorized' /api/v/5/source/api/price: post: operationId: getPriceEstimate tags: - Shipping summary: Get an order price estimate description: >- Estimates the total cost of an order - product cost, shipping, surcharges, taxes, and fees - for a cart in a chosen currency, before the order is submitted. parameters: - $ref: '#/components/parameters/RecipeID' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PriceEstimateRequest' responses: '200': description: An order price estimate. content: application/json: schema: $ref: '#/components/schemas/BillingSummary' '401': $ref: '#/components/responses/Unauthorized' /api/v/5/source/api/orders: get: operationId: getOrders tags: - Orders summary: Get an order by ID or search orders description: >- Retrieves a single order by its Safe Order ID (pass `Id`), or searches orders by criteria such as last name, email, postal code, and date range when `Id` is omitted. Search requires the PartnerBillingKey. parameters: - $ref: '#/components/parameters/RecipeID' - name: Id in: query required: false description: The Safe Order ID of a specific order to retrieve. schema: type: string - $ref: '#/components/parameters/PartnerBillingKey' - name: lastName in: query required: false schema: type: string - name: email in: query required: false schema: type: string - name: postalCode in: query required: false schema: type: string - name: startDate in: query required: false description: Search lower bound, format yyyy-mm-dd. schema: type: string format: date - name: endDate in: query required: false description: Search upper bound, format yyyy-mm-dd. schema: type: string format: date - name: page in: query required: false schema: type: integer - name: pageSize in: query required: false schema: type: integer responses: '200': description: An order or a page of matching orders. content: application/json: schema: $ref: '#/components/schemas/Order' '401': $ref: '#/components/responses/Unauthorized' post: operationId: submitOrder tags: - Orders summary: Submit an order description: >- Submits a new manufacturing order. Requires ship-to and billing addresses, one or more line items (SKU, quantity, artwork images, and a ship type or carrier method), and a Payment object carrying the PartnerBillingKey. Returns the new order Id. parameters: - $ref: '#/components/parameters/RecipeID' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/OrderInput' responses: '200': description: The created order identifier. content: application/json: schema: type: object properties: Id: type: string HadError: type: boolean '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/ValidationError' /api/v/5/source/api/orderbilling: get: operationId: getOrderBilling tags: - Orders summary: Get billing information for an order description: >- Returns the full billing breakdown for an order - product cost, per-item shipping cost, subtotal, shipping, surcharges, taxes, fees, discounts, and total. Requires the PartnerBillingKey. parameters: - name: orderid in: query required: true description: The order ID to retrieve billing for. schema: type: string - $ref: '#/components/parameters/RecipeID' - $ref: '#/components/parameters/PartnerBillingKey' - name: currency in: query required: false description: Currency for the returned amounts. schema: type: string responses: '200': description: The billing breakdown for the order. content: application/json: schema: $ref: '#/components/schemas/BillingSummary' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v/5/source/api/shippingAddress: put: operationId: updateShippingAddress tags: - Orders summary: Update the shipping address for an order description: >- Updates the ship-to address on an existing order, provided the order is still in an editable status. Requires the PartnerBillingKey. parameters: - name: orderId in: query required: true schema: type: string - $ref: '#/components/parameters/RecipeID' - $ref: '#/components/parameters/PartnerBillingKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Address' responses: '200': description: Update result. content: application/json: schema: $ref: '#/components/schemas/GenericResult' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v/5/source/api/shippingMethod: put: operationId: updateShippingMethod tags: - Orders summary: Update the shipping method for order items description: >- Changes the shipping method for one or more items in an order. Shipping method changes automatically adjust order pricing. Requires the PartnerBillingKey. parameters: - name: orderId in: query required: true schema: type: string - $ref: '#/components/parameters/RecipeID' - $ref: '#/components/parameters/PartnerBillingKey' requestBody: required: true content: application/json: schema: type: object required: - OrderItemIds - NewShippingMethod properties: OrderItemIds: type: array items: type: string NewShippingMethod: type: string enum: - standard - expedited - overnight responses: '200': description: Update result. content: application/json: schema: $ref: '#/components/schemas/GenericResult' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v/5/source/api/producttemplates: get: operationId: listProductTemplates tags: - Print Assets summary: List product templates for a SKU description: >- Returns the template data describing how to build print-ready art for a SKU - the number of image spaces, required sizes, and coordinates used to render and validate artwork. parameters: - $ref: '#/components/parameters/RecipeID' - name: sku in: query required: true description: The SKU to retrieve template data for. schema: type: string responses: '200': description: Template data for the SKU. content: application/json: schema: type: object properties: HadError: type: boolean Template: $ref: '#/components/schemas/ProductTemplate' '401': $ref: '#/components/responses/Unauthorized' /api/v2/recipes/{recipeId}/printreadyproducts: parameters: - $ref: '#/components/parameters/RecipeIdPath' get: operationId: listPrintReadyProducts tags: - Print Assets summary: List print-ready products description: Lists the print-ready products (PRPs) configured for your recipe. parameters: - name: page in: query required: false description: Page number; defaults to 1. schema: type: integer default: 1 responses: '200': description: A page of print-ready products. content: application/json: schema: type: object properties: PrintReadyProducts: type: array items: $ref: '#/components/schemas/PrintReadyProduct' '401': $ref: '#/components/responses/Unauthorized' post: operationId: createPrintReadyProduct tags: - Print Assets summary: Create a print-ready product description: >- Creates a print-ready product that binds a Gooten SKU to your artwork design, positioned by template space (SpaceDesc and/or SpaceId). requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PrintReadyProductInput' responses: '200': description: The created print-ready product. content: application/json: schema: $ref: '#/components/schemas/PrintReadyProduct' '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/ValidationError' put: operationId: updatePrintReadyProduct tags: - Print Assets summary: Update a print-ready product description: Updates an existing print-ready product with the same payload shape as creation. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PrintReadyProductInput' responses: '200': description: The updated print-ready product. content: application/json: schema: $ref: '#/components/schemas/PrintReadyProduct' '401': $ref: '#/components/responses/Unauthorized' /api/v2/recipes/{recipeId}/printreadyproducts/{productId}: parameters: - $ref: '#/components/parameters/RecipeIdPath' - name: productId in: path required: true description: The print-ready product identifier. schema: type: string delete: operationId: deletePrintReadyProduct tags: - Print Assets summary: Delete a print-ready product description: Deletes a print-ready product by its identifier. responses: '200': description: Deletion result. content: application/json: schema: $ref: '#/components/schemas/GenericResult' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/v2/recipes/{recipeId}/printreadyproducts/variants: parameters: - $ref: '#/components/parameters/RecipeIdPath' get: operationId: listPrintReadyProductVariants tags: - Print Assets summary: List print-ready product variants description: Lists the variants of your print-ready products, optionally filtered by product name. parameters: - name: page in: query required: false schema: type: integer - name: productName in: query required: false schema: type: string responses: '200': description: A page of print-ready product variants. content: application/json: schema: type: object properties: Variants: type: array items: type: object additionalProperties: true '401': $ref: '#/components/responses/Unauthorized' components: securitySchemes: recipeId: type: apiKey in: query name: RecipeID description: >- Public RecipeID from the Gooten Admin, required on every request. Order-writing and billing endpoints additionally require a private PartnerBillingKey query parameter (URL-encoded). parameters: RecipeID: name: RecipeID in: query required: true description: Your public RecipeID from the Gooten Admin. schema: type: string PartnerBillingKey: name: partnerBillingKey in: query required: true description: Your private Partner Billing Key, URL-encoded. Never expose this client-side. schema: type: string RecipeIdPath: name: recipeId in: path required: true description: Your RecipeID from the Gooten Admin. schema: type: string responses: Unauthorized: description: Missing or invalid RecipeID / PartnerBillingKey. content: application/json: schema: $ref: '#/components/schemas/Error' NotFound: description: The requested resource was not found. content: application/json: schema: $ref: '#/components/schemas/Error' ValidationError: description: The request payload failed validation. content: application/json: schema: $ref: '#/components/schemas/Error' schemas: Error: type: object description: Gooten error envelope. Responses carry a HadError flag and error details. properties: HadError: type: boolean Errors: type: array items: type: object properties: Message: type: string PropertyName: type: string ErrorReference: type: string GenericResult: type: object properties: HadError: type: boolean Id: type: string Product: type: object properties: Id: type: string Name: type: string CategoryName: type: string ProductVariant: type: object properties: Sku: type: string ProductId: type: string Price: type: object properties: Price: type: number CurrencyCode: type: string Country: type: object properties: Name: type: string Code: type: string IsSupported: type: boolean MeasurementCode: type: string FlagUrl: type: string DefaultCurrency: type: string ShippingPricesRequest: type: object required: - ShipToPostalCode - ShipToCountry - CurrencyCode - Items properties: ShipToPostalCode: type: string ShipToCountry: type: string ShipToState: type: string CurrencyCode: type: string Items: type: array items: type: object required: - SKU - Quantity properties: SKU: type: string Quantity: type: integer ShippingOption: type: object properties: Method: type: string Price: type: number CurrencyCode: type: string PriceEstimateRequest: type: object required: - Items - Payment properties: ShipToAddress: $ref: '#/components/schemas/Address' Items: type: array items: type: object required: - SKU - Quantity properties: Quantity: type: integer SKU: type: string ShipType: type: string Payment: type: object properties: CurrencyCode: type: string PartnerBillingKey: type: string Address: type: object properties: FirstName: type: string LastName: type: string Line1: type: string Line2: type: string City: type: string State: type: string CountryCode: type: string PostalCode: type: string Phone: type: string Email: type: string IsBusinessAddress: type: boolean OrderItem: type: object required: - Quantity - SKU properties: Quantity: type: integer SKU: type: string ShipType: type: string description: Ship type, or provide ShipCarrierMethodId instead. ShipCarrierMethodId: type: integer Images: type: array items: type: object properties: Url: type: string SpaceId: type: string Index: type: integer ThumbnailUrl: type: string SourceId: type: string Meta: type: object additionalProperties: true OrderInput: type: object required: - ShipToAddress - BillingAddress - Items - Payment properties: ShipToAddress: $ref: '#/components/schemas/Address' BillingAddress: $ref: '#/components/schemas/Address' Items: type: array items: $ref: '#/components/schemas/OrderItem' Payment: type: object required: - PartnerBillingKey properties: PartnerBillingKey: type: string CurrencyCode: type: string SourceId: type: string IsPartnerSourceIdUnique: type: boolean IsInTestMode: type: boolean Meta: type: object additionalProperties: true Order: type: object properties: Id: type: string Status: type: string ShipToAddress: $ref: '#/components/schemas/Address' BillingAddress: $ref: '#/components/schemas/Address' Items: type: array items: $ref: '#/components/schemas/OrderItem' BillingSummary: $ref: '#/components/schemas/BillingSummary' HadError: type: boolean BillingSummary: type: object properties: ProductCost: type: number ShippingCost: type: number SubTotal: type: number Surcharges: type: number Taxes: type: number Fees: type: number Discounts: type: number Total: type: number CurrencyCode: type: string ProductTemplate: type: object properties: Sku: type: string Spaces: type: array items: type: object properties: Id: type: string Description: type: string Width: type: number Height: type: number FinalX: type: number FinalY: type: number PrintReadyProductInput: type: object required: - Sku properties: Sku: type: string Name: type: string Images: type: array items: type: object properties: Url: type: string SpaceId: type: string SpaceDesc: type: string PrintReadyProduct: allOf: - $ref: '#/components/schemas/PrintReadyProductInput' - type: object properties: Id: type: string