Skip to content

Error Codes

Beyond standard HTTP status codes, several RealityConnect API operations return a machine-readable error code in the response body to disambiguate why a request was rejected. This page catalogs every named code by endpoint, what triggers it, and how to handle it.


Operations that return a named code use this shape, with extra context-specific fields noted per endpoint below:

{
"statusCode": 409,
"error": "NodeHasDerivatives",
"message": "..."
}

message is optional and, where present, gives a human-readable detail. Branch your handling on error, not on message.

PATCH /v1/nodes/{nodeId}/move/{newParentId} — 409 Conflict

CodeMeaningSuggested action
AccessRightsChangeRequiredThe move would change who can access the node; message explains the specific changeReview the access change, or retry with force: true if it is acceptable
MaxDepthExceededThe move would exceed the maximum allowed hierarchy depthMove the node to a shallower location
CircularityFoundThe target parent is inside the subtree of the node being movedChoose a parent outside the node’s own subtree
NodeHaveMembershipsAttachedThe node has membership records that block moving it across a permission boundaryRemove the memberships first, or move within the same permission scope
NodesInDifferentRegionsThe node and the target parent are provisioned in different regionsNot resolvable — nodes cannot move across regions
NodeCannotBeMovedThis node type does not support being movedNot resolvable for this node type
DerivativesNotInCommonParentThe node’s derivative outputs are not all under a common parent with the move targetReorganize the derivatives, then retry
SourcesNotInCommonParentThe node’s source inputs are not all under a common parentReorganize the sources, then retry
DataBundleLinkedToTwinThe node’s data bundle is linked to a twinUnlink the twin first
DoesNotMeetHierarchyConstraintsThe move violates a type-specific hierarchy ruleCheck which child types the target parent allows
MoveNodeFailedThe move was rejected for a reason with no more specific codeRetry; contact support if it persists

DELETE /v1/nodes/{nodeId} — 409 Conflict

CodeMeaningSuggested action
NodeHasDerivativesThe node has derivative outputs that must be removed first, listed in derivatives[]Delete or move the listed derivatives, then retry
NodeNotInDeletableStateThe node is currently processing or failed processing, per isProcessing / isFailedWait for processing to finish, or resolve the failure, then retry
NodeHasBundleDependantsThe node’s data bundle has dependants that block deletionRemove the dependants first
DeleteNodeFailedThe delete was rejected for a reason with no more specific codeRetry; contact support if it persists

Restore or permanently delete a trashed node

Section titled “Restore or permanently delete a trashed node”
EndpointStatusCodeMeaningSuggested action
PATCH /v1/nodes/{id}/restore409StorageLimitExceededRestoring the node would exceed the organization’s storage quotaFree up storage or increase the quota, then retry
DELETE /v1/nodes/{id}/hard409NoNodeRemovedThe node was not found in the trash in a removable stateVerify the node id and its trash state

POST /v1/bundles/{bundleId}/processing — 409 Conflict

CodeMeaningSuggested action
ProcessingCostMismatchThe submitted processing cost no longer matches the current costFetch a fresh cost estimate and retry
NoInputDataFoundForProcessingNo input data was found for this bundle to processVerify the upload session finalized before triggering processing
InsufficientProcessingCapacityProcessing capacity is not currently availableRetry later
FailedToLaunchProcessingThe processing job could not be launchedRetry; contact support if it persists
EndpointStatusCodeMeaningSuggested action
POST /v1/site-files403StorageLimitExceededThe organization’s storage quota is exceededFree up storage or increase the quota
POST /v1/site-files409FileAlreadyExistsA file with the same identity already existsUse the existing file, or upload under a different name
POST /v1/site-files/{fileId}/finalize400FileNotCompatibleThe uploaded file’s format is not compatible with the expected file typeVerify the file format and re-upload
POST /v1/bundles/{bundleId}/upload-sessions403StorageLimitExceededThe organization’s storage quota is exceededFree up storage or increase the quota
POST /v1/bundles/{bundleId}/upload-sessions/{sessionId}/files403StorageLimitExceededThe organization’s storage quota is exceededFree up storage or increase the quota
POST /v1/twin/{contextId}/object/attachments409StorageLimitExceededThe organization’s storage quota is exceededFree up storage or increase the quota
POST /v1/twin/{contextId}/object/attachments409FileAlreadyExistsAn attachment with the same identity already existsUse the existing attachment, or upload under a different name

