<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Alter]]></title><description><![CDATA[Building the auth layer for next generation of agents ]]></description><link>https://blog.alterauth.com</link><image><url>https://substackcdn.com/image/fetch/$s_!jrm0!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4f274a3-5f76-43ef-8953-6bf6a87cbdf1_400x400.png</url><title>Alter</title><link>https://blog.alterauth.com</link></image><generator>Substack</generator><lastBuildDate>Wed, 10 Jun 2026 10:16:17 GMT</lastBuildDate><atom:link href="https://blog.alterauth.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Srikar Dandamuraju]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[alterauth@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[alterauth@substack.com]]></itunes:email><itunes:name><![CDATA[Alter]]></itunes:name></itunes:owner><itunes:author><![CDATA[Alter]]></itunes:author><googleplay:owner><![CDATA[alterauth@substack.com]]></googleplay:owner><googleplay:email><![CDATA[alterauth@substack.com]]></googleplay:email><googleplay:author><![CDATA[Alter]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Introducing Alter Vault]]></title><description><![CDATA[The authorization layer for AI agents]]></description><link>https://blog.alterauth.com/p/introducing-alter-vault</link><guid isPermaLink="false">https://blog.alterauth.com/p/introducing-alter-vault</guid><dc:creator><![CDATA[Alter]]></dc:creator><pubDate>Wed, 27 May 2026 18:27:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!jrm0!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4f274a3-5f76-43ef-8953-6bf6a87cbdf1_400x400.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>The problem: agents need API access, but credentials are a mess</strong></h2><p>AI agents are becoming the primary way software interacts with external APIs. A single agent might read from Google Calendar, post to Slack, create a GitHub PR, and query Datadog, all in one task.</p><p>Today, most teams handle this with scattered environment variables, hardcoded tokens, and ad-hoc authorization logic bolted on after the fact. The result: tokens stored in plaintext databases, no visibility into which agent accessed what, no way to revoke access without redeploying, and zero audit trail when something goes wrong.</p><p>It works until it doesn&#8217;t. And when it doesn&#8217;t, you have no idea what happened.</p><h2><strong>What Alter Vault does</strong></h2><p>Alter Vault is the authorization layer for AI agents. It sits between your agents and the APIs they call. Every request flows through the vault, which handles three things:</p><p><strong>Encrypted credential storage.</strong> OAuth tokens and API keys are stored in an encrypted vault &#8212; never in your application database. Your code only holds a reference ID. Tokens are automatically refreshed before they expire, so agents never hit a 401.</p><p><strong>Identity-aware policy enforcement.</strong> Every request is checked against two identities: the end user who authorized the connection <em>and</em> the agent making the request. Policies define which agents can access which APIs, with what scopes, during what time windows. Unauthorized requests are blocked before they reach the provider. Fail-closed by default &#8212; if a policy can&#8217;t be evaluated, the request is denied.</p><p><strong>Dual-identity audit logging.</strong> Every API call is logged with full context: the organization, the end user, the agent, the specific tool invocation, and the result. You get a complete chain of custody for every action, ready for SOC 2, GDPR, or HIPAA compliance.</p><h2><strong>Two types of credentials, one API</strong></h2><p>Alter Vault supports two credential types, both accessed through the same <code>alter_app.request()</code> method:</p><p><strong>OAuth connections</strong> are end-user authorized. A user clicks &#8220;Connect Google&#8221; in your app, authorizes access through the standard OAuth flow, and the tokens are stored encrypted in the vault. The user can see and revoke their connections from the Wallet Dashboard at any time.</p><p><strong>Managed secrets</strong> are developer-stored. API keys, service tokens, and other credentials that don&#8217;t require end-user authorization &#8212; stored through the Developer Portal and accessed with the same <code>alter_app.request()</code> call. Supports Bearer tokens, API keys, Basic Auth, and AWS SigV4.</p><h2><strong>How a request flows through the vault</strong></h2><p>When an agent calls <code>alter_app.request()</code>, five things happen in under 15ms:</p><ol><li><p><strong>Identity resolution</strong> &#8212; The vault resolves the full chain: organization, app, end user, and agent. If the agent registered with a <code>run_id</code> or <code>thread_id</code>, those are captured too.</p></li><li><p><strong>Policy evaluation</strong> &#8212; Access policies are checked against the resolved identity. Scope restrictions, time windows, and custom rules are all evaluated. If any check fails, the request is denied immediately.</p></li><li><p><strong>Token retrieval</strong> &#8212; The encrypted credential is decrypted from the vault. If the token is expired, it&#8217;s automatically refreshed before injection.</p></li><li><p><strong>Request proxying</strong> &#8212; The token is injected into the authorization header, and the request is forwarded to the provider. Connection pooling and retry logic are built in.</p></li><li><p><strong>Audit logging</strong> &#8212; The full request is logged with both identities (end user + agent), the policy decision, the provider response, and latency.</p></li></ol><h2><strong>Agent identity tracking</strong></h2><p>When multiple agents access the same credentials, you need to know exactly which agent did what. Alter Vault tracks agent identity at two levels:</p><p><strong>Agent registration</strong> &#8212; each agent type (e.g., &#8220;scheduling-bot&#8221;, &#8220;data-pipeline&#8221;) is registered once. Every request from that agent is attributed to it in audit logs.</p><p><strong>Per-request context</strong> &#8212; for agent frameworks like LangChain and LangGraph, pass <code>run_id</code>, <code>thread_id</code>, and <code>tool_call_id</code> on each request. This gives you full traceability through multi-step agent workflows, down to the individual tool invocation.</p><pre><code><code>from alter_sdk import App, ActorType, HttpMethod

