---
title: "Retire a phone number (soft, default) or hard-delete (force=true, internal only)"
method: DELETE
path: "/v1/communication/phone-numbers/{phone_number_id}"
tags: ["communication"]
---

# Retire a phone number (soft, default) or hard-delete (force=true, internal only)

`DELETE /v1/communication/phone-numbers/{phone_number_id}`

Retire (default) or hard-delete (``force=true``, internal only) a
phone number.

Default — soft-retire (ENG-847, HV-17): flips status to RETIRED, tears
down per-number SIP infra best-effort, stamps actor/timestamp, and keeps
the row and every dependent evidence row (SMS/voice usage, and the
ENG-846 durable chunk/attempt/outbox/operation chain) intact. This is
now the day-to-day, audited, reversible path (see ``.../restore``).

``force=true`` is the internal-only escape hatch that performs the
actual, permanent hard delete (evidence-safe: dependent SMS/voice usage
rows detach via ``ON DELETE SET NULL`` rather than cascading away) — the
explicit, policy-driven purge, not an accidental cascade. Non-internal
callers that pass ``force=true`` are rejected with 403.

## Path parameters

- `phone_number_id` string, uuid, required

## Query parameters

- `force` boolean

## Response `204`

Successful Response

## Other responses

- `400` — Bad request
- `401` — Authentication required
- `404` — Resource not found
- `422` — Validation Error

---

[API](https://skmtc.net/oneloop-hq/apis/feather-api.md) · [All operations](https://skmtc.net/oneloop-hq/apis/feather-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/oneloop-hq/feather-api/revisions/5a5597ebb2d6/schema)
