> For the complete documentation index, see [llms.txt](https://developers.memberspace.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://developers.memberspace.com/admin-api/endpoints/plans.md).

# Plans

Your site's plans.

## List plans

> Returns the API key's site active (non-archived) plans, ordered by id and paginated with an opaque cursor.

```json
{"openapi":"3.2.0","info":{"title":"MemberSpace Admin API","version":"1.0.0"},"tags":[{"name":"plans","description":"Your site's plans."}],"servers":[{"url":"https://api.memberspace.com/admin/v1","description":"Production"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"Opaque Admin API key, prefixed with `ms_admin_`. Pass it as `Authorization: Bearer ms_admin_...`."}},"parameters":{"cursor-header":{"name":"X-Cursor","in":"header","required":false,"schema":{"type":"string"},"description":"First item to return, usually equals the previous page response's `X-Next-Cursor` response header. Omit to fetch the first page. Cursors are opaque tokens — do not parse or construct them."},"itemsAfter-header":{"name":"X-Items-After","in":"header","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25},"description":"Maximum number of results to return beginning with the cursor, or if not sent the first item in the list (1–100, default 25)."}},"schemas":{"Plan":{"type":"object","description":"A membership plan.","allOf":[{"type":"object","required":["id","publicId","name","status","isPublic","colorCode","activeMemberCount","createdAt","updatedAt"],"properties":{"id":{"type":"integer","description":"Unique plan identifier."},"publicId":{"type":"string","description":"Unique public plan identifier."},"name":{"type":"string","description":"Plan name."},"description":{"type":"string","description":"Rich text shown during signup."},"status":{"type":"string","enum":["enabled","disabled","archived","deleted"],"description":"Plan lifecycle state. Archived plans are hidden from the dashboard but retain their memberships; deleted plans are read-only."},"isPublic":{"type":"boolean","description":"Whether the plan is publicly listed."},"activeMemberCount":{"type":"integer","description":"Number of active members on the plan."},"colorCode":{"type":"string","description":"Hex color code, auto-assigned when the plan is created."},"contentUrl":{"type":"string","description":"Redirect target for content after login."},"welcomeUrl":{"type":"string","description":"Redirect target for the welcome screen after signup."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},{"oneOf":[{"title":"Free","type":"object","required":["type","expiration"],"properties":{"type":{"type":"string","enum":["free"]},"expiration":{"$ref":"#/components/schemas/PlanExpiration"}}},{"title":"One time payment","type":"object","required":["type","billingDetails","expiration"],"properties":{"type":{"type":"string","enum":["oneTimePayment"]},"billingDetails":{"type":"object","required":["price","currency"],"properties":{"price":{"type":"number","description":"Price in the plan currency."},"currency":{"type":"string","description":"3 letter [ISO currency code](https://en.wikipedia.org/wiki/ISO_4217)."},"taxPercentage":{"type":"number"},"taxDescription":{"type":"string","description":"Rich text shown during signup. Present only with taxPercentage."}}},"expiration":{"$ref":"#/components/schemas/PlanExpiration"}}},{"title":"Multi-payment","type":"object","required":["type","billingDetails","expiration"],"properties":{"type":{"type":"string","enum":["multiPayment"]},"billingDetails":{"type":"object","required":["price","currency","interval","paymentCountRequired"],"properties":{"price":{"type":"number"},"currency":{"type":"string","description":"3 letter [ISO currency code](https://en.wikipedia.org/wiki/ISO_4217)."},"interval":{"type":"object","description":"How often the member is billed.","required":["count","unit"],"properties":{"count":{"type":"integer","description":"The number part of the interval. I.e. `3 month`."},"unit":{"type":"string","enum":["day","week","month","year"]}}},"paymentCountRequired":{"type":"integer","description":"Total number of payments before the plan is paid off."},"trialPeriodDays":{"type":"integer","description":"Length of the free trial in days. Mutually exclusive with signupFee."},"signupFee":{"type":"number","description":"One-time fee charged at signup. Mutually exclusive with trialPeriodDays."},"taxPercentage":{"type":"number"},"taxDescription":{"type":"string","description":"Rich text shown during signup. Present only with taxPercentage."}}},"expiration":{"$ref":"#/components/schemas/PlanExpiration"}}},{"title":"Subscription","type":"object","required":["type","billingDetails"],"properties":{"type":{"type":"string","enum":["subscription"]},"billingDetails":{"type":"object","required":["price","currency","interval"],"properties":{"price":{"type":"number"},"currency":{"type":"string","description":"3 letter [ISO currency code](https://en.wikipedia.org/wiki/ISO_4217)."},"interval":{"type":"object","description":"How often the member is billed.","required":["count","unit"],"properties":{"count":{"type":"integer","description":"The number part of the interval. I.e. `3 month`."},"unit":{"type":"string","enum":["day","week","month","year"]}}},"billingDate":{"type":"object","required":["day"],"description":"Fixed billing date, when set. `day` for monthly, `day` + `month` for yearly.","properties":{"day":{"type":"integer","description":"1–31."},"month":{"type":"integer","description":"1–12."}}},"trialPeriodDays":{"type":"integer","description":"Length of the free trial in days. Mutually exclusive with signupFee."},"signupFee":{"type":"number","description":"One-time fee charged at signup. Mutually exclusive with trialPeriodDays."},"taxPercentage":{"type":"number"},"taxDescription":{"type":"string","description":"Rich text shown during signup. Present only with taxPercentage."}}}}}]}]},"PlanExpiration":{"description":"When a member's access from this plan expires.","oneOf":[{"title":"Never expires","type":"object","required":["mode"],"properties":{"mode":{"type":"string","enum":["none"]}}},{"title":"After time period","type":"object","required":["mode","count","unit"],"properties":{"mode":{"type":"string","enum":["interval"]},"count":{"type":"integer"},"unit":{"type":"string","enum":["day","week","month","year"]}}},{"title":"At specific datetime","type":"object","required":["mode","expiresAt"],"properties":{"mode":{"type":"string","enum":["specificTime"]},"expiresAt":{"type":"string","format":"date-time"}}}]},"ApiError":{"type":"object","description":"Error response.","required":["errors"],"properties":{"errors":{"type":"array","description":"The errors that occurred.","items":{"type":"object","required":["path","code","message"],"properties":{"path":{"type":"string","description":"`base` for errors not tied to a specific field; otherwise the dotted path of the offending field (e.g. `community.isEnabled`)."},"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable error message."}}}}}}},"headers":{"hasMoreItemsAfter":{"description":"Whether there are more results after the last item in this page.","schema":{"type":"boolean"}},"nextCursor":{"description":"Opaque cursor for the next page. Omitted when X-Has-More-Items-After is false.","schema":{"type":"string"}}},"responses":{"400-InvalidRequest":{"description":"Invalid request (e.g. a malformed cursor).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401-AccessDenied":{"description":"The API key is missing, unknown, revoked, or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403-NotPermitted":{"description":"The request is not permitted for this API key. For example, the site's plan no longer includes Admin API access because the owner canceled or downgraded — the key itself is still valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404-NotFound":{"description":"The resource doesn't exist, or the API key lacks the scope to access it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429-RateLimited":{"description":"Rate limit exceeded. Wait the number of seconds in the Retry-After header before retrying.","headers":{"Retry-After":{"description":"Number of seconds to wait before making another request.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"paths":{"/plans":{"get":{"tags":["plans"],"summary":"List plans","description":"Returns the API key's site active (non-archived) plans, ordered by id and paginated with an opaque cursor.","parameters":[{"$ref":"#/components/parameters/cursor-header"},{"$ref":"#/components/parameters/itemsAfter-header"}],"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Plan"}}}},"headers":{"X-Has-More-Items-After":{"$ref":"#/components/headers/hasMoreItemsAfter"},"X-Next-Cursor":{"$ref":"#/components/headers/nextCursor"}}},"400":{"$ref":"#/components/responses/400-InvalidRequest"},"401":{"$ref":"#/components/responses/401-AccessDenied"},"403":{"$ref":"#/components/responses/403-NotPermitted"},"404":{"$ref":"#/components/responses/404-NotFound"},"429":{"$ref":"#/components/responses/429-RateLimited"}}}}}}
```
