SPOD Subscriptions and Webhooks API

Register webhook subscriptions to be notified via POST about Article, Order, and Shipment state changes. List and delete subscriptions, verify authenticity with the X-SPRD-SIGNATURE SHA256 HMAC header, and use simulate endpoints to trigger test events. Notifications follow an at-least-once delivery model and must be acknowledged.

OpenAPI Specification

spod-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: SPOD (Spreadconnect) Fulfillment REST API
  version: '1.0'
  description: >-
    REST API for SPOD (Spreadshirt Print-On-Demand), now branded Spreadconnect.
    Create customizable articles from designs, place and manage print-on-demand
    orders, choose shipping types and track shipments, browse the catalog of
    product types, check stock, and subscribe to webhook notifications for
    article, order, and shipment events. All requests are authenticated with a
    per-account API access token sent in the X-SPOD-ACCESS-TOKEN header. This
    document is an API Evangelist reference grounded in SPOD's published
    OpenAPI and developer documentation; verify request/response schemas against
    the live docs before production use.
  contact:
    name: SPOD
    url: https://www.spod.com
    email: business@spod.com
  termsOfService: https://faq.spod.com/hc/en-us/articles/360020630280
servers:
- url: https://rest.spod.com
  description: Production
- url: https://rest.spreadconnect-staging.app
  description: Staging / test environment
security:
- access_token: []
tags:
- name: Common
- name: Articles
- name: Orders
- name: Shipping
- name: Product Types
- name: Stock
- name: Subscriptions
paths:
  /authentication:
    get:
      tags:
      - Common
      operationId: authenticationInfo
      summary: Verify the API access token
      description: Returns authentication information for the supplied access token, used to confirm credentials are valid.
      responses:
        '200':
          description: Authentication information.
        '401':
          description: Missing or invalid access token.
  /articles:
    get:
      tags:
      - Articles
      operationId: getArticles
      summary: List articles
      description: Retrieve all articles for the account, paginated.
      parameters:
      - name: limit
        in: query
        required: false
        schema:
          type: integer
      - name: offset
        in: query
        required: false
        schema:
          type: integer
      responses:
        '200':
          description: A paginated list of articles.
    post:
      tags:
      - Articles
      operationId: createArticle
      summary: Create an article
      description: Create a new customizable article by combining a design with a product type and view.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ArticleRequest'
      responses:
        '201':
          description: The created article.
  /articles/{articleId}:
    get:
      tags:
      - Articles
      operationId: getArticle
      summary: Get an article
      parameters:
      - $ref: '#/components/parameters/ArticleId'
      responses:
        '200':
          description: The requested article.
        '404':
          description: Article not found.
    delete:
      tags:
      - Articles
      operationId: deleteArticle
      summary: Delete an article
      parameters:
      - $ref: '#/components/parameters/ArticleId'
      responses:
        '204':
          description: Article deleted.
  /orders:
    post:
      tags:
      - Orders
      operationId: createOrder
      summary: Create an order
      description: >-
        Create a new order. In the simple flow you send a preferred shipping
        type and state CONFIRMED in one request; in the controlled flow you
        create the order with mandatory fields, then set the shipping type and
        confirm it in later requests.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OrderRequest'
      responses:
        '201':
          description: The created order.
  /orders/{orderId}:
    get:
      tags:
      - Orders
      operationId: getOrder
      summary: Get an order
      parameters:
      - $ref: '#/components/parameters/OrderId'
      responses:
        '200':
          description: The requested order.
        '404':
          description: Order not found.
    put:
      tags:
      - Orders
      operationId: updateOrder
      summary: Update an order
      parameters:
      - $ref: '#/components/parameters/OrderId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OrderRequest'
      responses:
        '200':
          description: The updated order.
  /orders/{orderId}/confirm:
    post:
      tags:
      - Orders
      operationId: confirmOrder
      summary: Confirm an order
      description: Confirm an order so it enters production. A confirmed order can no longer be edited.
      parameters:
      - $ref: '#/components/parameters/OrderId'
      responses:
        '200':
          description: The confirmed order.
  /orders/{orderId}/cancel:
    post:
      tags:
      - Orders
      operationId: cancelOrder
      summary: Cancel an order
      description: Attempt to cancel an order. Cancellation only succeeds while the order has not yet entered production.
      parameters:
      - $ref: '#/components/parameters/OrderId'
      responses:
        '200':
          description: Cancellation result.
  /orders/{orderId}/shippingTypes:
    get:
      tags:
      - Shipping
      operationId: getShippingTypes
      summary: Get available shipping types for an order
      description: List the shipping types available for the order, including price and estimated delivery time.
      parameters:
      - $ref: '#/components/parameters/OrderId'
      responses:
        '200':
          description: Available shipping types.
  /orders/{orderId}/shippingType:
    post:
      tags:
      - Shipping
      operationId: setShippingType
      summary: Set the shipping type for an order
      parameters:
      - $ref: '#/components/parameters/OrderId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                shippingType:
                  type: integer
                  description: The identifier of the chosen shipping type.
      responses:
        '200':
          description: The order with the shipping type set.
  /orders/{orderId}/shipments:
    get:
      tags:
      - Shipping
      operationId: getShipments
      summary: Get shipments for an order
      description: Retrieve the shipment records for an order, including carrier and tracking details once dispatched.
      parameters:
      - $ref: '#/components/parameters/OrderId'
      responses:
        '200':
          description: Shipment records for the order.
  /productTypes:
    get:
      tags:
      - Product Types
      operationId: getProductTypes
      summary: List product types
      description: List the catalog of available product types (article types) that articles can be built from.
      responses:
        '200':
          description: A list of product types.
  /productTypes/{productTypeId}:
    get:
      tags:
      - Product Types
      operationId: getProductType
      summary: Get a product type
      description: Retrieve a product type with its sizes, colors, views, and printable areas.
      parameters:
      - name: productTypeId
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: The requested product type.
        '404':
          description: Product type not found.
  /stock:
    get:
      tags:
      - Stock
      operationId: getStocks
      summary: List stock for all variants
      description: Retrieve inventory availability across all product variants.
      responses:
        '200':
          description: Stock across variants.
  /stock/{sku}:
    get:
      tags:
      - Stock
      operationId: getStock
      summary: Get stock for a SKU
      parameters:
      - name: sku
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Stock for the given SKU.
        '404':
          description: SKU not found.
  /subscriptions:
    get:
      tags:
      - Subscriptions
      operationId: getSubscriptions
      summary: List subscriptions
      description: List the account's active webhook subscriptions.
      responses:
        '200':
          description: A list of subscriptions.
    post:
      tags:
      - Subscriptions
      operationId: createSubscription
      summary: Create a subscription
      description: >-
        Register a webhook subscription. Notifications are delivered by POST
        following an at-least-once model and must be acknowledged with a 202
        status, a response within 8 seconds, and the payload [accepted]. If a
        secret is set, notifications carry an X-SPRD-SIGNATURE header (a Base64
        SHA256 HMAC over the request body) for authenticity verification.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubscriptionRequest'
      responses:
        '201':
          description: The created subscription.
  /subscriptions/{subscriptionId}:
    delete:
      tags:
      - Subscriptions
      operationId: deleteSubscription
      summary: Delete a subscription
      parameters:
      - name: subscriptionId
        in: path
        required: true
        schema:
          type: integer
      responses:
        '204':
          description: Subscription deleted.
  /orders/{orderId}/simulate/order-cancelled:
    post:
      tags:
      - Subscriptions
      operationId: simulateOrderCancelledEvent
      summary: Simulate an Order.cancelled event
      description: Trigger a test Order.cancelled webhook notification for the given order (test/staging use).
      parameters:
      - $ref: '#/components/parameters/OrderId'
      responses:
        '200':
          description: Simulated event dispatched.
  /orders/{orderId}/simulate/order-processed:
    post:
      tags:
      - Subscriptions
      operationId: simulateOrderProcessedEvent
      summary: Simulate an Order.processed event
      description: Trigger a test Order.processed webhook notification for the given order (test/staging use).
      parameters:
      - $ref: '#/components/parameters/OrderId'
      responses:
        '200':
          description: Simulated event dispatched.
  /orders/{orderId}/simulate/shipment-sent:
    post:
      tags:
      - Subscriptions
      operationId: simulateShipmentSentEvent
      summary: Simulate a Shipment.sent event
      description: Trigger a test Shipment.sent webhook notification for the given order (test/staging use).
      parameters:
      - $ref: '#/components/parameters/OrderId'
      responses:
        '200':
          description: Simulated event dispatched.
