---
title: "Cancel a contract"
method: DELETE
path: "/v1/contracts/{id}"
tags: ["Contracts"]
---

# Cancel a contract

`DELETE /v1/contracts/{id}`

Cancel an active contract. Sets status to `CANCELLED`.

Cancellation is permanent — cancelled contracts cannot be reactivated. Any remaining prepaid balance is frozen. Price overrides from this contract stop applying to new charges immediately.

Already-cancelled contracts return a 400 error.

> **Requires a secret key (`sk_*`) with the `ADMIN` role.**

## Path parameters

- `id` string, required

## Response `200`

Contract cancelled successfully

- object — Contract cancelled successfully
  - `id` string, required — Unique identifier for the contract
  - `businessId` string, required — Business that owns this contract
  - `customerId` string, required — Customer this contract applies to (must be created via POST /customers first)
  - `name` string, required — Human-readable name for the contract
  - `status` 'ACTIVE' | 'PAUSED' | 'EXPIRED' | 'CANCELLED', required — Current contract status. Only ACTIVE contracts affect billing. Transitions: ACTIVE → PAUSED, EXPIRED, or CANCELLED.
  - `startDate` string, date-time, required — When the contract takes effect (ISO 8601)
  - `endDate` string, date-time, nullable — When the contract expires (ISO 8601). Null means the contract is perpetual.
  - `minimumUsdc` string, nullable — Minimum committed spend in USDC for the contract period. If the customer spends less, they are still billed for the minimum.
  - `maximumUsdc` string, nullable — Maximum spend cap in USDC for the contract period. Charges that would exceed this cap are blocked.
  - `discountPct` string, nullable — Percentage discount applied to all charges under this contract (0-100, up to 2 decimal places)
  - `prepaidAmountUsdc` string, nullable — Total prepaid commit amount in USDC. This is the initial balance loaded into the contract.
  - `prepaidBalanceUsdc` string, nullable — Remaining prepaid balance in USDC. Decreases as charges are applied. When depleted, charges fall back to normal billing.
  - `prepaidRollover` boolean, required — Whether unused prepaid balance rolls over to the next billing period
  - `includedUnits` object, nullable — Free unit allocations per usage type per billing period. Usage within these limits is not charged. Keys are unit types, values are quantities.
  - `metadata` object, nullable — Arbitrary key-value metadata for your own tracking (e.g., Salesforce deal ID, internal notes)
  - `createdAt` string, date-time, required — When the contract was created
  - `updatedAt` string, date-time, required — When the contract was last updated
  - `priceOverrides` object[], required — Custom per-unit-type pricing that overrides default pricing plans for this customer
    - `id` string, required — Unique identifier for the price override
    - `unitType` string, required — The usage type this override applies to (must match a pricing plan `unitType`)
    - `unitPriceUsd` string, required — Custom price per unit in USD (string for decimal precision, up to 6 decimal places)

## Other responses

- `400` — Contract is already cancelled
- `401` — Unauthorized — missing or invalid API key
- `403` — Forbidden — API key does not have ADMIN role
- `404` — Contract not found

---

[API](https://skmtc.net/usedrip/apis/drip-api.md) · [All operations](https://skmtc.net/usedrip/apis/drip-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/usedrip/drip-api/revisions/2cb1567969ca/schema)
