---
title: "Bulk Action Customer"
method: POST
path: "/customers/bulk_action"
---

# Bulk Action Customer

`POST /customers/bulk_action`

## Request

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

Performs a bulk action on a set of customers. The customer set is determined by an explicit `customer_uid` array, `filter_rules` (v3), and/or the legacy `filter` object — all three can be combined; `customer_uid` narrows additively. Role-based scoping is always applied on top: a Field Executive only sees their own records, a Team Leader only their team's (unless the company allows viewing all).

`delete`, `activate`, and `update_field` apply synchronously. `send_email` and `send_sms` respond before the per-customer send loop finishes (fire-and-forget relative to the response). `send_customer_ar_aging_statement` is fully asynchronous — it queues a worker job and responds immediately with just an acknowledgement.

`activate`'s `is_active` is toggle-style: the request is automatically scoped to customers NOT already in the target state before applying it.

## Request body

- object
  - `action` 'delete' | 'activate' | 'update_field' | 'send_email' | 'send_sms' | 'send_customer_ar_aging_statement'
  - `customer_uid` string[]: Optional explicit list of customer uids. Combined additively ($in) with filter_rules/filter.
  - `filter_rules` object[]: v3 filter engine rules used to select the customer set.
  - `filter` object: Legacy filter object. For send_customer_ar_aging_statement with no customer_uid given, also supports filter.aging_period (comma list of 30_day, 60_day, 90_day, above_90, current) and filter.due_date_from / filter.due_date_to.
    - `keyword` string
    - `aging_period` string
    - `due_date_from` string
    - `due_date_to` string
  - `action_options` object
    - `is_active` boolean: activate only. Required.
    - `custom_field` object: update_field only. Mutually exclusive with the plain field options below.
      - `label` string
      - `value` string
      - `type` string
      - `read_only` boolean
      - `hide_to_fe` boolean
      - `hide_field` boolean
      - `group_uid` string
      - `group_name` string
    - `customer_first_name` string: update_field only. Blocked if this field is configured as the company's unique customer identifier.
    - `customer_last_name` string: update_field only.
    - `customer_email` string: update_field only. Blocked if this field is configured as the company's unique customer identifier.
    - `customer_description` string: update_field only.
    - `customer_tags` string[]: update_field only.
    - `customer_mobile_number` string: update_field only. Blocked if this field is configured as the company's unique customer identifier.
    - `customer_work_number` string: update_field only.
    - `customer_home_number` string: update_field only.
    - `customer_category` string: update_field only. A category uid.
    - `enable_customer_portal` 'true' | 'false': update_field only.
    - `can_access_organization_records` boolean: update_field only. Used together with enable_customer_portal.
    - `pricelist` string: update_field only. A pricelist uid.
    - `do_not_service` 'true' | 'false': update_field only.
    - `source` string: update_field only. A request_source uid.
    - `email_subject` string: send_email, send_customer_ar_aging_statement. Required unless send_email is used with email_for_add_payment_card=true.
    - `email_body` string: send_email, send_customer_ar_aging_statement. Required unless send_email is used with email_for_add_payment_card=true.
    - `cc` string[]: send_email only.
    - `bcc` string[]: send_email only.
    - `from_email` string: send_email only.
    - `email_for_add_payment_card` boolean: send_email only. Sends an add-payment-card-on-file email instead of a custom email. Requires the company's allow_card_on_file setting to be enabled.
    - `sms_body` string: send_sms only. Required.
    - `email_config_uid` string: send_customer_ar_aging_statement only. Optional.
    - `preferred_date_format` string: send_customer_ar_aging_statement only. Optional.

## Response `200`

200

- object
  - `type` string
  - `title` string
  - `message` string
  - `data` object: Present only for send_email, listing customers skipped for lacking an email address.
    - `email_skipped_customers` string[]

## Other responses

- `400`: 400

## Changes

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

[Operation history](https://skmtc.dev/zuper/apis/zuper-pro-api/changes/customers/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)
