langgenius/dify · warning

The number of members has reached the limit of your subscrip

Error message

The number of members has reached the limit of your subscription.

What it means

HTTP 403 from `cloud_edition_billing_resource_check("members")`. Inside the decorator, when `resource == "members"` and `0 < members.limit <= members.size`, it aborts with `The number of members has reached the limit of your subscription.` Invite/add-member operations are blocked at the quota ceiling.

Source

Thrown at api/controllers/console/wraps.py:202

                if dify_config.DEPLOYMENT_EDITION != DeploymentEdition.CLOUD:
                    return view(*args, **kwargs)

                vector_space = FeatureService.get_vector_space(current_tenant_id)
                if 0 < vector_space.limit <= vector_space.size:
                    abort(
                        403,
                        "The capacity of the knowledge storage space has reached the limit of your subscription.",
                    )
                return view(*args, **kwargs)

            features = FeatureService.get_features(current_tenant_id, exclude_vector_space=True)
            if features.billing.enabled:
                members = features.members
                apps = features.apps
                documents_upload_quota = features.documents_upload_quota
                annotation_quota_limit = features.annotation_quota_limit
                if resource == "members" and 0 < members.limit <= members.size:
                    abort(403, "The number of members has reached the limit of your subscription.")
                elif resource == "apps" and 0 < apps.limit <= apps.size:
                    abort(403, "The number of apps has reached the limit of your subscription.")
                elif resource == "documents" and 0 < documents_upload_quota.limit <= documents_upload_quota.size:
                    # The api of file upload is used in the multiple places,
                    # so we need to check the source of the request from datasets
                    source = request.args.get("source") or request.form.get("source")
                    if source == "datasets":
                        abort(403, "The number of documents has reached the limit of your subscription.")
                    else:
                        return view(*args, **kwargs)
                elif resource == "workspace_custom" and not features.can_replace_logo:
                    abort(403, "The workspace custom feature has reached the limit of your subscription.")
                elif resource == "annotation" and 0 < annotation_quota_limit.limit < annotation_quota_limit.size:
                    abort(403, "The annotation quota has reached the limit of your subscription.")
                else:
                    return view(*args, **kwargs)

            return view(*args, **kwargs)

View on GitHub (pinned to ef8544b173)

Solutions

  1. Upgrade the workspace plan to raise the seat limit.
  2. Remove an inactive member to free a seat before inviting a new one.
  3. Check `FeatureService.get_features(...).members` (`limit` vs `size`) in the UI and warn before the user attempts to invite.
  4. Confirm the features cache is fresh if you believe the count is wrong.

Example fix

// before
await inviteMember(email)  // 403 when at seat limit
// after
const { members } = await getFeatures()
if (members.limit > 0 && members.size >= members.limit) {
  alert('Seat limit reached — upgrade or remove a member.')
} else {
  await inviteMember(email)
}
Defensive patterns

Strategy: validation

Validate before calling

from services.feature_service import FeatureService

_, tenant_id = current_account_with_tenant()
features = FeatureService.get_features(tenant_id, exclude_vector_space=True)
m = features.members

def can_add_member() -> bool:
    return not (m.limit > 0 and m.size >= m.limit)

if not can_add_member():
    # surface upgrade / remove-member prompt instead of inviting
    ...

Type guard

def seats_available(limit: int, size: int) -> bool:
    return not (limit > 0 and size >= limit)

Try / catch

try:
    resp = client.post("/workspace/members/invite-email", ...)
except HTTPError as err:
    if err.response.status_code == 403 and "members" in err.response.text:
        # seat limit reached — upgrade or remove a member
        ...
    raise

Prevention

When it happens

Trigger: Inviting a new member (or any operation gated by `cloud_edition_billing_resource_check("members")`) on a tenant whose seat count has reached the plan's seat limit.

Common situations: Team plan with a 3-seat limit trying to add a 4th member; bulk invite pushing count over the cap; stale features cache making `size` undercount (less common).

Related errors


AI-assisted analysis of langgenius/dify@ef8544b173 (2026-08-12). Data as JSON: /api/errors/82b6374a1f8a653a. Report an issue: GitHub.