{"record":{"id":"a2c820317fbfc1c9","repo":"TryGhost/Ghost","slug":"a-hosting-plan-limit-was-reached-or-exceeded","errorCode":null,"errorMessage":"A hosting plan limit was reached or exceeded.","messagePattern":"A hosting plan limit was reached or exceeded\\.","errorType":"http","errorClass":"HostLimitError","httpStatus":null,"severity":"error","filePath":"apps/admin-x-framework/src/utils/api/handle-response.ts","lineNumber":35,"sourceCode":"    } else if (!response.ok) {\n        if (!response.headers.get('content-type')?.includes('json')) {\n            throw new APIError(response, await response.text());\n        }\n\n        const data = await response.json() as ErrorResponse;\n\n        if (response.status === 403 && data.errors?.[0]?.message === 'Authorization failed') {\n            throw new UnauthorizedError(response, data);\n        } else if (data.errors?.[0]?.type === 'VersionMismatchError') {\n            throw new VersionMismatchError(response, data);\n        } else if (data.errors?.[0]?.type === 'ValidationError') {\n            throw new ValidationError(response, data);\n        } else if (data.errors?.[0]?.type === 'NoPermissionError') {\n            throw new ValidationError(response, data);\n        } else if (data.errors?.[0]?.type === 'ThemeValidationError') {\n            throw new ThemeValidationError(response, data);\n        } else if (data.errors?.[0]?.type === 'HostLimitError') {\n            throw new HostLimitError(response, data);\n        } else if (data.errors?.[0]?.type === 'EmailError') {\n            throw new EmailError(response, data);\n        } else {\n            throw new JSONError(response, data);\n        }\n    } else if (response.status === 204) {\n        return;\n    } else if (response.headers.get('content-type')?.includes('text/csv')) {\n        return await response.text();\n    } else {\n        return await response.json();\n    }\n};\n\nexport default handleResponse;\n","sourceCodeStart":17,"sourceCodeEnd":51,"githubUrl":"https://github.com/TryGhost/Ghost/blob/47d8b0e2ad2fd4757d3bc45f46c3ac165ff8a1fe/apps/admin-x-framework/src/utils/api/handle-response.ts#L17-L51","documentation":"HostLimitError, thrown by handleResponse when errors[0].type === 'HostLimitError'. It indicates an enforced hosting-plan limit was reached — member count, staff/user count, or another metered cap on Ghost(Pro) (or a host implementing the same error type). The specific limit is in error.data.","triggerScenarios":"Performing an action that would exceed the plan's cap: importing members past the plan limit; inviting staff beyond the allowed seats; an operation blocked by the hosting provider's quota enforcement.","commonSituations":"Ghost(Pro) Starter/Basic plans with member or staff limits; an import that would push members over the tier cap; a host-side restriction not visible in self-host Ghost.","solutions":["Read error.data.errors[0].message/context to see which limit was hit and by how much.","Upgrade the hosting plan to raise the affected cap, or reduce usage (remove inactive members/staff) below the limit.","For member imports, split or filter the import so it stays within the remaining quota."],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":null,"typeGuard":"import {HostLimitError} from '@tryghost/admin-x-framework/utils/errors';\nfunction isHostLimit(e: unknown): e is HostLimitError {\n    return e instanceof HostLimitError;\n}","tryCatchPattern":"import {HostLimitError} from '@tryghost/admin-x-framework/utils/errors';\ntry {\n    await api.members.upload(csvFile);\n} catch (e) {\n    if (e instanceof HostLimitError) {\n        notify('Plan limit reached. Upgrade your plan or remove unused members.');\n        // e.data?.errors?.[0]?.message has the specific cap\n    } else throw e;\n}","preventionTips":["Check remaining quota before bulk member imports.","Surface the specific limit from error.data so the user knows whether it's members, staff, etc.","Offer an in-app upgrade path when the limit is a hosting-plan cap."],"tags":["hosting","plan-limit","members","staff","quota"],"backgroundTag":null,"analyzedSha":"47d8b0e2ad2fd4757d3bc45f46c3ac165ff8a1fe","analyzedAt":"2026-08-13T01:25:26.651Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}