---
title: "Add or subtract card points"
method: POST
path: "/v2/loyalties/programs/{programId}/members/{memberId}/cards/{cardId}/points"
tags: ["Programs"]
---

# Add or subtract card points

`POST /v2/loyalties/programs/{programId}/members/{memberId}/cards/{cardId}/points`

## Request

- Base URL: `https://api.voucherify.io`
- URL: `https://api.voucherify.io/v2/loyalties/programs/{programId}/members/{memberId}/cards/{cardId}/points`
- Auth: none required

<Warning>

<Badge color="yellow">BETA endpoint</Badge>

This is a work-in-progress documentation of a BETA endpoint. The parameters, fields, request and response bodies, and other data may subject to change. If you want to share feedback or improvements, contact [Voucherify support](https://www.voucherify.io/contact-support) or your Technical Account Manager.

</Warning>

Manually adjusts the points balance of the member's card. A positive `points` value
creates an `ADMIN_CREDIT` card transaction (points addition - the added points get
an expiration date calculated from the card definition's points expiration
settings); a negative value creates an `ADMIN_DEBIT` card transaction (points
subtraction). When `points` is `0`, no transaction is created and the result status
is `NO_CHANGE`.

The transaction is created with status `PENDING` and processed asynchronously.
Both the program and the member must be in `ACTIVE` status (423 otherwise). Returns
404 when the program, member or card does not exist.

## Path parameters

- `programId` string, required
- `memberId` string, required
- `cardId` string, required

## Request body

- CardPointsRequest: Request body for a manual card points adjustment. No additional properties are allowed.
  - `points` integer, required: Number of points to adjust. Positive values add points (`ADMIN_CREDIT` transaction), negative values subtract points (`ADMIN_DEBIT` transaction), zero results in no transaction (`NO_CHANGE`). Required.
  - `reason` string: Optional reason for the adjustment, stored in the transaction details.

## Response `200`

Result of the points adjustment.

- CardPointsAdjustmentResult: Result of a manual card points adjustment.
  - `transaction` CardTransaction, required: A card transaction.
    - `id` string, required: Unique card transaction ID.
    - `card_id` string, required: ID of the card the transaction belongs to.
    - `program_id` string, required: ID of the loyalty program.
    - `member_id` string, required: ID of the member owning the card.
    - `card_definition_id` string, required: ID of the card definition of the card.
    - `card_type` 'INDIVIDUAL', required: Card type.
    - `type` 'ADMIN_CREDIT' | 'ADMIN_DEBIT' | 'ADMIN_POINTS_EXPIRATION' | 'POINTS_EARNED' | 'POINTS_SPENT_ON_REWARD' | 'POINTS_PURCHASED' | 'POINTS_PURCHASE_REVERSED' | 'POINTS_SPENT_ON_ORDER' | 'POINTS_REFUNDED' | 'POINTS_RETURNED' | 'POINTS_EXPIRED' | 'PENDING_POINTS_ADDED' | 'PENDING_POINTS_ACTIVATED' | 'PENDING_POINTS_CANCELED', required: Transaction type.
    - `details` CardTransactionDetails, required: Card transaction details. `reason`, `rejection` and `metadata` are present on all variants; the remaining fields depend on the transaction `type`: - `ADMIN_CREDIT`: `points` (`total`, `expiration_date`) - `ADMIN_DEBIT`: `points` (`total`) - `ADMIN_POINTS_EXPIRATION`: `bucket` (the expired points bucket) - `POINTS_EARNED`: `points` (`total`, `expiration_date`) - `POINTS_EXPIRED`: `points` (`total`), `date`, `buckets` - `POINTS_SPENT_ON_REWARD`: `points` (`total`), `reward`, `reward_transaction`, `target_card`, `purchase_transaction` - `POINTS_PURCHASED`: `points` (`total`, `expiration_date`, `expiration_type`), `reward`, `reward_transaction`, `card_transaction` - `POINTS_PURCHASE_REVERSED`: `points` (`total`, `expiration_date`, `expiration_type`), `reward`, `purchase`, `reward_transaction` - `POINTS_SPENT_ON_ORDER`: `points` (`total`), `order`, `order_transaction` - `POINTS_REFUNDED`: `points` (`total`) - `POINTS_RETURNED`: `points` (`total`, `expiration_date`, `expiration_type`), `reward`, `purchase`, `reward_transaction` - `PENDING_POINTS_ADDED` / `PENDING_POINTS_ACTIVATED` / `PENDING_POINTS_CANCELED`: `points` (`total`, `date`, `type`)
      - `reason` unknown
      - `rejection` object: Rejection details when the transaction was rejected, or null.
        - `reason` string: Rejection reason.
        - `details` string: Detailed rejection description.
      - `metadata` object: Transaction metadata (empty object when none).
      - `points` object: Points affected by the transaction (variant-dependent fields).
        - `total` number: Number of points. Negative for debits.
        - `expiration_date` string, date: Expiration date of the affected points (`YYYY-MM-DD`), or null.
        - `expiration_type` unknown
        - `date` string, date: Activation date of the pending points (`YYYY-MM-DD`). Pending points variants only.
        - `type` 'IMMEDIATE' | 'PERIOD_BASED' | 'FIXED_DATES' | 'EVENT_BASED': Pending points activation type. Pending points variants only.
      - `bucket` CardPointsBucketSimple: Simple representation of a points expiration bucket, embedded in card transaction details.
        - `id` string, required: Points expiration bucket ID.
        - `points` object, required: Points held in the bucket.
          - `total` number, required: Number of points in the bucket.
        - `expiration_date` string, date, required: Date when the points in the bucket expire (`YYYY-MM-DD`).
        - `expiration_type` 'NO_EXPIRATION' | 'ROLLING_EXPIRATION' | 'CALENDAR_EXPIRATION' | 'SLIDING_EXPIRATION', required: Points expiration type.
      - `buckets` CardPointsBucketSimple[]: The points buckets that expired (`POINTS_EXPIRED` only).
        - `id` string, required: Points expiration bucket ID.
        - `points` object, required: Points held in the bucket.
          - `total` number, required: Number of points in the bucket.
        - `expiration_date` string, date, required: Date when the points in the bucket expire (`YYYY-MM-DD`).
        - `expiration_type` 'NO_EXPIRATION' | 'ROLLING_EXPIRATION' | 'CALENDAR_EXPIRATION' | 'SLIDING_EXPIRATION', required: Points expiration type.
      - `date` string, date: Expiration date (`POINTS_EXPIRED` only, `YYYY-MM-DD`).
      - `reward` object: Reference to the reward involved, or null.
        - `id` string: Reward ID (`lrew_[a-f0-9]+`).
      - `reward_transaction` object: Reference to the related reward transaction, or null.
        - `id` string: Reward transaction ID (`lrtx_[a-f0-9]+`).
      - `card_transaction` object: Reference to the linked card transaction (e.g. the spend side of a points purchase), or null.
        - `id` string: Card transaction ID (`lctx_[a-f0-9]+`).
      - `purchase` object: References to the original purchase transactions (reversal/return variants), or null.
        - `card_transaction` object
          - `id` string: Card transaction ID (`lctx_[a-f0-9]+`).
        - `reward_transaction` object
          - `id` string: Reward transaction ID (`lrtx_[a-f0-9]+`).
      - `order` object: Reference to the order paid with points (`POINTS_SPENT_ON_ORDER` only), or null.
        - `id` string: Order ID.
      - `order_transaction` object: Reference to the related order transaction (`POINTS_SPENT_ON_ORDER` only), or null.
        - `id` string: Order transaction ID (`lotx_[a-f0-9]+`).
      - `target_card` object: Reference to the target card credited by a points purchase (`POINTS_SPENT_ON_REWARD` only), or null.
        - `id` string: Card ID (`lcrd_[a-f0-9]+`).
      - `purchase_transaction` object: Reference to the linked purchase card transaction (`POINTS_SPENT_ON_REWARD` only), or null.
        - `id` string: Card transaction ID (`lctx_[a-f0-9]+`).
    - `status` 'PENDING' | 'PROCESSING' | 'APPROVED' | 'REJECTED', required: Transaction processing status. Transactions are created as `PENDING` and processed asynchronously.
    - `created_at` string, date-time, required: Timestamp when the transaction was created (ISO 8601).
    - `updated_at` string, date-time, required: Timestamp when the transaction was last updated (ISO 8601), or null.
    - `object` string, required: Object type marker, always `card_transaction`.
  - `status` 'TRANSACTION_CREATED' | 'NO_CHANGE', required: `TRANSACTION_CREATED` when a transaction was created, `NO_CHANGE` when the requested points amount was zero.
  - `message` string, required: Human-readable result message - "Points addition transaction created", "Points subtraction transaction created" or "Provided amount is zero, transaction was not created".

## Other responses

- `400`: Validation error - request body or query parameters failed validation, or the operation is not allowed in the current resource state.
- `404`: Resource not found.
- `409`: Conflict - e.g. duplicate resource or invalid state transition.
- `423`: Resource locked - a related resource is in a state that prevents this operation.
- `500`: Internal server error.

---

[API](https://skmtc.dev/voucherifyio/apis/voucherify-api-async-actions.md) - [All operations](https://skmtc.dev/voucherifyio/apis/voucherify-api-async-actions/llms.txt) - [OpenAPI document](https://skmtc.dev/voucherifyio/apis/voucherify-api-async-actions/revisions/4982266e0494?raw)