alter_app = App(
    api_key="alter_key_...",
    actor_type=ActorType.AI_AGENT,
    actor_identifier="scheduling-bot",
)

response = await alter_app.request(
    grant_id,
    HttpMethod.GET,
    "https://www.googleapis.com/calendar/v3/calendars/{calendar_id}/events",
    path_params={"calendar_id": "primary"},
    query_params={"maxResults": "10"},
    run_id="run_abc123",
    thread_id="thread_xyz",
)</code></code></pre><p>The TypeScript SDK has the exact same interface:</p><pre><code><code>import { App, ActorType, HttpMethod } from "@alter-ai/alter-sdk";

const alterApp = new App({
  apiKey: "alter_key_...",
  actorType: ActorType.AI_AGENT,
  actorIdentifier: "scheduling-bot",
});

const response = await alterApp.request(
  grantId,
  HttpMethod.GET,
  "https://www.googleapis.com/calendar/v3/calendars/{calendar_id}/events",
  {
    pathParams: { calendar_id: "primary" },
    queryParams: { maxResults: "10" },
    runId: "run_abc123",
    threadId: "thread_xyz",
  },
);</code></code></pre><h2><strong>Three ways to connect end users</strong></h2><p>Alter Connect supports three trigger methods depending on your application type:</p><ul><li><p><strong>Headless</strong> &#8212; for CLI tools, scripts, and Jupyter notebooks. The SDK opens a browser for the user to authorize, then returns the connection.</p></li><li><p><strong>Redirect</strong> &#8212; for server-rendered apps. Your backend redirects the user to the hosted Connect page, and they&#8217;re redirected back after authorization.</p></li><li><p><strong>Popup</strong> &#8212; for SPAs. The <code>@alter-ai/connect</code> frontend SDK opens a popup window with the provider picker. No page navigation required.</p></li></ul><p>All three methods result in the same thing: an encrypted credential in the vault and a connection ID your app can use with <code>alter_app.request()</code>.</p><h2><strong>60+ providers, zero provider-specific code</strong></h2><p>Alter Vault supports 50+ OAuth providers out of the box &#8212; Google, Slack, GitHub, Notion, Atlassian, Salesforce, HubSpot, Linear, and many more. Once a provider is configured in the Developer Portal, your agents access it through the same <code>alter_app.request()</code> call regardless of the provider. No provider-specific token handling, no refresh logic, no scope management.</p><h2><strong>Get started</strong></h2><p>Install the SDK and make your first authenticated API call in minutes:</p><pre><code><code>pip install alter-sdk</code></code></pre><pre><code><code>npm install @alter-ai/alter-sdk</code></code></pre><p>Read the <a href="https://docs.alterauth.com/">full documentation</a> to learn more, or sign up at the <a href="https://portal.alterauth.com/">Developer Portal</a> to create your first app.</p><p><a href="https://alterauth.com/blog">&#8592;</a></p>]]></content:encoded></item><item><title><![CDATA[Is authorization for agents actually a new problem]]></title><description><![CDATA[If machine-to-machine authorization works under fixed assumptions, what changes with agents?]]></description><link>https://blog.alterauth.com/p/is-authorization-for-ai-agents-actually</link><guid isPermaLink="false">https://blog.alterauth.com/p/is-authorization-for-ai-agents-actually</guid><dc:creator><![CDATA[Alter]]></dc:creator><pubDate>Wed, 01 Apr 2026 06:10:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!jrm0!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4f274a3-5f76-43ef-8953-6bf6a87cbdf1_400x400.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There is a lot of hype around agents and rightfully so. It is a technology still very much in its infancy, with believers pointing to the possibility of agents automating away vast swaths of knowledge work as we know it. </p><p>If true, the ramifications on how we think about human work and society are enormous. Much of the digital software we interact with today could become agentic. Given a shift of this magnitude, it is only natural that entirely new categories of products begin to emerge to support this world.</p><p>At the same time, some skepticism is warranted. Is agentic software really that different? Can the problems we solved in traditional software not be reapplied here? After all, we have already built systems for machine-to-machine interaction. Is this not simply another rendition of existing machine-to-machine auth problems?</p><p>While the initial skepticism is natural, agentic systems do introduce fundamentally different authorization challenges. To understand why, it is worth stepping back and examining how agentic systems differ from traditional software.</p><p>To be precise, while often referred to broadly as &#8220;auth,&#8221; the most significant new challenges for agentic systems lie in authorization rather than authentication.</p><h2><br>What are agents</h2><p><br>Traditional software is built around deterministic execution, a predefined set of rules that dictate how the system behaves. Each step in the flow is explicitly designed, and the system is expected to operate within a well-understood set of states. When a scenario is not accounted for, the system enters a state that is typically classified as a bug. Much of the software engineering lifecycle, from design to testing, is centered around ensuring that these states and transitions are well understood and controlled.</p><p>Agents represent an evolution of this model. At a high level, most agents consist of a probabilistic, non-deterministic decision-making component, often an LLM, that determines what to do next, and a set of tools, APIs, services, or functions that are no different from traditional deterministic software, executing predefined logic. The difference is not in the tools themselves, but in how they are selected and composed. Rather than following a fixed flow, the agent dynamically decides which tools to use and in what sequence.</p><p>This introduces a fundamental shift. Instead of being purely deterministic, agentic software combines deterministic modules with probabilistic decision-making that drives key parts of execution. The system is no longer just executing predefined steps, it is deciding what to do next.</p><p>As a result, agentic systems can enter states that were not explicitly anticipated during development, allowing them to handle problems that are impractical to fully specify ahead of time.</p><p>To make this more concrete, consider a simple agent tasked with scheduling a meeting:</p><blockquote><p>In a traditional software system, the flow might look like:</p><ul><li><p>parse structured user input and extract required fields (date, time range, participants)</p></li><li><p>validate inputs and map them to predefined parameters</p></li><li><p>query calendar systems using fixed API calls with known schemas</p></li><li><p>compute availability and suggest time slots based on predefined rules</p></li><li><p>confirm selection and create the event via a deterministic booking flow</p></li></ul><p>Each step is explicitly defined, with well-understood inputs, outputs, and state transitions. The system operates within a predefined flow, where every possible path has been anticipated and implemented ahead of time.</p><p>Now consider an agent performing the same task. Instead of following a fixed flow, it might:</p><ul><li><p>interpret vague instructions like &#8220;sometime early next week&#8221; and convert them into concrete time ranges for tool execution</p></li><li><p>infer relevant participants from context and resolve identities via directory APIs</p></li><li><p>call calendar and availability APIs across systems to assemble a real-time view of schedules</p></li><li><p>use messaging tools to propose times, gather responses, and iteratively resolve conflicts</p></li><li><p>adapt mid-execution through additional tool calls, updating holds, canceling events, or re-querying availability as constraints evolve</p></li></ul><p>Each of these steps is not hardcoded, but dynamically selected and executed via tool calls, with the agent continuously deciding what to do next based on context and intermediate results.</p></blockquote><p>What this really means is that agentic software operates over an effectively unbounded and non-enumerable state space driven by probabilistic decision-making<strong>.</strong> In contrast, traditional software operates over a bounded and enumerable state space driven by deterministic execution.</p><p>This means we are no longer authorizing a fixed set of actions, but delegating decision-making authority to a system whose behavior cannot be fully specified ahead of time.<br><br>Now to add to this, there is a second, equally important challenge: <strong>identity and delegation.</strong></p><h2><br>Agent identity and delegation</h2><p>Now that we have established that agents operate over an effectively unbounded and non-enumerable state space, a second implication follows. Agents begin to resemble entities with their own decision-making capability, rather than traditional software executing predefined logic.</p><p>This creates an interesting challenge in how we model agent identity.</p><p>In traditional systems, software identity is typically represented through static accounts, often referred to as service accounts, which are tightly scoped and explicitly controlled. These service accounts are what allow software running in production to access third-party resources such as APIs and databases.</p><p>With agents, this model begins to break down. Static service accounts are no longer sufficient, as agents do not operate under a single identity. They have their own system identity, but also act on behalf of users, dynamically exercising delegated permissions.</p><p>This distinction is subtle, but critical. Agents operate across contexts and make decisions over time while using user-level access.</p><p>As a result, authorization is no longer evaluated against a single identity. The system must account for both the agent&#8217;s identity and the end user&#8217;s identity, since the agent is making decisions using the user&#8217;s permissions.</p><p></p><blockquote><p><strong>The decision-maker and the permission-holder are no longer the same entity. The agent determines what to do, but does so using the user&#8217;s permissions.</strong></p></blockquote><h2><strong><br></strong>Why traditional authorization models break for agents</h2><p>To see why this breaks in practice, consider a simple scenario.</p><p>An agent is given access to a user&#8217;s calendar, email, and internal systems with the goal of &#8220;scheduling and coordinating meetings.&#8221; In a traditional system, the scope of actions would be tightly defined, with clear boundaries on what can and cannot be done.</p><p>In an agentic system, however, the agent is not just executing predefined actions. It is deciding which actions to take based on context, while operating under the user&#8217;s identity.</p><p>The challenge is not in any individual action. Reading emails, accessing calendars, sending invites, or modifying events are all valid operations within the scope of the task.</p><p>The problem emerges from how these actions are combined. Because the agent is continuously deciding what to do next, the sequence, timing, and composition of these actions are not fixed ahead of time. The effective scope of the system emerges during execution rather than being predefined.</p><p>In practice, this means an agent could:</p><ul><li><p>access data that was not originally intended to be part of the task</p></li><li><p>take actions that exceed the user&#8217;s expectations</p></li><li><p>chain together permissions across systems in ways that were never explicitly designed</p></li></ul><p>The issue is not that any individual action is unauthorized, but that the combination of actions leads to outcomes that are difficult to anticipate or constrain.</p><p>Traditional authorization models assume that actions and execution paths can be defined ahead of time. Agentic systems violate this assumption.</p><p></p><blockquote><p><strong>We are no longer authorizing actions. We are authorizing systems that decide which actions to take.</strong></p></blockquote><p></p><h2>Implications for authorization in an agentic world</h2><p>This shift has significant implications for how we design authorization systems in an agentic world. It is no longer sufficient to define permissions as a static set of allowed actions tied to a single identity.</p><p>Instead, authorization must account for systems that act over time, make decisions dynamically, and operate under composed identities. This requires new models that can reason about intent, constrain behavior across sequences of actions, and provide stronger guarantees around how delegated authority is used.</p><p>The problem is no longer just controlling access, but governing how autonomous systems exercise it.</p><p>This is the problem space we are building for at  <a href="http://alterauth.com">Alter</a>. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.alterauth.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"><strong>Thanks for reading. If this resonated, consider subscribing for future posts.</strong></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>