---
title: "Api Points Transactions Partial Update"
method: PATCH
path: "/api/points-transactions/"
tags: ["platformApi"]
---

# Api Points Transactions Partial Update

`PATCH /api/points-transactions/`

PATCH handler with superadmin lock and field protection.

Checks:
1. Object lock (is_managed=True -> non-superadmins can't modify)
2. Field protection (non-superadmins can't modify specific fields)

## Headers

- `Authorization` string, required

## Request body

- PatchedPointsTransactionCreateRequest — Request body for the single admin Respan Points CREATE endpoint. Mirrors the credit ledger's ONE create endpoint: the action (grant vs redeem) is a ``transaction_type`` FIELD the FE classifies, not a separate URL. ``transaction_type`` is normalized to the canonical points event class and the view dispatches to ``assign_points`` / ``spend_points``. Action contract: - ``grant``: add points. ``conversion_rate`` OPTIONAL (falls back to the configured default rate). - ``redeem``: remove points. ``conversion_rate`` REQUIRED — ``spend_points`` deliberately has no default rate, since a redeem must state the USD rate the points are valued out at (otherwise the USD book value stays inflated). Idempotency: a retrying caller MUST supply BOTH a stable ``source_id`` AND a stable ``event_time`` — the ``ch_billing_event`` RMT dedup key is ``(org, event_time, event_class, billable_type, source_id)``, so a retry with a fresh timestamp would dodge dedup and double-write points. When ``event_time`` is omitted it defaults to ``now()``, which is correct ONLY for distinct one-off admin writes (each with its own unique source_id).
  - `transaction_type` 'grant' | 'redeem' — * `grant` - grant * `redeem` - redeem
  - `amount` number, double
  - `conversion_rate` number, double, nullable
  - `description` string
  - `source_id` string
  - `event_time` string, date-time

## Response `200`

- PointsTransactionCreate — Request body for the single admin Respan Points CREATE endpoint. Mirrors the credit ledger's ONE create endpoint: the action (grant vs redeem) is a ``transaction_type`` FIELD the FE classifies, not a separate URL. ``transaction_type`` is normalized to the canonical points event class and the view dispatches to ``assign_points`` / ``spend_points``. Action contract: - ``grant``: add points. ``conversion_rate`` OPTIONAL (falls back to the configured default rate). - ``redeem``: remove points. ``conversion_rate`` REQUIRED — ``spend_points`` deliberately has no default rate, since a redeem must state the USD rate the points are valued out at (otherwise the USD book value stays inflated). Idempotency: a retrying caller MUST supply BOTH a stable ``source_id`` AND a stable ``event_time`` — the ``ch_billing_event`` RMT dedup key is ``(org, event_time, event_class, billable_type, source_id)``, so a retry with a fresh timestamp would dodge dedup and double-write points. When ``event_time`` is omitted it defaults to ``now()``, which is correct ONLY for distinct one-off admin writes (each with its own unique source_id).
  - `transaction_type` 'grant' | 'redeem', required — * `grant` - grant * `redeem` - redeem
  - `amount` number, double, required
  - `conversion_rate` number, double, nullable
  - `description` string
  - `source_id` string
  - `event_time` string, date-time

---

[API](https://skmtc.net/keywordsai/apis/api-reference.md) · [All operations](https://skmtc.net/keywordsai/apis/api-reference/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/keywordsai/api-reference/versions/c26d550029f8/schema)
