plan_not_eligible
API access is an entitlement of the workspace’s plan. Advanced and
Business are the plans sold with it; Enterprise, the
grandfathered Agency tier and admin-assigned Trial workspaces
carry the same entitlement. On every other tier — Free, Solo, and the
grandfathered Starter and Pro tiers — every API call, including
/v1/workspaces/me, returns this code.
A workspace an agency pays for carries the agency’s plan. The gate
resolves the plan the way the dashboard does: the customer that pays for
the workspace first (an agency’s Business subscription, for a client
workspace it manages), the workspace’s own customer record second. So a
member of an agency-managed client workspace who connects from that
workspace gets the same entitlement the dashboard shows them, and the
agency owner’s own connection still inherits the agency plan when it
switches into a client workspace. The refusal names the workspace it
judged (details.workspaceId), which for an OAuth connection is the
workspace chosen on the consent screen, so a member of several
workspaces can tell which one was read.
A single tool can also be plan-locked while the rest of the surface
works. The error then names the missing feature rather than API access:
update_global_tone_of_voice, for example, needs companyToneOfVoice
(Business and above). MCP keeps such a tool listed and returns this
error when it is called, because hosts cache the tool list for the whole
session — see MCP tools §2. Upgrading is the
only fix; the per-tool locks follow the same plan matrix as the
dashboard.
If your workspace recently downgraded, all live keys for the workspace
were invalidated synchronously when the Stripe webhook fired. Upgrading
re-enables the existing key rows; you don’t need to mint new keys.
To recover:
- Open the dashboard and visit Settings → Billing.
- Upgrade to a plan that carries
apiAccess— Advanced or Business are the ones you can buy directly. - Retry the request — propagation is immediate after the upgrade webhook lands (within a few seconds in normal operation).
past_due)
keeps its plan and API access until Stripe cancels it. If the workspace is on
a plan that carries API access and you still see this code, the record has
not caught up with the upgrade yet; wait a few seconds and retry, and contact
support if it persists.