Microsoft Entra ID Governance
Governance

Microsoft Entra resource policy service limits (preview)

In brief

A new page lists limits for policy definitions, assignments, Rego content, evaluations, Microsoft Graph reads, and API requests, along with permitted Rego built-ins.

What Entra admins need to know

Administrators can use these limits to plan policies and avoid validation or request errors when capacity, size, or rate limits are exceeded.

This editorial summary was generated by AI from the documentation changes. Verify important details in the full Microsoft Learn article.

Documentation change

The comparison below shows only the changed extract. Use the full-page view for complete context.

new file mode 100644

title: Microsoft Entra resource policy service limits (preview) description: Review limits for resource policy definitions, assignments, Rego built-ins, request evaluation, additional reads, version history, and API requests. ms.topic: reference ms.date: 11/11/2026 ai-usage: ai-generated # Customer intent: As a policy administrator, I want to understand service limits so that I can plan policy assignments and keep evaluation within supported capacity.

Microsoft Entra resource policy service limits (preview)

Resource policy limits apply to policy objects, policy content, request evaluation, and API request rates. Keep your policies and additional Microsoft Graph reads within the limits below.

Definitions, assignments, and content

ScopeLimitValueDetails
Resource typeCustom definition versions25.Includes current and previous versions. Built-in definitions don't count. Creating or restoring a version that would exceed the limit returns HTTP 400.
TenantCustom definition versions1,000.Soft-deleted versions don't count, but restoring them checks the quotas again. The definition collection's $count counts definitions, not individual versions. Exceeding the limit returns HTTP 400.
Resource typePolicy assignments25.Includes assignments to built-in and custom policies, even when disabled. Exceeding the limit returns HTTP 400.
TenantPolicy assignments1,000.Includes disabled assignments and assignments to built-in policies. Soft-deleted assignments don't count, but restoring them checks the quotas again. Exceeding the limit returns HTTP 400.
Definition versionLive assignments per tenant1.Disabling an assignment doesn't allow a second assignment. Update the existing assignment to change its settings.
Policy definitionTop-level Rego entries50.Includes metadata and helper rule results. Policy validation returns HTTP 400 if exceeded.
Policy definitionRego source size in UTF-81 MiB (1,048,576 bytes).Oversized source returns HTTP 413. For line-formatting requirements, see Format policy source.
Policy assignmentSerialized parameter values40 KiB (40,960 bytes).Measured as compact UTF-8 JSON. Both submitted values and values after merging and applying defaults must fit. Exceeding the limit returns HTTP 413.
Policy assignmentSerialized assignment size50 KiB (51,200 bytes).Measured as compact UTF-8 JSON. Applies to the complete assignment after an update, not just changed properties. Exceeding the limit returns HTTP 413.
Policy assignment evaluationDistinct additional Microsoft Graph read paths2.Covers both applicable and deny evaluations for one request. A different resource ID or query string counts as another path. See Additional read limits.
Policy assignment evaluationfetchAsPolicy() invocations, including repeated paths5.Every call counts, even when it reads the same path again. The count resets for each incoming request.
Request evaluationDistinct additional-read paths across assignments10.Shared across all assignments for one request. Reading the same path in multiple assignments counts once toward this limit.
Additional Microsoft Graph readrelativePathUri length2,048 characters.Includes the API version, resource path, and query string.
Additional Microsoft Graph readResponse size100 KiB (102,400 bytes), by default.Includes both code and data for live and simulated reads. Use $select to request only the properties your policy needs.

Disabled Rego built-in functions

Resource policy restricts the supported native Rego built-in functions. Only the functions listed here are permitted; all other native built-ins are disabled. For example, time.now_ns isn't permitted, including in metadata or helper rules.

CategoryPermitted native built-ins
Aggregatescount, max, min, sort, sum
Arraysarray.concat, array.reverse, array.slice
Setsintersection, union
Numbersabs, ceil, floor, round, to_number
Type checksis_array, is_boolean, is_null, is_number, is_object, is_set, is_string
Bitwise operationsbits.and, bits.lsh, bits.negate, bits.or, bits.rsh, bits.xor
Stringsconcat, contains, endswith, indexof, lower, replace, split, sprintf, startswith, strings.reverse, substring, trim, trim_left, trim_prefix, trim_right, trim_space, trim_suffix, upper
Objectsobject.filter, object.get, object.keys, object.remove, object.union
URL encoding and UUID parsingurlquery.encode, urlquery.decode, uuid.parse

Use the exact names and casing shown.

Calls to disallowed native built-ins cause policy validation or loading errors, not a policy-compliance result. Replace those calls with permitted functions and test the policy before assigning it.

Service-provided functions such as fetchAsPolicy() aren't native Rego built-ins. Their separate restrictions are described in Additional read limits.

Additional read limits

Each assignment can read two distinct relativePathUri values per incoming request, across its applicable and deny rules. A different API version, resource ID, or query string, including $select, counts as another path.

For example, reading /v1.0/applications/<id>?$select=displayName twice uses one distinct path but two invocations. Adding a read of another application uses the second path. A third distinct path causes that assignment's evaluation to fail. The limit counts requested URIs, not the number of objects returned by a collection read.

Across assignments, the same path counts once toward the request-wide limit of 10 paths. Each assignment still counts every invocation, including repeated paths, toward its five-call limit.

For an example that processes a read response, see Read additional Microsoft Graph data.

Version history and deleted items

A custom definition can have up to 10 previous versions, in addition to its current version. An update that would exceed this limit returns HTTP 400. Delete an unused previous version before publishing another update when the history limit is reached.

Soft-deleted definitions and assignments are retained for 30 days.

Individual previous-version deletion is permanent and doesn't use the soft-delete retention period.

For dependency handling, see Update and retire resource policies.

API request throttling

These limits apply to management and explicit evaluation requests under /admin/resourcePolicy, separately for each app and tenant combination.

Request typePreview limit per app per tenantEquivalent sustained request rate
Write policy definitions and assignments, or update configuration40 requests per 20 seconds2 requests per second
Read policy definitions, assignments, and configuration60 requests per 20 seconds3 requests per second
evaluatePolicy100 requests per 20 seconds5 requests per second
evaluateAssignedPolicies60 requests per 20 seconds3 requests per second

Automatic policy evaluation on ordinary Microsoft Graph write requests doesn't count toward these limits.

Throttled requests return HTTP 429. Wait for the interval in the Retry-After header before retrying. For more information, see Microsoft Graph throttling guidance.

Evaluation limits

ScopeLimitValue
Request being evaluatedReal or simulated request body size2 MiB (2,097,152 bytes), by default.
evaluatePolicySimulated additional-read responses2.
evaluatePolicyCombined serialized data values in simulated responses2 MiB (2,097,152 bytes).

Keep request bodies within the size limit so your policies can evaluate them. For explicit evaluation actions, this limit applies to resourceBody, not the complete action payload.

If the body is too large, policy evaluation is skipped and enforced policies can still block the request. An explicit evaluation can still return HTTP 200, so check the response message, isBlocked, and policy error details.

Invalid simulated-response counts or oversized combined data values return HTTP 400. Correct the supplied responses and try again. Each simulated response must also fit within the additional-read response limit.

Use evaluation audit logs to investigate errors on real requests.

Related content

Daily Entra.News

Get daily email updates

Get a concise summary of the latest Microsoft Entra updates delivered straight to your inbox.

Loading the secure signup form…