The application layer, not Qdrant, enforces tenant isolation in a shared collection
This is the most important misconception in Qdrant multitenancy. When multiple tenants share a collection and are separated by a payload field (typically tenant_id), Qdrant does not automatically know which tenant a request belongs to and does not automatically add a tenant filter. Qdrant enforces the filters it is given - if you send a query with a tenant_id filter, it will faithfully apply that filter. But it will not add the filter for you. The responsibility for attaching the correct tenant_id filter on every operation lies entirely with the application layer. If the application fails to add the filter, Qdrant will happily return data from all tenants. This is a design decision, not a bug: Qdrant is a database, and the database's job is to execute the queries it receives, not to infer the caller's identity and scope. The application is the only layer that knows which tenant is making the request, because the tenant identity comes from the authentication and authorization context that the application manages.
The practical consequence is that tenant isolation in a shared collection is a correctness requirement on the application code, not a database feature. Every read, every write, every delete, and every scroll must include the tenant filter. If even one operation path forgets it, that path becomes a data leak. This is why the official Qdrant guidance treats payload filtering as the default multitenancy strategy for up to roughly 10,000 tenants, but also warns that strict isolation requirements may require separate collections[reference:28][reference:29]. The risk is not hypothetical: a single missing filter in a batch retrieval endpoint, a scroll operation, or a delete-by-filter call can expose or destroy another tenant's data. The JWT RBAC payload filter, which might have seemed like a way to enforce tenant isolation at the database layer, was deprecated in 1.15 and removed in 1.16 precisely because it could not provide safe semantics for write operations[reference:30]. The database will not save you from a missing filter.
Qdrant enforces filters; it does not add them. If you do not send tenant_id, it returns all tenants' data.
The application layer is responsible for attaching tenant_id on every read, write, delete, scroll, and batch operation.
A single missing filter is a data leak or data destruction incident.
For strict isolation (compliance, legal), use separate collections per tenant with collection-scoped JWTs.
For shared collections, use a trusted service that injects the filter server-side so clients never talk to Qdrant directly.
Mark the tenant field with is_tenant: true to optimize the index and query planning for tenant-scoped access.
The JWT payload filter capability was removed in Qdrant 1.16; do not rely on it for tenant isolation.
The trade-off is between the operational simplicity of a shared collection and the isolation guarantees of separate collections. A shared collection with payload filtering is far more scalable - the official guidance explicitly says do not create one collection per tenant because it does not scale past a few hundred and wastes resources[reference:31]. But the isolation it provides is logical, not physical, and it depends entirely on the application's correctness. The common mistake is assuming Qdrant enforces tenant isolation automatically. It does not. The second mistake is putting the Qdrant instance behind a shared API key and letting clients connect directly, which means every client is responsible for adding the correct filter and any client bug becomes a cross-tenant leak. The safe pattern for shared collections is to put a trusted service between the clients and Qdrant; the service authenticates the caller, determines the tenant, injects the tenant_id filter on every operation, and is the only component with a Qdrant key[reference:32]. The third mistake is using the deprecated JWT payload filter in a new deployment - it was removed in 1.16 and a legacy example will not enforce the intended restriction. Version note: the is_tenant flag and the JWT RBAC boundary have both changed across releases; the payload filter removal in 1.16 is the most important recent change for multitenancy architecture.
Version-dependent: the multitenancy patterns and the JWT RBAC boundary have evolved across releases. The payload filter capability in JWT RBAC was deprecated in 1.15 and removed in 1.16, which means the database-level enforcement of tenant isolation within a shared collection is no longer available. The is_tenant index flag and the tiered multitenancy features (custom sharding per tenant) were added in recent releases. For current versions, the only safe patterns for strict tenant isolation are separate collections per tenant (with collection-scoped JWTs) or a trusted filter-injecting service. Do not rely on a deprecated JWT payload filter in a new deployment.
You query a shared multitenant collection without a tenant filter. Explain what happens and why this is a risk.
A teammate says Qdrant enforces tenant isolation automatically. Explain what actually enforces it.
You discover that a batch retrieval endpoint in your application omits the tenant filter. Describe the incident response and the fix.
Your application has 20 different query paths, and you need to ensure all of them include the tenant filter. Describe a strategy to enforce this systematically.
Design an architecture where clients never talk to Qdrant directly and tenant isolation is enforced by a trusted service. Specify the service's responsibilities and how it prevents cross-tenant access.
You must support both shared collections for small tenants and dedicated collections for large tenants. Describe how tenant isolation is enforced in each case and how you route requests.
A compliance auditor asks you to prove that no tenant can access another tenant's data. Describe the evidence you would provide and the testing you would run to validate it.
You are designing a multitenant search platform with a mix of shared and dedicated collections. Describe the architecture, the isolation guarantees at each layer, and the failure modes that could break isolation.