---
title: "Batch create program members"
method: POST
path: "/v2/loyalties/programs/{programId}/members/batch"
tags: ["Programs"]
---

# Batch create program members

`POST /v2/loyalties/programs/{programId}/members/batch`

Schedules asynchronous batch creation of program members. The request body is a JSON array of member entries (maximum body size is 10 MB). The request is processed asynchronously in batches of 100 entries.

The program must exist (otherwise, it returns a `404` error) and be in the `ACTIVE` status (otherwise, it returns a `423` error). Supported member fields are validated during background processing using the same domain validation rules as single member creation. Entries that fail validation (missing/invalid `customer_id`, unknown customer, invalid `status`, duplicate `customer_id` within the same batch, member already exists) are reported per-entry  individually in the report linked from the async action result. The failed entries do not fail the whole batch (conflicting members are skipped).

Returns `202` status with the identifier of the scheduled async action. Use the [GET Async Action](/api-reference/async-actions/get-async-action) endpoint to check the status of the batch creation. You can also check the processing status and the result in the Audit log – [Background tasks](/analyze/audit-logs#background-tasks) in the Voucherify dashboard.

## Path parameters

- `programId` string, required

## Request body

- MemberCreate[] — Request body schema for **POST** `/v2/loyalties/programs/{programId}/members/batch`. Consists of a JSON array of member entries. The raw body is limited to 10485760 bytes (10 MB) and is processed asynchronously in batches of 100 entries. Each entry is validated like a single member creation request during background processing; per-entry failures (invalid customer_id format, unknown customer, invalid status, member already exists) are reported in the async action result.
  - `customer_identification` object
    - `type` 'customer_id' | 'customer_source_id', required — Defines how the customer is identified for the member creation. If `customer_id` is provided, the customer is identified by their unique Voucherify customer ID. Then, pass the required `customer_id` string. If `customer_source_id` is provided, the customer is identified by their source ID (e.g. from an external system). Then, pass the required `customer_source_id` string.
    - `customer_id` string — Unique Voucherify customer ID of an existing customer to enroll as a member. Required when `type` is `customer_id`.
    - `customer_source_id` string — Source ID from an external system of an existing customer to enroll as a member. Required when `type` is `customer_source_id`.
  - `status` 'ACTIVE' | 'INACTIVE', nullable — Initial member status. Defaults to `ACTIVE` when omitted or `null`.
  - `metadata` object, nullable — Free-form metadata attached to the member. Validated against the metadata schema defined for the `vl_member` related object (when one is configured). Defaults to an empty object.

## Response `202`

Batch creation has been scheduled.

- LoyaltiesProgramsMembersCreateInBulkResponseBody — Response body schema for **POST** `/v2/loyalties/programs/{programId}/members/batch`.
  - `async_action_id` string, required — ID of the scheduled async action processing the batch.

## Other responses

- `404` — Resource not found - the program ID could not be found.
- `413` — Payload too large - the request body exceeds the 10 MB limit.
- `423` — Resource locked - a related resource is in a state that prevents this operation.
- `500` — Internal server error.

## Changes

- **2026-08-06** (v2) `9bde8832a027` — 1 warning, 1 info
  - removed the request property `items/customer_id`
  - added the new optional request property `items/customer_identification`
- **2026-07-31** (v2) `099d7697577d` — 2 breaking, 2 info
  - added the new required request property `items/customer_id`
  - the `items/` request property type changed from no type to `object`
  - added the new optional request property `items/metadata`
  - added the new optional request property `items/status`
- **2026-07-31** (v2) `703a0a42ea43` — 1 breaking, 3 warning, 3 info
  - the `items/` request property type changed from `object` to no type
  - removed the request property `items/customer_id`
  - removed the request property `items/metadata`
  - removed the request property `items/status`
  - …3 more
- **2026-07-17** (v2) `4cbaee5a82d5` — 10 info
  - added the optional property `resource_id` to the response with the `400` status
  - added the optional property `resource_id` to the response with the `404` status
  - added the optional property `resource_id` to the response with the `409` status
  - added the optional property `resource_id` to the response with the `423` status
  - …6 more
- **2026-07-06** (v2) `341403eb19e5` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/voucherifyio/apis/voucherify-loyalty-v2-api/changes/v2/loyalties/programs/:programId/members/batch/post.md)

---

[API](https://skmtc.dev/voucherifyio/apis/voucherify-loyalty-v2-api.md) · [All operations](https://skmtc.dev/voucherifyio/apis/voucherify-loyalty-v2-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/voucherifyio/voucherify-loyalty-v2-api/revisions/dbfaefa45f8b/schema)
