---
title: "Refresh a Membership's status"
method: POST
path: "/customers/memberships/{membershipId}/update-status"
tags: ["Memberships"]
---

# Refresh a Membership's status

`POST /customers/memberships/{membershipId}/update-status`

Recomputes the derived status fields on a `Membership` (`status`
and `attention_reason`) based on the current state of its
underlying charges, billing schedule and external mandate. Use
this when an out-of-band event (a manual database fix, a stuck
webhook, a payment-provider reconciliation) has left the
membership in an inconsistent visible state and the operator
needs to nudge it back into sync.

The recomputation is deterministic — it derives the new status
from the membership's existing data, not from external inputs.
Pass `dry_run=true` to compute the new status without saving;
`dry_run=false` (the default) persists the recomputed values.

The response always returns both the previous and the new
`status` / `attention_reason` so callers can detect whether the
refresh actually changed anything.

## Request body

- object
  - `dry_run` boolean — When `true`, computes the new `status` and `attention_reason` but does **not** persist them. Use this to surface the proposed change to an operator before applying it. Defaults to `false`.

## Response `200`

The membership status was recomputed.

- object
  - `data` object, required
    - `previous_status` string, required — The `status` value the membership had before this endpoint was called. Identical to `new_status` when the refresh produced no change.
    - `previous_attention_reason` string, nullable, required — The `attention_reason` value the membership had before this endpoint was called, or `null` if it required no attention.
    - `new_status` string, required — The freshly-computed `status` for the membership. Identical to `previous_status` when the refresh produced no change.
    - `new_attention_reason` string, nullable, required — The freshly-computed `attention_reason`, or `null` if the membership now requires no operator attention.

## Other responses

- `401` — The user is unauthenticated
- `403` — The authenticated user does not have permission.
- `404` — The resource couldn't be found
- `422` — The request didn't pass validation

---

[API](https://skmtc.dev/try/apis/trybe-api.md) · [All operations](https://skmtc.dev/try/apis/trybe-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/try/trybe-api/revisions/f37f92702da5/schema)
