POST

Bulk Send Notifications

Send notifications to customers for multiple orders in a single request.

Endpoint

HTTP Request
POST /v1/orders/notify-bulk

Authentication

This endpoint requires a valid API key with canSendNotifications permission. The API key must be passed in the X-API-Key header.
Required Header
X-API-Key: your_api_key_here

Request Body

ParameterTypeRequiredDefaultDescription
order_idsstring[]Yes-Array of order identifiers (UUIDs by default, or Shopify order IDs if use_shopify_order_id is true). For Shopify order IDs, provide the numeric portion of Shopify's order GID (e.g., for 'gid://shopify/Order/450789469', use '450789469').
channelsstring[]Yes-Notification channels to use: "email", "sms", "whatsapp". At least one channel is required to prevent accidental mass notifications.
use_shopify_order_idbooleanNofalseSet to 'true' to look up orders using Shopify order IDs instead of UUIDs. Extract the number from Shopify's GID format (gid://shopify/Order/450789469 → 450789469) and use it in the order_ids array.

Response

Returns detailed notification results for each order:
200 OK - Success Response
{
  "message": "Bulk notification request processed",
  "total_orders": 3,
  "results": [
    {
      "order_id": "uuid1",
      "notifications_sent": {
        "email": "sent",
        "sms": "sent",
        "whatsapp": "skipped"
      }
    },
    {
      "order_id": "uuid2",
      "notifications_sent": {
        "email": "sent",
        "sms": "failed",
        "whatsapp": "skipped"
      }
    },
    {
      "order_id": "uuid3",
      "notifications_sent": {
        "email": "sent",
        "sms": "sent",
        "whatsapp": "skipped"
      }
    }
  ]
}

Response Fields

Root Response Object

FieldTypeDescription
messagestringConfirmation message
total_ordersnumberNumber of orders processed
resultsarrayArray of notification results per order

Result Object Fields (per order)

FieldTypeDescription
order_idstringUUID of the order
notifications_sentobjectObject containing notification status for each channel

Notifications Sent Object Fields

FieldTypeDescription
emailstringEmail notification status: "sent", "skipped", or "failed"
smsstringSMS notification status: "sent", "skipped", or "failed"
whatsappstringWhatsApp notification status: "sent", "skipped", or "failed"

Examples

Basic Request (UUIDs)

cURL Request
curl -X POST "https://api.ultimate-custom-order-status.apps.msmtech.ca/api/v1/orders/notify-bulk" \
  -H "X-API-Key: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "order_ids": ["uuid1", "uuid2", "uuid3"],
    "channels": ["email", "sms"]
  }'

Using Shopify Order IDs

cURL Request
curl -X POST "https://api.ultimate-custom-order-status.apps.msmtech.ca/api/v1/orders/notify-bulk" \
  -H "X-API-Key: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "order_ids": ["5460132438316", "5460132438317", "5460132438318"],
    "use_shopify_order_id": true,
    "channels": ["email", "sms"]
  }'

Rate Limiting

This endpoint is subject to per-minute and per-day rate limits based on your API key. Rate limit information is returned in the response headers:
  • X-RateLimit-Limit-Minute: Maximum requests per minute
  • X-RateLimit-Remaining-Minute: Remaining requests in current minute
  • X-RateLimit-Reset-Minute: Unix timestamp when minute window resets
  • X-RateLimit-Limit-Day: Maximum requests per day
  • X-RateLimit-Remaining-Day: Remaining requests in current day
  • X-RateLimit-Reset-Day: Unix timestamp when day window resets
  • Retry-After: Seconds to wait before retrying (when rate limited)

Error Responses

400 Bad Request

Invalid request body or validation failed

400 Bad Request
{
  "error": "Validation failed",
  "details": {
    "errors": [...]
  }
}

401 Unauthorized

Missing or invalid API key

401 Unauthorized
{
  "error": "Unauthorized"
}

403 Forbidden

API key lacks required permissions

403 Forbidden
{
  "error": "Insufficient permissions"
}

404 Not Found

No valid orders found for the provided IDs

404 Not Found
{
  "error": "No valid orders found"
}

500 Internal Server Error

Server error occurred

500 Internal Server Error
{
  "error": "Internal server error",
  "details": {
    "message": "Error description"
  }
}