Skip to content

Lift a hold on an organization's escalation

The platform_billing.holds.lift operation: DELETE /api/v1/platform/organizations/{orgId}/billing_hold in the REST API and the platform_billing_holds_lift tool in the MCP server.

DELETE/api/v1/platform/organizations/{orgId}/billing_hold

Ends a platform admin's hold (platform_billing.holds.set): the organization's status follows the time since its Ownrecord payment first failed again, at once (restricted after 14 days, suspended after 30, by default). Lifting an organization without a hold changes nothing. Platform admins only; recorded in the audit log.

At a glance

  • REST: DELETE /api/v1/platform/organizations/{orgId}/billing_hold
  • MCP tool: platform_billing_holds_lift
  • Operation ID: platform_billing.holds.lift
  • Scope: Platform
  • Permission: platform:admin
  • Risk tier: write
  • Dry run: Supported (send Ownrecord-Dry-Run: true)
  • Idempotency: Idempotency-Key optional
  • Modes: Test and live
  • Authentication: API key with the platform:admin scope
  • Fresh sign-in: In the console, a sign-in within the last 15 minutes
  • Since: M12

Request

Path parameters

FieldTypeDescription
orgIdorg_… IDThe organization (org_…).

Body

A JSON object (Content-Type: application/json):

FieldTypeRequiredDescription
reasonstringYesWhy, for the audit log.

Response

200 OK with a JSON object:

FieldTypeDescription
object"platform_billing_hold"
orgIdstring
statusone of active, restricted, suspended, closing, closed
holdobject or null
unpaidSincedate-time or null
stageone of active, restricted, suspended or null
nextobject or null
billingOwnsStatusboolean

Examples

Lift a hold

HTTP
DELETE /api/v1/platform/organizations/org_01jbz3m4k5n6p7q8r9s0t1v2w3/billing_hold
Authorization: Bearer or_test_…
Content-Type: application/json

{
  "reason": "The promised transfer didn't arrive"
}

Response (200):

JSON
{
  "object": "platform_billing_hold",
  "orgId": "org_01jbz3m4k5n6p7q8r9s0t1v2w3",
  "status": "suspended",
  "hold": null,
  "unpaidSince": "2026-10-05T09:12:00.000Z",
  "stage": "suspended",
  "next": null,
  "billingOwnsStatus": true
}

Errors

CodeHTTP statusWhenWhat to do
validation_failed400The organization ID, stage, reason or date is missing or malformed.Fix the fields listed in details.issues and send the request again.
platform_billing_unavailable409Ownrecord's plans aren't set up on this installation yet.A platform admin runs pnpm platform:bootstrap, which creates the plans, prices and features of data/platform/plans.yaml. Try again afterwards.
resource_not_found404There is no such organization.Check the ID and that your credentials are scoped to the right organization, entity, brand and mode.
permission_denied403Only a platform_admin holds an organization's escalation.Ask an organization owner or admin for a role or scope that allows this action.
fresh_auth_required403Your last sign-in is older than 15 minutes: sign in again first.Sign in again, then repeat the action within 15 minutes.

It can also return these common errors: api_version_unsupported, invalid_json, unsupported_media_type, authentication_required, api_key_invalid, idempotency_key_reused, idempotency_in_progress, rate_limited, internal_error.