components:
  securitySchemes:
    access_token:
      type: apiKey
      in: header
      name: X-SPOD-ACCESS-TOKEN
      description: >-
        Per-account API access token generated in the SPOD / Spreadconnect web
        application. Send it as a header on every request.
  parameters:
    ArticleId:
      name: articleId
      in: path
      required: true
      schema:
        type: integer
    OrderId:
      name: orderId
      in: path
      required: true
      schema:
        type: integer
  schemas:
    ArticleRequest:
      type: object
      description: Article creation payload. Refer to the live SPOD docs for the full schema.
      properties:
        title:
          type: string
        description:
          type: string
        productTypeId:
          type: integer
        configurations:
          type: array
          items:
            type: object
    OrderRequest:
      type: object
      description: Order payload. Refer to the live SPOD docs for the full schema.
      properties:
        orderItems:
          type: array
          items:
            type: object
        shipping:
          type: object
        billingAddress:
          type: object
        state:
          type: string
          enum:
          - NEW
          - CONFIRMED
    SubscriptionRequest:
      type: object
      description: Webhook subscription payload.
      properties:
        eventType:
          type: string
          description: The event to subscribe to (for example Article.added, Order.processed, Order.cancelled, Shipment.sent).
        url:
          type: string
          format: uri
          description: The endpoint that will receive POST notifications.
        secret:
          type: string
          description: Optional secret used to compute the X-SPRD-SIGNATURE HMAC.