Agent infrastructure
API strategy
Multi-tenant SaaS architecture in the agent era: how silo vs pool tenancy holds under agent load, where tenant context APIs break, and what isolation now means.

Multi-tenant SaaS architecture is one of those foundations most engineering teams stopped thinking about years ago. The tenancy model got picked early, the isolation boundaries got drawn, and the system settled. Then agents showed up — calling tools on behalf of specific users, inside specific tenants, at volumes and access patterns nobody designed for — and the assumptions started to crack.
Here's the position: the classic silo vs pool debate still frames the problem correctly, but the tenant-context propagation model most SaaS platforms use was built for request-response traffic from a UI. Agents don't fit that shape. If your tenant boundary is enforced at the API gateway and trusted downstream, you have a problem you probably haven't noticed yet.
This deep-dive covers what multi-tenant SaaS architecture actually means today, how silo and pool tenancy behave under agent load, where tenant context propagation breaks, what tenant-aware observability now requires, and how to think about isolation as a runtime property rather than a schema decision.
Multi-tenant SaaS architecture is the practice of running a single logical application that serves multiple customer organisations from shared infrastructure. The interesting question was never whether to be multi-tenant — it was where the isolation boundary sits.
The two ends of the spectrum are well-known. Silo tenancy gives each tenant its own dedicated resources: separate databases, separate compute, sometimes separate deployments. Pool tenancy shares everything and enforces isolation logically through a tenant identifier attached to every row, every query, every log line. Most real platforms sit somewhere between — a pooled application tier with siloed data stores for enterprise tenants, or pooled everything with a bridge model for regulated customers.
The trade-offs haven't changed:
What has changed is the traffic. When the only client was your UI, tenant context came in on a session cookie, got resolved once at the edge, and propagated down as a header or a claim. Agents break that pattern in three ways: they call tools directly (no session), they call on behalf of a specific user inside a tenant (not the tenant as an abstract entity), and they can fan out — one agent turn produces ten tool calls in parallel across three subsystems. The tenancy model has to hold under all three.
The classic argument for pool tenancy was cost efficiency at scale. The classic argument for silo tenancy was enterprise buyers who want a compliance story and physical isolation. Both still hold. But agent traffic changes the weight on each side.
Pool tenancy under agent load has one specific failure mode: tenant identifier leaks in the LLM path. Agents generate tool call arguments. If any part of your API accepts a tenant ID as a parameter — even implicitly, even in a filter — you have created a path where a hallucinated or manipulated argument crosses the tenant boundary. Row-level security in the database is the answer, and it's the answer regardless of whether you thought you needed it before. The tenant boundary must be enforced at the layer that cannot be argued with: the connection string, the row policy, the query rewriter. Not the application code that trusts a header.
Silo tenancy under agent load looks safer, and mostly is — but it introduces its own problem. Agents that operate across multiple tenants (a customer support agent working across an internal team's accounts, an admin agent, a partner-side agent) now need to route to the right silo per call. That routing layer becomes a new single point of failure and a new place tenant context can get lost or spoofed. If you're going to run silo tenancy for agent workloads, the routing layer needs the same rigour you'd apply to an auth service.
The honest answer for most established SaaS platforms: the tenancy model you have is probably fine. What isn't fine is treating tenant context as a header that gets set once and trusted forever. That's the piece agents force you to redesign.
A tenant context API is the surface — headers, claims, path parameters, whatever — through which "which tenant is this call for" gets communicated between systems. In UI-driven SaaS this was solved and forgotten. The session identified the user, the user belonged to a tenant, the tenant ID rode along on every request, downstream services trusted it.
Agents break this model at three specific points:
Tool call boundaries are not session boundaries. An agent might hold context across a five-minute conversation with a user, invoke fifteen tools, and pause. Some tool calls fire in parallel. Some fire from a background worker after the user has closed the browser. The session model that carried tenant context in a cookie doesn't map to any of this.
Agents can act across tenants when their user can. Support engineers, resellers, and platform admins have always been able to cross tenant boundaries with the right permission. When they operated through a UI, that crossing was a deliberate act — pick the account, load the context. When an agent operates on their behalf, the crossing can happen inside a single reasoning turn. "Look at the recent tickets from Acme and compare them to Globex" is now one prompt, two tenant contexts, and no natural checkpoint for the human to confirm.
The identity that authenticated the agent is not the identity the tool call should execute as. This is the boundary security reviews demand. Every tool call needs to carry both — the agent's identity for audit and rate limiting, and the user's identity for permissions and tenant scope. Collapsing them into a service account defeats the entire point of multi-tenancy at the audit layer. We've written about why agent identity and user identity have to stay separate and it's the same principle here: the tenant context API needs both dimensions on every call.
The practical shape of a tenant context API that works for agents:
The standards work here is worth watching. OAuth 2.1's tightening on token audiences, the ongoing conversation around delegated access in the Model Context Protocol (MCP) spec from Anthropic, and the practical patterns being adopted by API gateways like Kong all point the same direction: tenant context is an authorisation concern, not a routing concern, and it belongs in the identity layer.
Most multi-tenant SaaS architecture writing treats isolation as something you decide at design time. Schema per tenant, row filter, RLS policy — pick one and you're done. That framing was always incomplete, and agents make the gaps obvious.
Tenant isolation is really the answer to three questions asked at runtime:
Agent traffic stresses all three. Data isolation is stressed by the LLM-in-the-loop argument-generation risk mentioned above. Resource isolation is stressed by the fan-out pattern — one agent turn can produce more concurrent load than a typical UI session. Observability isolation is stressed by the fact that agent calls don't have a natural user-facing correlation ID; if you can't reconstruct which tenant's agent produced which tool call at which time, you can't debug and you can't bill.
The design move worth making: treat every tool call as a first-class unit with a mandatory tenant tag. Not just on the request — on every log line, every metric, every span. If your observability stack can't group by tenant, you don't have tenant isolation, you have tenant separation on the happy path. The distinction shows up the first time you have to answer "which tenant caused this incident" in production.
This connects to broader agent observability practice we've covered in how to monitor third-party API integrations — the same discipline of instrumenting for the failure mode, not just the success path, applies here. Tenant-tagged observability isn't a nice-to-have; it's what makes tenant isolation testable.
Pool tenancy has always needed rate limits to survive noisy neighbours. What's new is that the noisy neighbour is now an agent that can generate ten times the request volume of the underlying user, and can do so in bursts triggered by a single prompt.
The rate limit shape most SaaS platforms have — per-tenant token bucket, per-endpoint quota — is roughly right, but the parameters are wrong. The quotas were sized against human-driven UI traffic. Agent traffic doesn't share that distribution. A useful rethink:
The honest observation: most teams discover their rate limits are wrong the first time a real agent workload hits production, and the discovery is unpleasant. Doing the sizing work before that moment is cheap; doing it after an incident is expensive.
Pontil sits in the tools layer of the agent stack. When we generate tools from a customer's existing APIs, the tenant context API is not something we invent — it's the customer's own auth surface, propagated end-to-end into every tool call. The runtime executes each tool call as the authenticated user, inside their tenant, with their permissions. There is no service account collapsing identities into a single blob.
That matters for multi-tenant SaaS architecture specifically because it means the isolation model you already designed — silo, pool, or bridge — is the isolation model your agents inherit. We don't sit alongside your tenancy boundaries; we sit inside them. The Pontil product is built on the assumption that the tenant boundary is the customer's contract, and the tools layer's job is to honour it, not re-architect it.
The punchline isn't "go rebuild your tenancy model." For established SaaS platforms with real customers and real revenue, that's a two-year project with no clear ROI. The punchline is narrower: the parts of multi-tenant SaaS architecture that were sleeping — tenant context propagation, per-user quotas inside a tenant, tenant-tagged observability, row-level enforcement of the boundary you thought lived at the gateway — need to wake up.
The good news is that most of the work is legible engineering, not architectural surgery. Add a tenant claim to your access tokens if it isn't there. Enforce it at every service boundary, not just the edge. Turn on RLS in your primary data store even if you're confident your application filters are correct. Tag every log line and every span with the tenant ID. Size your rate limits against agent traffic patterns, not UI traffic patterns.
The teams that do this quietly, before the agent project forces the issue, end up with a platform that can absorb the new traffic shape without a scramble. The teams that don't will discover — usually in an incident — that the tenant boundary they've been trusting for years was a convention, not a control. Agents don't respect conventions.
Stay up to date on the ever changing agentic landscape.