RocketChat/Rocket.Chat · error · Error
error-action-not-allowed
error-action-not-allowed
Error message
error-action-not-allowed
What it means
ensureSingleContactLicense guards the single-contact / contact-identification omnichannel features: when the workspace license lacks the enterprise 'contact-id-verification' module it throws Error('error-action-not-allowed'). Callers of contact registration/merge/block flows hit this before any database work happens.
Solutions
- Activate an enterprise license that includes contact-id-verification
- Feature-flag contact-identification calls in your integration until the license is present
- On unlicensed workspaces, use plain visitor APIs instead of contact-identification ones
Defensive patterns
Strategy: validation
Validate before calling
import { License } from '@rocket.chat/license';
if (!License.hasModule('contact-id-verification')) {
throw new Error('contact identification features need the contact-id-verification module');
}
ensureSingleContactLicense(); // proceeds safely Try / catch
try {
ensureSingleContactLicense();
} catch (error) {
if (error instanceof Error && error.message === 'error-action-not-allowed') {
// license guard throws before any work: fail fast with a licensing message
throw new LicenseRequiredError('contact-id-verification');
}
throw error;
} Prevention
- Feature-flag contact-identification flows on the license state
- Note this throws a plain Error with the error-action-not-allowed message, not a Meteor.Error
- Keep a CE-safe fallback path using plain visitor APIs
When it happens
Trigger: Calling omnichannel contact endpoints that route through ensureSingleContactLicense on Community edition or a license without the contact-id-verification module.
Common situations: Dev instances without EE license; license expired or downgraded; testing contact-center flows on a Community deployment.
Related errors
- error-action-not-allowed
- error-mac-limit-reached
- isAgentAvailableToTakeContactInquiryResult.error
- error-action-not-allowed
- error-ai-not-enabled
AI-assisted analysis of RocketChat/Rocket.Chat@b2c16d5842 (2026-08-18).
Data as JSON: /api/errors/e0321e77779ab83d.
Report an issue: GitHub.
Appendix: source
Thrown at apps/meteor/ee/server/api/v1/omnichannel/lib/contacts.ts:18
import type { IUser, ILivechatContactVisitorAssociation } from '@rocket.chat/core-typings';
import { License } from '@rocket.chat/license';
import { LivechatContacts, LivechatRooms, LivechatVisitors } from '@rocket.chat/models';
import { i18n } from '../../../../../../server/lib/i18n';
import { closeRoom } from '../../../../../../server/lib/omnichannel/closeRoom';
export async function changeContactBlockStatus({ block, visitor }: { visitor: ILivechatContactVisitorAssociation; block: boolean }) {
const result = await LivechatContacts.setChannelBlockStatus(visitor, block);
if (!result.modifiedCount) {
throw new Error('error-contact-not-found');
}
}
export function ensureSingleContactLicense() {
if (!License.hasModule('contact-id-verification')) {
throw new Error('error-action-not-allowed');
}
}
export async function closeBlockedRoom(association: ILivechatContactVisitorAssociation, user: IUser) {
const visitor = await LivechatVisitors.findOneById(association.visitorId);
if (!visitor) {
throw new Error('error-visitor-not-found');
}
const room = await LivechatRooms.findOneOpenByContactChannelVisitor(association);
if (!room) {
return;
}
return closeRoom({ room, visitor, comment: i18n.t('close-blocked-room-comment'), user });
}View on GitHub (pinned to b2c16d5842)