POST
Bulk Send Notifications
Send notifications to customers for multiple orders in a single request.
Endpoint
HTTP Request
POST /v1/orders/notify-bulkAuthentication
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_hereRequest Body
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
order_ids | string[] | 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'). |
channels | string[] | Yes | - | Notification channels to use: "email", "sms", "whatsapp". At least one channel is required to prevent accidental mass notifications. |
use_shopify_order_id | boolean | No | false | Set 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
| Field | Type | Description |
|---|---|---|
message | string | Confirmation message |
total_orders | number | Number of orders processed |
results | array | Array of notification results per order |
Result Object Fields (per order)
| Field | Type | Description |
|---|---|---|
order_id | string | UUID of the order |
notifications_sent | object | Object containing notification status for each channel |
Notifications Sent Object Fields
| Field | Type | Description |
|---|---|---|
email | string | Email notification status: "sent", "skipped", or "failed" |
sms | string | SMS notification status: "sent", "skipped", or "failed" |
whatsapp | string | WhatsApp 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 minuteX-RateLimit-Remaining-Minute: Remaining requests in current minuteX-RateLimit-Reset-Minute: Unix timestamp when minute window resetsX-RateLimit-Limit-Day: Maximum requests per dayX-RateLimit-Remaining-Day: Remaining requests in current dayX-RateLimit-Reset-Day: Unix timestamp when day window resetsRetry-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"
}
}