---
title: "Subcontractor Bulk Action"
method: POST
path: "/subcontractors/bulk_action"
---

# Subcontractor Bulk Action

`POST /subcontractors/bulk_action`

## Request

- Base URL: `https://dc-region.zuperpro.com/api`
- URL: `https://dc-region.zuperpro.com/api/subcontractors/bulk_action`
- Auth: API key in header `x-api-key`

Operates on Subcontractors, shown in the Zuper client app as "Subcontractor" (in every industry). Subcontractors share the exact same underlying schema and endpoints as Vendors / Suppliers; they're distinguished only by the `vendor_type` field (`SUB_CONTRACTOR` here) and the `/subcontractors` route prefix. Supports `activate`, `send_email`, `send_sms`, and `delete`. Activate/email are processed asynchronously by a background worker. Delete skips (and reports back) any record that is a favorite supplier or set as a product's preferred vendor.

## Request body

- object
  - `vendor_uid` string[]: UIDs to target. Alternative to filter_rules.
  - `filter_rules` object[]
  - `filter_rule_operator` 'AND' | 'OR'
  - `action` 'activate' | 'send_email' | 'send_sms' | 'delete', required
  - `action_options` object: Shape depends on `action`: `activate` → `{is_active: boolean}`; `send_email` → `{cc?: string[], bcc?: string[]}`; `send_sms` → `{sms_body: string}` (Handlebars template); `delete` → no fields.
  - `update_status` boolean

## Response `200`

200

- object
  - `type` 'SUCCESS'
  - `title` string
  - `message` string
  - `skipped_vendors` object[]: Present only for action=delete.
    - `vendor_uid` string
    - `reason` string

## Changes

- **2026-11-03** `3c21bc232e16`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/zuper/apis/zuper-pro-api/changes/subcontractors/bulk_action/post.md)

---

[API](https://skmtc.dev/zuper/apis/zuper-pro-api.md) - [All operations](https://skmtc.dev/zuper/apis/zuper-pro-api/llms.txt) - [OpenAPI document](https://skmtc.dev/zuper/apis/zuper-pro-api/revisions/3c21bc232e16?raw)
