Bug: Self-hosted Plane v1.3.1 Pages API differs from documented /api/v1 contract
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 59.6k
- Forks
- 5.8k
- Avg merge
- 1d 22h
- Merged PRs (30d)
- 49
Description
Bug: Self-hosted Plane v1.3.1 Pages API differs from documented /api/v1 contract
Summary
The current Plane API documentation describes project Pages at:
POST /api/v1/workspaces/{workspace_slug}/projects/{project_id}/pages/
and documents API-key authentication via X-API-Key. On a self-hosted Plane v1.3.1 deployment, this documented endpoint returns HTTP 404. The legacy route without /v1 exists, but the same API key is rejected with HTTP 401.
This prevents API/MCP clients from using list_pages and create_page against the self-hosted instance, despite the endpoint being present in the official API reference.
Environment
- Plane self-hosted release:
v1.3.1 - Image source: official
makeplane/planerelease images - OS: Linux x86_64
- Client: REST/MCP client using Plane API key
- Authentication:
X-API-Key - Workspace slug:
hermes
No credentials are included.
Reproduction
Given a valid project UUID and valid API key:
curl -X POST \
"https://<self-hosted-plane>/api/v1/workspaces/hermes/projects/<project_id>/pages/" \
-H "X-API-Key: <redacted>" \
-H "Content-Type: application/json" \
-d '{
"name": "API test page",
"description_html": "<p>Test page</p>"
}'
Observed result:
{"error": "Page not found."}
HTTP status:
404
The same behavior occurs for the corresponding GET/list endpoint.
Route comparison
On the affected self-hosted instance:
| Request | Result |
|---|---|
/api/v1/users/me/ with API key |
200 |
/api/v1/workspaces/hermes/projects/ with API key |
200 |
/api/v1/workspaces/hermes/projects/<id>/pages/ with API key |
404 |
/api/workspaces/hermes/projects/<id>/pages/ without auth |
401 |
/api/workspaces/hermes/projects/<id>/pages/ with API key |
401 |
Source inspection
In the v1.3.1 source:
apps/api/plane/urls.pyincludesplane.app.urlsunder/api/.apps/api/plane/urls.pyincludesplane.api.urlsunder/api/v1/.apps/api/plane/app/urls/page.pyregisters project Pages under the legacy/api/route.- The documented
/api/v1Pages route is not present in the observed self-hosted backend routing.
Relevant paths:
apps/api/plane/urls.py
apps/api/plane/app/urls/page.py
apps/api/plane/app/permissions/page.py
apps/api/plane/app/views/page/base.py
Expected behavior
The documented endpoint should work on self-hosted Plane with the documented API-key authentication:
POST /api/v1/workspaces/{workspace_slug}/projects/{project_id}/pages/
X-API-Key: <key>
Actual behavior
/api/v1/.../pages/returns 404.- Legacy
/api/.../pages/returns 401 for API-key clients. - API/MCP clients cannot create or list Pages on this self-hosted release.
Related observation
The same self-hosted release also does not expose the newer project endpoint used by current clients:
/api/v1/workspaces/{workspace_slug}/projects-lite/
The regular /projects/ endpoint works. This may indicate a broader mismatch between the published self-hosted API image and the current API documentation/client SDK.
Questions
- Should Pages be registered under
plane.api.urlsand exposed at/api/v1for self-hosted deployments? - Should the legacy
/apiPages route accept API-key authentication, or should it be considered internal/browser-only? - Is the self-hosted
v1.3.1image expected to match the current API documentation? - Is there a required release/image tag or configuration variable that enables the documented Pages API?
- Should
/projects-lite/also be available in the self-hosted API?
Suggested resolution
Align the self-hosted backend routes and authentication with the official API reference, or update the self-hosting/API documentation to clearly state the version and authentication limitations.
Links
- API reference: https://developers.plane.so/api-reference/page/add-project-page
- Self-hosting documentation: https://developers.plane.so/self-hosting/overview
- Plane repository: https://github.com/makeplane/plane
- Plane MCP repository: https://github.com/makeplane/plane-mcp-server
Checklist
- Reproduced on self-hosted Plane
- Tested documented
/api/v1endpoint - Tested API-key authentication
- Compared source routing paths
- Confirmed behavior on Plane Cloud
- Attached sanitized server logs if requested
- Tested a newer self-hosted release when available
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reproducing the documented curl requests against Plane v1.3.1, then inspect apps/api/plane/urls.py and the routing, permissions, and view files under apps/api/plane/app/. Compare the legacy and /api/v1 paths and API-key handling, and check whether project Pages and projects-lite are present in the release. Done means the documented self-hosted behavior is either made consistent and verified or its version and authentication limits are clearly documented.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- django, python
- Domain
- api, authentication, backend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Needs clarification
- Newbie friendliness
- 45/100