makeplane / makeplane/plane

Bug: Self-hosted Plane v1.3.1 Pages API differs from documented /api/v1 contract

Open
#9,484 0 comments 0 reactions 0 assignees View on GitHub

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/plane release 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.py includes plane.app.urls under /api/.
  • apps/api/plane/urls.py includes plane.api.urls under /api/v1/.
  • apps/api/plane/app/urls/page.py registers project Pages under the legacy /api/ route.
  • The documented /api/v1 Pages 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

  1. Should Pages be registered under plane.api.urls and exposed at /api/v1 for self-hosted deployments?
  2. Should the legacy /api Pages route accept API-key authentication, or should it be considered internal/browser-only?
  3. Is the self-hosted v1.3.1 image expected to match the current API documentation?
  4. Is there a required release/image tag or configuration variable that enables the documented Pages API?
  5. 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

Checklist

  • Reproduced on self-hosted Plane
  • Tested documented /api/v1 endpoint
  • 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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.