mattermost-community/focalboard · error

patch updates cards that are limited

Error message

patch updates cards that are limited

What it means

ErrPatchUpdatesLimitedCards is returned when a card patch (partial update) would modify cards that are restricted under the current license tier. Like the views limit, this is a licensing guard: unlicensed installs only allow limited card operations, and a patch touching those protected fields/cards is rejected wholesale.

Source

Thrown at server/model/error.go:17

package model

import (
	"database/sql"
	"errors"
	"fmt"
	"net/http"
	"strings"

	mmModel "github.com/mattermost/mattermost/server/public/model"

	pluginapi "github.com/mattermost/mattermost/server/public/pluginapi"
)

var (
	ErrViewsLimitReached        = errors.New("views limit reached for board")
	ErrPatchUpdatesLimitedCards = errors.New("patch updates cards that are limited")

	ErrInsufficientLicense = errors.New("appropriate license required")

	ErrCategoryPermissionDenied = errors.New("category doesn't belong to user")
	ErrCategoryDeleted          = errors.New("category is deleted")

	ErrBoardMemberIsLastAdmin = errors.New("cannot leave a board with no admins")

	ErrRequestEntityTooLarge = errors.New("request entity too large")

	ErrInvalidBoardSearchField = errors.New("invalid board search field")
)

// ErrNotFound is an error type that can be returned by store APIs
// when a query unexpectedly fetches no records.
type ErrNotFound struct {
	entity string
}

View on GitHub (pinned to a84bbb65e3)

Solutions

  1. Obtain a license covering full Boards card functionality
  2. Limit the patch to fields not restricted by the license
  3. Move the card without patching restricted properties, or restructure the workflow
Defensive patterns

Strategy: type-guard

Validate before calling

if !hasValidLicense() && patchTouchesLimitedCards(patch) {
    // reject or trim the patch client-side before sending
}

Type guard

func isLimitedCardsErr(err error) bool {
    return errors.Is(err, model.ErrPatchUpdatesLimitedCards)
}

Try / catch

err := app.PatchBlock(boardID, blockID, patch)
if errors.Is(err, model.ErrPatchUpdatesLimitedCards) {
    // fall back to a limited patch or notify the user
}

Prevention

When it happens

Trigger: Sending PATCH /api/v1/boards/{boardID}/blocks/{blockID} (or MoveContentBlock) against a card that is limited on an unlicensed install; calling MoveContentBlock whose destination patch updates limited cards.

Common situations: Free-tier installs after the cards feature became partially paid; API scripts that bulk-patch card properties; drag-and-drop moves in the UI that internally patch cards.

Related errors


AI-assisted analysis of mattermost-community/focalboard@a84bbb65e3 (2026-08-30). Data as JSON: /api/errors/612c525466037870. Report an issue: GitHub.