---
title: "Release Account Hold"
method: POST
path: "/accounts/{account_id}/release-hold"
tags: ["accounts"]
---

# Release Account Hold

`POST /accounts/{account_id}/release-hold`

## Request

- Base URL: `https://dev.whispa.net` (the document declares no server; this is the origin it was published from)
- URL: `https://dev.whispa.net/accounts/{account_id}/release-hold`
- Auth: one of:
  - OAuth 2
    - Password
    - Token URL: `auth/bearer/login`
  - API key in cookie `access_token`

Clear the hold that stops every automatic call to an account (admin only).

Records who cleared it, when, and what the hold was. Campaign memberships
the hold closed stay as they are; resume them from the campaign or the
review queue. A creditor file feed's hold cannot be cleared here (409).

## Path parameters

- `account_id` string, uuid, required

## Response `200`

Successful Response

- CachedAccountRead: One working-set row (``crm_accounts``): the accounts surface's unit. A snapshot of the provider's account as of ``synced_at`` plus the whispa-only suppression state — the provider's CRM stays the system of record for every debt fact.
  - `id` string, uuid, required
  - `provider` string, required
  - `external_id` string, required
  - `display_name` string, required
  - `account_number` string, nullable
  - `email` string, nullable
  - `address` string, nullable
  - `dob` string, date, nullable
  - `customer_id` string, nullable
  - `client_id` string, nullable
  - `phone` string, nullable
  - `phones` string[]
  - `state` string, nullable
  - `timezone` string, nullable
  - `manual_timezone` string, nullable
  - `manual_timezone_set_by` string, uuid, nullable
  - `manual_timezone_set_by_email` string, nullable
  - `manual_timezone_set_at` string, date-time, nullable
  - `status` string, nullable
  - `balance` number, nullable
  - `arrears_amount` number, nullable
  - `original_balance` number, nullable
  - `amount_paid` number, nullable
  - `collection_stage` string, nullable
  - `context` AccountContextRead: Wire shape for domain-shared account context (debt-collection state). Mirrors `src.crm.base.AccountContext`. Every field is optional because providers expose different subsets, and within a single provider some fields are only present when the underlying record has them set.
    - `product_name` string, nullable
    - `account_status` string, nullable
    - `account_status_disposition` 'workable' | 'not_workable' | 'resolved' | 'unknown': Provider-neutral meaning of a CRM's native account status. Providers keep their raw status in ``AccountContext.account_status`` for display and audit, then map it onto this small contract for autonomous outbound policy. Adding another CRM means adding its native-code mapping in that provider; the compliance gate never needs vendor status strings.
    - `collection_stage` 'open' | 'arrangement' | 'broken_arrangement' | 'paid' | 'settled' | 'excluded' | 'unknown': Provider-neutral collections-funnel position of a CRM's native status. Orthogonal to :class:`AccountStatusDisposition`, which answers "may the autonomous scheduler dial this account". The stage answers "where does this debt sit in the collections funnel" for reporting: an arrangement in place and a broken arrangement are both not-workable, but they are opposite outcomes on a performance dashboard. ``EXCLUDED`` marks accounts whose balance can move without money being collected (disputed, deceased, bankrupt, statute-barred), so recovery metrics can leave them out rather than count adjustments as payments.
    - `arrears_amount` number, nullable
    - `arrears_days` integer, nullable
    - `outstanding_amount` number, nullable
    - `original_balance` number, nullable
    - `amount_paid` number, nullable
    - `last_payment_date` string, date, nullable
    - `principal_outstanding` number, nullable
    - `referred_date` string, date, nullable
    - `interest_overdue` number, nullable
    - `interest_rate` number, nullable
    - `late_fees` number, nullable
    - `dishonour_fees` number, nullable
    - `settled_date` string, date, nullable
    - `cycle_day` integer, nullable
    - `repayment_amount` number, nullable
    - `repayment_frequency` string, nullable
    - `next_installment_amount` number, nullable
    - `next_installment_date` string, date, nullable
    - `has_hardship` boolean, nullable
    - `hardship_requested` boolean, nullable
    - `hardship_status` string, nullable
    - `hardship_notice_date` string, date, nullable
    - `active_arrangement_summary` string, nullable
    - `active_arrangement_status` string, nullable
    - `active_arrangement_next_amount` number, nullable
    - `active_arrangement_next_date` string, date, nullable
    - `collection_statuses` string[]
    - `risk_segmentation` string, nullable
    - `num_active_loans` integer, nullable
    - `num_broken_arrangements_last_6_months` integer, nullable
    - `num_dishonours_last_6_months` integer, nullable
    - `num_contacts_last_30_days` integer, nullable
    - `third_party_authority` boolean, nullable
    - `is_staff_account` boolean, nullable
    - `is_outsourced` boolean, nullable
    - `outsource_partner` string, nullable
    - `is_written_off` boolean, nullable
    - `joint_parties` JointPartyRead[]
      - `customer_id` string, nullable
      - `display_name` string, nullable
      - `relationship` string, nullable
    - `recent_transactions` LedgerEntryRead[]
      - `occurred_on` string, date, nullable
      - `description` string, nullable
      - `amount` number, nullable
      - `balance_after` number, nullable
      - `kind` string, nullable
    - `recent_contacts` ContactEventRead[]
      - `occurred_on` string, date, nullable
      - `description` string, nullable
      - `channel` string, nullable
      - `completed` boolean, nullable
      - `done_date` string, date, nullable
    - `recent_successful_contact_dates` string[]: Provider-classified successful contacts for outbound frequency caps; duplicate dates represent separate contacts.
    - `days_past_section_88` integer, nullable
    - `days_past_information_request` integer, nullable
    - `days_past_six_q` integer, nullable
  - `data_source` 'crm' | 'csv'
  - `source_filename` string, nullable
  - `source_data` object, nullable
  - `suppression_reason` string, nullable
  - `suppressed_at` string, date-time, nullable
  - `suppression_released_reason` string, nullable
  - `suppression_released_by` string, uuid, nullable
  - `suppression_released_by_email` string, nullable
  - `suppression_released_at` string, date-time, nullable
  - `synced_at` string, date-time, required
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required
  - `suppression_releasable` boolean, required: Whether an operator may clear the hold: a creditor file's is the file's to lift.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/whispa/apis/whispa-api.md) - [All operations](https://skmtc.dev/whispa/apis/whispa-api/llms.txt) - [OpenAPI document](https://skmtc.dev/whispa/apis/whispa-api/revisions/12c2e4aca43c?raw)
