Agent infrastructure

API strategy

Multi-tenant SaaS architecture in the agent era: what still holds and what breaks

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.

10 minute read
Decorative imagery showcasing Pontil's brand

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.

The tenancy models, restated for people who already know them

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:

Silo tenancy
Pool tenancy

Isolation strength

Physical, enforced by infrastructure

Logical, enforced by code

Blast radius

Contained to one tenant

Cross-tenant if a query filter is missed

Cost per tenant

High and roughly flat

Low and shared

Operational overhead

Multiplies per tenant

Constant regardless of tenant count

Noisy-neighbour risk

None

Real, needs throttling

Onboarding speed

Slow (provisioning)

Fast (row insert)


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.

Where the silo vs pool tenancy trade-off shifts under agent load

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.

Tenant context API design: the piece nobody planned for

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:

  • A signed token, not a raw header. If you're on OAuth 2.1 you already have most of what you need — the access token carries user identity, tenant claim, and scope. Don't invent a parallel path.
  • Tenant scope in the token itself, not inferred from the user. If a user has access to three tenants, the token names which one this call is for. No ambiguity, no defaulting.
  • Verified at every service boundary. "The gateway checked it" is not enforcement — it's a hope. This is where the pool tenancy failure mode lives.
  • Immutable through the call graph. Downstream services do not rewrite the tenant context. If a call needs to cross a tenant boundary (a legitimate admin action, a cross-tenant report), that's a new call with a new token.

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.

Tenant isolation as a runtime property, not a schema decision

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:

  1. Can this call see data from another tenant? Data isolation. This is what schema and RLS decisions address.
  2. Can this call affect another tenant's performance? Resource isolation. This is what quotas, rate limits, and connection pools address.
  3. Can this call be attributed to the right tenant when something goes wrong? Observability isolation. This is what tenant-tagged logs, metrics, and traces address.

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.

Rate limiting, quotas, and the noisy neighbour problem when the neighbour is an agent

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:

  • Per-tenant limits at the outer boundary. Non-negotiable. This is what protects the platform.
  • Per-user limits inside the tenant. New in the agent era. A single user's agent shouldn't be able to exhaust the tenant's entire budget.
  • Per-tool limits. Some tool calls are expensive (bulk exports, cross-object queries). Rate limiting them separately from cheap reads is worth the extra complexity.
  • Distinguish agent traffic from UI traffic in the metric, not the limit. Same quota, but you want to know the shape of what's consuming it.

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.

How Pontil fits

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.

What does agent-ready multi-tenant architecture actually look like from here?

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.

Join our weekly newsletter

Stay up to date on the ever changing agentic landscape.

POSTS

Related content

Agent infrastructure

Platform integration

Agent identity vs user identity: the boundary security reviews will demand

5 minute read

API strategy

Agent infrastructure

MACH architecture in the agent era: the principles still hold, the assumptions don't

4 minute read

Agent infrastructure

Agents in production

AI agent sandbox: what isolation actually means when agents call real tools

10 minute read