Skip to content

organization_read_only

HTTP status: 403 Forbidden

The organization is read-only, so the request was refused. An organization lands in this state after a downgrade it didn’t choose, such as a canceled or lapsed subscription, when it still holds more than the new plan allows. Nothing was deleted. The organization can’t add to what it has until it fits again.

It shares a status code with forbidden, which is about the token’s role, and with plan_limit_reached, which is about a single create going past a cap. Branch on error to tell them apart. A token with a higher role gets the same answer here, and so does a retry.

  • Reading everything: projects, flags, targeting, members, usage and billing.
  • Turning flags on and off, with POST /api/v1/orgs/{org}/projects/{project}/flags/{flag}/environments/{env}/toggle. Terraform users: a plan that edits flag settings is refused, so use this endpoint to switch a flag off.
  • Cleaning up: archiving or deleting flags, deleting projects and environments, removing members, revoking invitations, keys and tokens, and deleting webhooks.
  • Billing: choosing a plan the organization fits, and the billing pages. A downgrade or a cancellation needs the cleanup first. It is refused until the organization fits the lower plan.
  • Reactivating a deactivated organization. Any other change to the organization’s settings, such as its name, is refused.
  • Single sign-on deactivation and domain release.

Creating or editing anything else returns this error. Flag evaluation is untouched, so your SDKs and the Evaluation API keep serving flags exactly as before. Scheduled flag changes keep firing too.

  • Clean up until the organization fits its plan. Remove members or invitations, delete projects or environments, archive flags and delete webhooks that you no longer need. Archived flags don’t count toward the flag cap.
  • Or choose a plan that fits what you have. The pricing page lists each plan’s caps.

The state lifts the moment the organization fits. A cleanup request that leaves you under every cap clears it right away. Choosing a plan the organization fits does the same, whether you change it in the dashboard or through Stripe checkout. There is nothing else to call.

Organizations that were already over a cap before this behavior existed are left as they are.

{
"error": "organization_read_only",
"message": "This organization is read-only because it is over its plan's limits. You can still turn flags on and off (from the API or Terraform, use the toggle endpoint: POST .../flags/{flag}/environments/{env}/toggle), clean up (archive or delete flags, delete projects and environments, remove members, revoke invites, keys and tokens, delete webhooks) and choose a plan the organization fits. A downgrade or cancellation needs the cleanup first. It becomes writable again once it fits its plan, either by cleaning up or by choosing a plan it fits.",
"docs_url": "https://featureflip.io/docs/management-api/errors/organization_read_only"
}