API Changelog

Track all changes to the Ultimate Custom Order Status API

Version Naming Convention

The API uses a two-tier versioning system:

Major Versions (URL-based)

Major versions with breaking changes require a URL change:

  • /api/v1/* - Version 1.x
  • /api/v2/* - Version 2.x (future)

Minor Versions (Header-based)

Minor versions with backward-compatible changes use the X-API-Version header:

  • X-API-Version: 1.0 - Version 1.0 (baseline, no addon support)
  • X-API-Version: 1.1 - Version 1.1 (current, includes addon support)
  • X-API-Version: 1.2 - Version 1.2 (draft order filtering, holiday skipping)
  • X-API-Version: 1.3 - Version 1.3 (includes workflows support)
  • X-API-Version: 1.4 - Version 1.4 (current, line item status tracking)

Versions

v1.4 - March 2026

Release Date: March 12, 2026

Access Method: Default (no header required) or X-API-Version: 1.4

New Features

Line Item Status Tracking

Added line item-level status tracking to the external API. Merchants who track statuses at the individual line item level (rather than or in addition to the order level) can now manage those statuses via three new endpoints.

New Endpoints:

  • POST /v1/line-items/:lineItemId/status - Change a single line item's status with notification support
  • POST /v1/line-items/status-bulk - Bulk change statuses for multiple line items (up to 100)
  • POST /v1/line-items/clear-status - Clear statuses for one or more line items (up to 100)

Line Item Status Change Response

Line Item Status Change Response
{
  "success": true,
  "data": {
    "message": "Line item status updated successfully",
    "line_item": {
      "id": "li-uuid-123",
      "status": {
        "id": "uuid-status-1",
        "name": "In Production",
        "color": "#FFA500"
      },
      "sub_status": {
        "id": "uuid-substatus-1",
        "name": "Cutting"
      }
    }
  }
}

Status Specificity Mode

The shop's statusSpecificity setting determines which endpoints are available. Modes are: order (only order-level endpoints), line_item (only line item endpoints), or combined (both work independently).

Key Behaviors

  • Single line item status changes trigger notifications when configured on the target status. Bulk and clear endpoints do not trigger notifications.
  • After any line item status change, the parent order's metafield is automatically rebuilt to reflect aggregated line item state.
  • Product chain enforcement applies per line item independently — each line item must follow the configured status progression order.

Migration Guide

  • No breaking changes — all v1.3 endpoints and responses are unchanged
  • Line item endpoints are available by default in v1.4
  • Check the shop's status specificity mode before calling line item endpoints
  • Line item IDs use internal UUIDs (SyncedLineItem.id), not Shopify line item GIDs
  • Fully backward compatible — existing integrations continue to work

Example Request

v1.4 Request
curl -X POST "https://api.ultimate-custom-order-status.apps.msmtech.ca/api/v1/line-items/li-uuid-123/status" \
  -H "X-API-Key: your_api_key_here" \
  -H "X-API-Version: 1.4" \
  -H "Content-Type: application/json" \
  -d '{
    "status_id": "uuid-status-1",
    "sub_status_option_id": "uuid-substatus-1"
  }'

Breaking Changes

None — all v1.0–v1.3 endpoints are unchanged.

v1.3 - March 2026

Release Date: March 4, 2026

Access Method: X-API-Version: 1.3

New Features

Workflows Support

Added workflows support across the API. Workflows allow you to define ordered sequences of statuses that orders follow, enabling structured order processing pipelines.

New Endpoint:

  • GET /api/v1/workflows - List all configured workflows with their associated statuses

Workflows Response

Workflows Response
{
  "workflows": [
    {
      "id": "uuid-workflow-1",
      "name": "Fulfillment",
      "description": "Standard order fulfillment pipeline",
      "color": "#4A90E2",
      "order": 1,
      "statuses": [
        {
          "id": "uuid-status-1",
          "name": "Processing",
          "public_name": null,
          "use_public_name": false,
          "display_name": "Processing",
          "color": "#FFA500",
          "order": 1,
          "is_independent": false,
          "is_addon": false
        },
        {
          "id": "uuid-status-2",
          "name": "Shipped",
          "public_name": "On its way",
          "use_public_name": true,
          "display_name": "On its way",
          "color": "#00FF00",
          "order": 2,
          "is_independent": false,
          "is_addon": false
        }
      ],
      "status_count": 2
    }
  ],
  "workflows_enabled": true,
  "enforce_workflow_order": false,
  "summary": {
    "total": 1,
    "total_statuses": 2
  }
}

Workflow Fields on Orders

Orders now include workflow_id and workflow_name fields indicating which workflow the order is assigned to.

Affected Endpoints:

  • GET /api/v1/orders - Orders now include workflow_id and workflow_name fields
  • GET /api/v1/orders/:order_id - Order detail now includes workflow_id and workflow_name fields

Response Changes

Order with Workflow Fields
{
  "id": "order-uuid",
  "shopify_order_id": "gid://shopify/Order/123456",
  "name": "#1001",
  "workflow_id": "uuid-workflow-1",
  "workflow_name": "Fulfillment",
  "custom_status": {
    "id": "uuid-status-1",
    "name": "Processing",
    "color": "#FFA500"
  }
}

Workflow Fields on Statuses

Statuses now include workflow_id and workflow_name fields indicating which workflow the status belongs to.

Affected Endpoints:

  • GET /api/v1/statuses - Statuses now include workflow_id and workflow_name fields, plus summary includes workflows_enabled
  • GET /api/v1/statuses/:status_id - Status detail now includes workflow_id and workflow_name fields

Response Changes

Status with Workflow Fields
{
  "id": "uuid-status-1",
  "name": "Processing",
  "public_name": null,
  "use_public_name": false,
  "display_name": "Processing",
  "color": "#FFA500",
  "order": 1,
  "is_independent": false,
  "is_addon": false,
  "workflow_id": "uuid-workflow-1",
  "workflow_name": "Fulfillment"
}

Workflow Filtering

Added workflow_id query parameter to the List Orders endpoint, allowing you to filter orders by their assigned workflow.

Filter Orders by Workflow
curl -X GET "https://api.ultimate-custom-order-status.apps.msmtech.ca/api/v1/orders?workflow_id=uuid-workflow-1&page=1&limit=25" \
  -H "X-API-Key: your_api_key_here" \
  -H "X-API-Version: 1.3"

Required Permission

The List Workflows endpoint requires the existing canViewStatuses permission.

  • canViewStatuses - Required for accessing the workflows endpoint

Migration Guide

  • Add X-API-Version: 1.3 header to use this version explicitly
  • New workflow_id and workflow_name fields are nullable - existing integrations continue to work without changes
  • The List Workflows endpoint uses the existing canViewStatuses permission — no new permission needed
  • Use the new workflow_id query parameter on List Orders to filter by workflow
  • Fully backward compatible - existing integrations continue to work

Example Request

v1.3 Request
curl -X GET "https://api.ultimate-custom-order-status.apps.msmtech.ca/api/v1/orders?workflow_id=uuid-workflow-1&page=1&limit=25" \
  -H "X-API-Key: your_api_key_here" \
  -H "X-API-Version: 1.3"

Breaking Changes

None - this is a backward-compatible release. New fields are nullable and do not affect existing integrations.

v1.2 - December 2025

Release Date: December 9, 2025

Access Method: X-API-Version: 1.2

New Features

Draft Order Filtering

Added ability to filter orders by type (regular orders, draft orders, or all). Draft orders can now be managed alongside regular orders in the API.

Affected Endpoints:

  • GET /api/v1/orders - Orders list now supports order_type query parameter (REGULAR, DRAFT, ALL)
  • GET /api/v1/orders/:order_id - Order lookup now automatically detects draft vs regular orders when using Shopify IDs

List Orders Changes

New query parameter order_type allows filtering by order type:

  • REGULAR - REGULAR - Returns only regular orders (default in v1.0/v1.1)
  • DRAFT - DRAFT - Returns only draft orders
  • ALL - ALL - Returns both regular and draft orders (default in v1.2)

Examples

Examples
# Get all orders (both regular and draft) - v1.2 default
curl -X GET "https://api.ultimate-custom-order-status.apps.msmtech.ca/api/v1/orders?order_type=ALL" \
  -H "X-API-Key: your_api_key_here" \
  -H "X-API-Version: 1.2"

# Get only regular orders
curl -X GET "https://api.ultimate-custom-order-status.apps.msmtech.ca/api/v1/orders?order_type=REGULAR" \
  -H "X-API-Key: your_api_key_here" \
  -H "X-API-Version: 1.2"

# Get only draft orders
curl -X GET "https://api.ultimate-custom-order-status.apps.msmtech.ca/api/v1/orders?order_type=DRAFT" \
  -H "X-API-Key: your_api_key_here" \
  -H "X-API-Version: 1.2"

Get Order Changes

When using use_shopify_order_id=true, the API now automatically tries both regular and draft order ID formats, making integration easier.

Example: Looking Up Orders by Shopify ID
# Look up a draft order by Shopify ID - v1.2 automatically tries both formats
curl -X GET "https://api.ultimate-custom-order-status.apps.msmtech.ca/api/v1/orders/1234567890?use_shopify_order_id=true" \
  -H "X-API-Key: your_api_key_here" \
  -H "X-API-Version: 1.2"

Holiday Skipping

Added skip_holidays flag to status max_duration configuration. When enabled, holidays will be excluded when calculating status duration deadlines, similar to the existing skip_weekends feature.

Affected Endpoints:

  • GET /api/v1/statuses - Statuses list now includes skip_holidays in max_duration object
  • GET /api/v1/statuses/:status_id - Status detail now includes skip_holidays in max_duration object

Response Changes

Status responses now include the skip_holidays field in the max_duration object:

Example Response
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "name": "Fulfillment",
  "color": "#2948ff",
  "is_independent": false,
  "is_addon": false,
  "max_duration": {
    "enabled": true,
    "seconds": 432000,
    "skip_weekends": true,
    "skip_holidays": true,
    "show_public_overdue_date": true
  }
}

Bulk Response Format Improvements

Updated bulk operation response format with clearer success/failure reporting and detailed error information for failed entries.

Affected Endpoints:

  • POST /api/v1/orders/status-bulk - Bulk status update with improved response format
  • POST /api/v1/orders/notify-bulk - Bulk notification with improved response format

Status Bulk Changes:

  • updated_count - Total number of orders successfully updated
  • failed - Number of orders that failed to update
  • success - Boolean indicating if all updates succeeded
  • failed_entries - Array of objects with order_id and error details for each failure

Notify Bulk Changes:

  • total_orders - Total number of orders in the notification request
  • failed - Number of orders that failed to notify
  • success - Boolean indicating if all notifications succeeded
  • failed_entries - Array of objects with order_id and error details for each failure

Bulk Response Examples

Bulk Response Examples
# Old format (before v1.2 update)
{
  "message": "Statuses updated successfully",
  "updated_count": 2,
  "results": [
    {
      "order_id": "uuid1",
      "status_id": "status-uuid",
      "status_name": "Processing"
    }
  ]
}

# New format (v1.2 update)
{
  "message": "Statuses updated successfully",
  "updated": 2,
  "failed": 1,
  "results": [
    {
      "order_id": "uuid1",
      "success": true,
      "status_id": "status-uuid",
      "status_name": "Processing"
    },
    {
      "order_id": "uuid2",
      "success": true,
      "status_id": "status-uuid",
      "status_name": "Processing"
    },
    {
      "order_id": "invalid-uuid",
      "success": false,
      "error": "Order not found"
    }
  ]
}

Migration Guide

  • Add X-API-Version: 1.2 header to use this version explicitly
  • The order_type parameter is optional - defaults to ALL in v1.2
  • Shopify ID lookups now work for both regular and draft orders without changes
  • The skip_holidays field is now available in status max_duration configurations
  • Update bulk operation response handling to use the new success, failed, and failed_entries fields
  • Check the success boolean for quick pass/fail determination instead of parsing individual results
  • Fully backward compatible - existing integrations continue to work

Example Request

v1.2 Request
curl -X GET "https://api.ultimate-custom-order-status.apps.msmtech.ca/api/v1/orders?order_type=DRAFT" \
  -H "X-API-Key: your_api_key_here" \
  -H "X-API-Version: 1.2"

Breaking Changes

None - this is a backward-compatible release. The default behavior of order_type changed from REGULAR to ALL, but this is additive (returns more data, not less).

v1.1 - November 2025

Release Date: November 14, 2025

Access Method: Default (no header required) or X-API-Version: 1.1

New Features

Addon Status Support

Added support for addon statuses across all order-related endpoints. Addon statuses can be assigned alongside primary statuses.

Affected Endpoints:

  • GET /api/v1/orders - Orders list now includes addon_statuses array when X-API-Version: 1.1 header is present
  • GET /api/v1/orders/:order_id - Order detail now includes addon_statuses array when X-API-Version: 1.1 header is present
  • GET /api/v1/statuses - Statuses list now includes is_addon flag when X-API-Version: 1.1 header is present

Response Changes

Orders now include an addon_statuses field with optional sub-status support:

Response Changes
{
  "id": "uuid",
  "status": {
    "id": "status-uuid",
    "name": "Processing",
    "color": "#2948ff"
  },
  "addon_statuses": [
    {
      "id": "addon-uuid-1",
      "name": "Quality Check",
      "color": "#10b981",
      "sub_status": {
        "id": "addon-sub-uuid",
        "name": "Passed"
      }
    },
    {
      "id": "addon-uuid-2",
      "name": "Packaging",
      "color": "#f59e0b",
      "sub_status": null
    }
  ]
}

Statuses now include classification flags:

Status Classification
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "name": "Processing",
  "is_independent": false,
  "is_addon": false
}

Migration Guide

  • No code changes required - fully backward compatible
  • Requests without a version header automatically use the latest version
  • To use an older version, explicitly specify it with the X-API-Version header
  • No changes required to authentication or rate limiting

Example Request:

v1.1 Request
curl -X GET 'https://api.ultimate-custom-order-status.apps.msmtech.ca/api/v1/orders' \
  -H 'Authorization: Bearer ucos_live_your_api_key' \
  -H 'X-API-Version: 1.1'

Breaking Changes

None - this is a backward-compatible release.

v1.0 - Initial Release

Release Date: October 2025

Access Method: Add X-API-Version: 1.0 header to requests

Features

  • Order listing with pagination, filtering, and search
  • Order detail retrieval
  • Status listing with sub-status support
  • Order status updates
  • Bulk operations support
  • Notification triggering

Available Endpoints:

  • GET /api/v1/orders
  • GET /api/v1/orders/:order_id
  • POST /api/v1/orders/:order_id/status
  • POST /api/v1/orders/status-bulk
  • GET /api/v1/statuses
  • GET /api/v1/statuses/:status_id
  • POST /api/v1/orders/:order_id/notify
  • POST /api/v1/orders/notify-bulk

Notes:

Does not include addon status support

Support

For questions about API versioning or migration assistance:

Email: support@msmtech.ca

Documentation: API Reference