PUT /v1/groups/{groupId}/users/{userId} (add a member) — 409 Conflict

CodeMeaningSuggested action
GroupHasSamlLinkThe group’s membership is managed by a SAML/SSO integrationManage membership through the SAML provider
CannotInviteToSCIMGroupThe group’s membership is managed by SCIM provisioningManage membership through the SCIM provider
UserAlreadyMemberThe user is already a member of the groupNo action needed

DELETE /v1/groups/{groupId}/users/{userId} (remove a member) — 409 Conflict

CodeMeaningSuggested action
GroupHasSamlLinkThe group’s membership is managed by a SAML/SSO integrationManage membership through the SAML provider
CannotRemoveMemberFromSCIMGroupThe group’s membership is managed by SCIM provisioningManage membership through the SCIM provider

POST /v1/groups and PATCH /v1/groups/{groupId} — 409 Conflict

CodeMeaningSuggested action
DuplicateGroupNameA group with this name already exists in the organizationChoose a different name
CannotUpdateMemberFromSCIMGroupThe group’s membership is managed by SCIM provisioningManage membership through the SCIM provider

DELETE /v1/groups/{groupId} — 409 Conflict

CodeMeaningSuggested action
CannotRemoveSCIMGroupThe group’s membership is managed by SCIM provisioningManage membership through the SCIM provider
CannotRemoveOrganizationGroupThe group has no single owning divisionNot resolvable — this group cannot be deleted through this endpoint

POST /v1/nodes/{nodeId}/invitations and POST /v1/invitations share the same error codes.

StatusCodeMeaningSuggested action
409UserAlreadyInvitedThe user already has a pending invitationNo action needed
409UserAlreadyMemberThe user is already a memberNo action needed
403InvalidEmailDomainThe invited email’s domain is not allowed for this organizationUse an email address on an allowed domain
400CustomRoleNotAssignableToDataNodeThe specified custom role cannot be assigned at this nodeChoose a role assignable at this node
400CustomRoleNotFoundThe specified custom role does not existVerify the role id
400AdminsitrativeRoleNotFound*The specified administrative role does not existVerify the role id
400AdministrativeRoleInvalidNodeAn administrative role was targeted at a node that does not support itAssign the administrative role at the organization level instead
422InvitationEmailRejectedThe mail provider permanently rejected the recipient addressCorrect the email address before retrying
503InvitationEmailNotSentThe mail provider is temporarily unavailable; nothing was persistedRetry the request as-is

* This code name carries a typo in the API’s current response — match it exactly as shown, not AdministrativeRoleNotFound.

Rate limiting, authentication, and access control

Section titled “Rate limiting, authentication, and access control”

A 403 can come from any of the three access-control layers described in Getting Started — Security Model: OAuth scopes, per-node roles, and content access. All three currently share the same status code, and most of them share the same generic body, so treat a 403 as “not authorized for one of these reasons” rather than assuming it is always a scope problem.

StatusCodeMeaning
429rate_limitedThe organization’s request bucket is exhausted — see Rate Limits
401not_authenticatedThe request is missing a bearer token, or the token could not be parsed
401invalid_tokenThe token’s signature or expiry check failed
403(no code — message: "Insufficient OAuth scopes")The token does not carry a scope the operation requires — see OAuth Scopes
403(no code — message: "Forbidden resource")The caller’s role or content access on this node does not permit the action, or the organization has hit a licensing/seat limit — the body does not distinguish which
403errorCode: "SSORestrictedResource"This resource is restricted to callers authenticated through a specific SSO/identity-provider session
  • See the API reference for full request and response schemas per operation.