Sr. Content Developer at Microsoft, working remotely in PA, TechBash conference organizer, former Microsoft MVP, Husband, Dad and Geek.
159925 stories
·
33 followers

Azure.AI.Projects_3.0.0-beta.1

1 Share

3.0.0-beta.1 (2026-08-24)

Features Added

  • Enabled the Model weights subclient.
  • Added the convenience methods UploadModelAsync and UploadModel to upload model weights.
  • Added distributed tracing support.

Breaking Changes

  • The GetConnectionAsync and GetConnection methods of AIProjectConnectionsOperations are now returning Task<ClientResult<AIProjectConnection>> and ClientResult<AIProjectConnection> respectively.
  • The Routines and routine runs listing has been changed: the parameter before was removed from both GetRoutineRuns and GetRoutines methods. In the GetRoutineRuns the parameter name was replaced by routineName. The same changes were done for asynchronous methods.

Bugs Fixed

  • Fix the Foundry-Features header, resulting in 400 error during Agent optimization jobs submission.

Sample Updates

  • Added sample for Model weights.
  • Added sample for GitHubIssueRoutineTrigger.
  • Updated sample for routine with manual dispatching so that it also demonstrates triggering based on message in Teams.
Read the whole story
alvinashcraft
just a second ago
reply
Pennsylvania, USA
Share this story
Delete

Azure.AI.Extensions.OpenAI_3.0.0-beta.1

1 Share

3.0.0-beta.1 (2026-08-24)

This release migrates the library from emitting its own copies of the OpenAI Responses object model to consuming the types provided by the OpenAI .NET library (2.12.0). This is a large, breaking change. See the Migration Guide for step-by-step upgrade guidance.

Features Added

  • Added distributed tracing support.
  • Added SessionId, Agent, and AgentConversationId extension properties on OpenAI.Responses.CreateResponseOptions (via CreateResponseOptionsExtensions). SessionId scopes a response to a specific session.
  • Added AgentReference and ResponseId extension properties on OpenAI.Responses.ResponseItem (via ResponseItemExtensions), and Agent/AgentConversationId on OpenAI.Responses.ResponseResult (via ResponseResultExtensions). These replace the instance properties that were declared on the removed AgentResponseItem base type, and are read-only.
  • Added ResponseItemKindExtensions and ResponseToolKindExtensions, which surface the Azure-specific kinds (for example ResponseToolKind.BingGrounding, ResponseItemKind.AzureAISearchCall) as named members on the upstream OpenAI.Responses.ResponseToolKind and ResponseItemKind extensible enums.
  • FabricIQPreviewTool.RequireApproval is now the strongly-typed FabricIQPreviewToolRequireApprovalChoice instead of a raw BinaryData. It converts implicitly from both string and OpenAI.Responses.McpToolCallApprovalPolicy.
  • The ProjectResponsesClient constructors accept ProjectResponsesClientOptions, including parameterless-options overloads so new ProjectResponsesClient(projectEndpoint, tokenProvider) resolves to a visible constructor without requiring an options argument.
  • Added MemoryLimit and NetworkPolicy extension properties on OpenAI.Responses.AutomaticCodeInterpreterToolContainerConfiguration (via AutomaticCodeInterpreterToolContainerConfigurationExtensions). These properties use the OpenAI.Containers.ContainerMemoryLimit and OpenAI.Containers.ContainerNetworkPolicy types and preserve the Foundry memory_limit and network_policy request fields.

Breaking Changes

  • Changed ProjectResponsesClientOptions to derive from OpenAI.Responses.ResponsesClientOptions (instead of ProjectOpenAIClientOptions). This aligns with the upstream OpenAI client option hierarchy after ResponsesClientOptions was split out as a sibling of OpenAIClientOptions. Because it no longer derives from ProjectOpenAIClientOptions, it can no longer be passed to the ProjectOpenAIClient constructor; use ProjectOpenAIClientOptions there.

  • Response items and tools are now the OpenAI SDK types. This library no longer emits its own copies of the Responses object model; it consumes the types from the OpenAI library (2.12.0) directly. As a result:

    • The AgentResponseItem base type and the AgentResponseItemKind enum were removed. Azure-specific response items (for example BingGroundingToolCall, AzureAISearchToolCall, OAuthConsentRequestResponseItem) now derive from OpenAI.Responses.ResponseItem, and Azure-specific tools (for example BingGroundingTool, AzureAISearchTool) now derive from OpenAI.Responses.ResponseTool. Iterate ResponseResult.OutputItems as OpenAI.Responses.ResponseItem and pattern-match to the Azure subtypes.
    • The settable AgentResponseItem.AgentReference and AgentResponseItem.ResponseId instance properties are gone. The same values are now read-only extension properties on OpenAI.Responses.ResponseItem (ResponseItemExtensions), so a using Azure.AI.Extensions.OpenAI; must be in scope to see them. To set agent or conversation metadata, use the Agent, AgentConversationId, and SessionId extension properties on CreateResponseOptions instead.
    • The public ResponseItem.AsAgentResponseItem() extension method was removed. Results returned by ProjectResponsesClient and the CreateResponse/CreateResponseAsync extensions are now normalized automatically, so OutputItems and echoed Tools already surface the strongly-typed Azure subtypes without any caller-side conversion.
  • Azure Responses tool and model types were renamed by dropping the Responses prefix so they read naturally alongside the upstream OpenAI.Responses types. A few names were further normalized (...ToolParameters...ToolOptions, ...Configuration/...ConnectionParameters...Options, ...AuthDetails...AuthenticationDetails, SharepointSharePoint, OpenApiOpenAPI on tool types). The full mapping:

    Old (2.x) New (3.0.0-beta.1)
    ResponsesA2APreviewTool A2APreviewTool
    ResponsesAzureAISearchQueryKind AzureAISearchQueryKind
    ResponsesAzureAISearchTool AzureAISearchTool
    ResponsesAISearchIndexResource AzureAISearchToolIndex
    ResponsesAzureAISearchToolResource AzureAISearchToolOptions
    ResponsesAzureFunctionBinding AzureFunctionBinding
    ResponsesAzureFunctionDefinition AzureFunctionDefinition
    ResponsesAzureFunctionDefinitionFunction AzureFunctionDefinitionFunction
    ResponsesAzureFunctionStorageQueue AzureFunctionStorageQueue
    ResponsesAzureFunctionTool AzureFunctionTool
    ResponsesBingCustomSearchConfiguration BingCustomSearchOptions
    ResponsesBingCustomSearchPreviewTool BingCustomSearchPreviewTool
    ResponsesBingCustomSearchToolParameters BingCustomSearchToolOptions
    ResponsesBingGroundingSearchConfiguration BingGroundingSearchOptions
    ResponsesBingGroundingSearchToolParameters BingGroundingSearchToolOptions
    ResponsesBingGroundingTool BingGroundingTool
    ResponsesBrowserAutomationPreviewTool BrowserAutomationPreviewTool
    ResponsesBrowserAutomationToolConnectionParameters BrowserAutomationToolConnectionOptions
    ResponsesBrowserAutomationToolParameters BrowserAutomationToolOptions
    ResponsesCaptureStructuredOutputsTool CaptureStructuredOutputsTool
    ResponsesFabricDataAgentToolOptions FabricDataAgentToolOptions
    ResponsesFabricIQPreviewTool FabricIQPreviewTool
    ResponsesMemorySearchOptions MemorySearchOptions
    ResponsesMemorySearchPreviewTool MemorySearchPreviewTool
    ResponsesMicrosoftFabricPreviewTool MicrosoftFabricPreviewTool
    ResponsesOpenApiAnonymousAuthDetails OpenApiAnonymousAuthenticationDetails
    ResponsesOpenApiAuthDetails OpenApiAuthenticationDetails
    ResponsesOpenApiFunctionDefinition OpenApiFunctionDefinition
    ResponsesOpenApiFunctionDefinitionFunction OpenApiFunctionDefinitionFunction
    ResponsesOpenApiManagedAuthDetails OpenApiManagedAuthenticationDetails
    ResponsesOpenApiManagedSecurityScheme OpenApiManagedSecurityScheme
    ResponsesOpenApiProjectConnectionAuthDetails OpenApiProjectConnectionAuthenticationDetails
    ResponsesOpenApiProjectConnectionSecurityScheme OpenApiProjectConnectionSecurityScheme
    ResponsesOpenApiTool OpenApiTool
    ResponsesSharepointGroundingToolParameters SharePointGroundingToolOptions
    ResponsesSharepointPreviewTool SharePointPreviewTool
    ResponsesStructuredOutputDefinition StructuredOutputDefinition
    ResponsesToolProjectConnection ToolProjectConnection
    ResponsesWebSearchConfiguration WebSearchConfiguration
    ResponsesWorkIQPreviewTool WorkIQPreviewTool
  • Other renames were done:

    Old (2.x) New (3.0.0-beta.1)
    OpenAPIAnonymousAuthenticationDetails OpenApiAnonymousAuthenticationDetails
    SharepointGroundingToolCall SharePointGroundingToolCall
    SharepointGroundingToolCallOutput SharePointGroundingToolCallOutput

    The built-in tool and item types that OpenAI already models (for example computer-use, web-search, function, and MCP tools) are no longer emitted by this library; use the corresponding OpenAI.Responses types instead.

  • Members were renamed alongside their declaring types:

    Type Old member (2.x) New member (3.0.0-beta.1)
    OpenApiFunctionDefinition Auth (and the auth constructor parameter) Authentication (and authentication)
    OpenApiFunctionDefinition DefaultParams DefaultParameters
    OpenApiAuthenticationDetails Type Kind
  • OAuthConsentRequestResponseItem changed shape: the consent link is now the strongly-typed Uri ConsentLink property rather than the internalConsentLink string, and both ConsentLink and Id are now settable.

  • Added the AAIP002 experimental diagnostic, alongside the existing AAIP001. AAIP002 is applied to the Azure tool and response-item models (for example BingGroundingTool, AzureAISearchTool, CaptureStructuredOutputsTool, OAuthConsentRequestResponseItem, and their ...ToolCall/...ToolCallOutput types), while AAIP001 covers the response-normalization surfaces, ProjectResponsesClient, the extension-member classes, and the preview Foundry tools. Callers that previously suppressed only AAIP001 must now also suppress AAIP002.

  • Removed the ProjectConversation, ProjectConversationCreationOptions, and ProjectConversationUpdateOptions data models. These duplicated the conversation types now provided by the OpenAI library (2.12.0+). ProjectConversationsClient and the CreateResponse/CreateResponseAsync extension overloads now consume and return OpenAI.Conversations.ConversationResource, OpenAI.Conversations.ConversationCreationOptions, and OpenAI.Conversations.ConversationUpdateOptions instead. The ProjectConversationsClient method names (CreateProjectConversation, GetProjectConversation(s), UpdateProjectConversation) are unchanged. Note that ProjectConversation's implicit conversion to its ID string is not available on ConversationResource; use conversation.Id explicitly.

  • The generated code-interpreter container types ResponsesAutoCodeInterpreterToolParam, ResponsesContainerMemoryLimit, ResponsesContainerNetworkPolicyParam, ResponsesContainerNetworkPolicyAllowlistParam, ResponsesContainerNetworkPolicyDisabledParam, and ResponsesContainerNetworkPolicyDomainSecretParam were removed. Create an OpenAI.Responses.AutomaticCodeInterpreterToolContainerConfiguration and use its new MemoryLimit and NetworkPolicy extension properties with the corresponding OpenAI.Containers types instead.

  • Removed the strongly-typed request/response types for several preview Responses tool kinds that have no equivalent in the upstream OpenAI library (2.12.0). OpenAI's OpenAI.Responses.ResponseToolKind models only apply_patch, code_interpreter, computer_use_preview, file_search, function, image_generation, mcp, web_search, and web_search_preview, so mapping onto the upstream types dropped the previously generated:

    • Custom tools + grammar: ResponsesCustomToolParam, ResponsesCustomToolParamFormat, ResponsesCustomTextFormatParam, CustomGrammarFormatParam, ResponsesGrammarSyntax, OutputItemCustomToolCallOutputResource.
    • local_shell / shell tools: ResponsesLocalShellToolParam, ResponsesFunctionShellToolParam, ResponsesFunctionShellToolParamEnvironment, ResponsesFunctionShellToolParamEnvironmentContainerReferenceParam, ResponsesFunctionShellToolParamEnvironmentLocalEnvironmentParam, ItemLocalShellToolCallOutputStatus, OutputItemLocalShellToolCallOutput.
    • namespace tool: ResponsesNamespaceToolParam.
    • tool_search tool: ResponsesToolSearchToolParam, ResponsesToolSearchExecutionType, OutputItemToolSearchCall, OutputItemToolSearchOutput.
    • Skills: ContainerSkill, LocalSkillParam, ResponsesInlineSkillParam, ResponsesInlineSkillSourceParam, ResponsesSkillReferenceParam.

    These tool kinds remain reachable on the wire because ResponseToolKind is an extensible enum and the corresponding tool slots accept a raw object payload, but strongly-typed construction is not available. Native support for each will return once the upstream OpenAI .NET SDK models the tool kind. The Azure Foundry toolbox search capability remains available, now surfaced as the OpenAI.Responses.ResponseToolKind.ToolboxSearchPreview tool kind (the previously generated ResponsesToolboxSearchPreviewTool type is no longer emitted).

Other Changes

  • Updated the OpenAI package dependency to 2.12.0. 2.11.0 reshaped OpenAI.Responses.ResponsesClientOptions to derive directly from System.ClientModel.Primitives.ClientPipelineOptions (a sibling of OpenAI.OpenAIClientOptions rather than a subclass), which is why ProjectResponsesClientOptions now derives from ResponsesClientOptions. 2.12.0 adds strongly-typed conversation support (OpenAI.Conversations.ConversationResource, ConversationCreationOptions, ConversationUpdateOptions); the conversation data models previously emitted by this package are no longer generated, and the temporary local convenience layer now delegates to the upstream types.

Sample Updates

  • Added sample for running responses in specific sessions.
  • Added sample for ReminderPreviewToolboxTool.
  • Removed the session ID header from the samples; it does not affect which session is used.
Read the whole story
alvinashcraft
12 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

Azure.AI.Projects.Agents_3.0.0-beta.1

1 Share

3.0.0-beta.1 (2026-08-24)

Features Added

  • Added distributed tracing support.

Breaking Changes

  • The Agent optimization-related classes were renamed
Old (2.x) New (3.0.0-beta.1)
OptimizationCandidate AgentOptimizationCandidate
OptimizationDatasetCriterion AgentOptimizationDatasetCriterion
OptimizationDatasetInput AgentOptimizationDatasetInput
OptimizationDatasetItem AgentOptimizationDatasetItem
OptimizationEvaluatorRef AgentOptimizationEvaluatorRef
OptimizationInlineDatasetInput AgentOptimizationInlineDatasetInput
OptimizationJob AgentOptimizationJob
OptimizationJobInputs AgentOptimizationJobInputs
OptimizationJobListItem AgentOptimizationJobListItem
OptimizationJobProgress AgentOptimizationJobProgress
OptimizationJobResult AgentOptimizationJobResult
OptimizationOptions AgentOptimizationOptions
OptimizationReferenceDatasetInput AgentOptimizationReferenceDatasetInput
OptimizationAgentIdentifier OptimizedAgentIdentifier

Bugs Fixed

  • Fixed listing of Agent Optimization Jobs.
  • Fixed the StopSession and StopSessionAsync calls.

Other Changes

  • Updated the OpenAI package dependency to 2.12.0.

Sample Updates

  • Added sample demonstrating disabling and enabling Hosted Agent.
  • Added samples for Agent optimization jobs.
  • Added sample for creating Agent version drafts.
Read the whole story
alvinashcraft
17 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

Windows Package Manager 1.29.290

1 Share

This is a servicing release of Windows Package Manager v1.29. If you find any bugs or problems, please help us out by filing an issue.

New in v1.29

New Feature: Source Priority

Note

Experimental under sourcePriority; defaulted to disabled.

With this feature, one can assign a numerical priority to sources when added or later through the source edit
command. Sources with higher priority are sorted first in the list of sources, which results in them getting put first
in the results if other things are equal.

Tip

Search result ordering in winget is currently based on these values in this order:

  1. Match quality (how well a valid field matches the search request)
  2. Match field (which field was matched against the search request)
  3. Source order (was always relevant, but with priority you can more easily affect this)

Beyond the ability to slightly affect the result ordering, commands that primarily target available packages
(largely install) will now prefer to use a single result from a source with higher priority rather than prompting for
disambiguation from the user. Said another way, if multiple sources return results but only one of those sources has
the highest priority value (and it returned only one result) then that package will be used rather than giving a
"multiple packages were found" error. This has been applied to both winget CLI and PowerShell module commands.

REST result match criteria update

Along with the source priority change, the results from REST sources (like msstore) now attempt to correctly set the
match criteria that factor into the result ordering. This will prevent them from being sorted to the top automatically.

Minor Features

Preserve installer arguments across export and import

winget export now captures the --override and --custom arguments that were used when a package was originally installed and saves them into the export file. When subsequently running winget import, those values are automatically re-applied during installation — --override replaces all installer arguments and --custom appends extra switches — so packages can be reinstalled with the same customizations without any manual intervention. Both fields are optional and independent of each other; packages without stored installer arguments are unaffected.

--no-progress flag

Added a new --no-progress command-line flag that disables all progress reporting (progress bars and spinners). This flag is universally available on all commands and takes precedence over the visual.progressBar setting. Useful for automation scenarios or when running WinGet in environments where progress output is undesirable.

MCP upgrade support

The WinGet MCP server's existing tools have been extended with new parameters to support upgrade scenarios:

  • find-winget-packages now accepts an upgradeable parameter (default: false). When set to true, it lists only installed packages that have available upgrades — equivalent to winget upgrade. The query parameter becomes optional in this mode, allowing it to filter results or be omitted to list all upgradeable packages. AI agents can use this to answer requests like "What apps can I update with WinGet?"
  • install-winget-package now accepts an upgradeOnly parameter (default: false). When set to true, it only upgrades an already-installed package and returns a clear error if the package is not installed (pointing to install-winget-package without upgradeOnly instead). AI agents can use this to answer requests like "Update WinGetCreate" or, in combination with find-winget-packages with upgradeable=true, "Update all my apps."

Authenticated GitHub API requests in PowerShell module

The PowerShell module now automatically uses GH_TOKEN or GITHUB_TOKEN environment variables to authenticate GitHub API requests. This significantly increases the GitHub API rate limit, preventing failures in CI/CD pipelines. Use -Verbose to see which token is being used.

Default priority of installer types

Installer type selection no longer depends on the order defined on the manifest. Instead, preference is given in this order:

  • MSIX
  • MSI / Wix / Burn
  • Nullsoft / Inno / EXE
  • Portable

When a user configures installer type requirements or preferences, the order in which they are listed is now respected during installer selection.

Improved list output when redirected

  • winget list (and similar table commands) no longer truncates output when stdout is redirected to a file or variable — column widths are now computed from the full result set.
  • Spinner and progress bar output are suppressed when no console is attached, keeping redirected output clean.

Log file naming strategy

Added a user setting (logging.fileNameStrategy) for controlling the default naming strategy for installer log files. Supported values are manifest (default), timestamp, guid, and shortguid. Only applies to logs generated by installers if the installer itself supports the logging switch / parameter.

Setting Description
manifest Uses the name of the manifest and a timestamp. Has the same behavior as WinGet 1.28
timestamp The log name is just a timestamp
guid The log name is a GUID
shortguid The log name is the first 8 characters of a GUID

Sortable list output

winget list now supports sorting results via --sort <field> (repeatable for multi-field sorting), --ascending/--descending direction flags, and a persistent output.sortOrder setting. Available sort fields: name, id, version, source, available, relevance. By default, results are sorted alphabetically by name when no query is present; use --sort relevance to preserve the previous source-determined ordering.

Bug Fixes

  • winget export now works when the destination path is a hidden file
  • Fixed the useLatest property in the DSC v3 Microsoft.WinGet/Package resource schema to emit a boolean default (false) instead of the incorrect string "false".
  • SignFile in WinGetSourceCreator now supports an optional RFC 3161 timestamp server via the new TimestampServer property on the Signature model. When set, signtool.exe is called with /tr <url> /td sha256, embedding a countersignature timestamp so that signed packages remain valid after the signing certificate expires.
  • File and directory paths passed to signtool.exe and makeappx.exe are now quoted, fixing failures when paths contain spaces.
  • DSC export now correctly exports WinGet Admin Settings
  • winget validate now performs case-insensitive comparison for file extensions where applicable
  • winget source reset now properly resets default sources instead of removing them
  • DSC v3 Microsoft.WinGet/Package resource now honors the installMode property to use silent or interactive installer switches as specified
  • Fixed a crash (0x8000ffff) when using --disable-interactivity with the Resume experimental feature enabled during install operations.

What's Changed

Full Changelog: v1.29.280...v1.29.290

Read the whole story
alvinashcraft
38 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

Intent to Ship: JPEG XL

1 Share

It isn’t often that new image formats land in browsers. In the early 2000s we had JPEG, GIF, and PNG. The 2010s gave us WebP, which was a modest step up from JPEG. But the 2020s have given us two new image formats that are a big step up from previous formats: AVIF and JPEG XL.

We shipped AVIF back in 2021, and today we posted our intent to ship JPEG XL. Chrome are also intending to ship, and given there’s already a partial implementation in Safari, the format will be supported across browsers before the end of the year.

Shipping JPEG XL securely

We added experimental support for JPEG XL behind a flag back in 2021. But, at 100,000 lines of multithreaded C++, we were concerned about the attack surface this added to Firefox.

So, we laid down a challenge to the JPEG XL team at Google Research: Build a safe, performant, compact, and compatible JPEG XL decoder in Rust, and we’ll ship it. That challenge was met; Google Research built jxl-rs, and it’s the core of our JPEG XL support in Firefox.

We also pushed for high quality integration tests as part of an Interop 2026 investigation area, and they’re coming along nicely.

Progressive rendering

Although Safari shipped JPEG XL in 2023, their implementation lacked some key features of JPEG XL – our favourite is progressive rendering, which is something we pushed for in the Rust implementation.

Progressive rendering means the image can render as it’s downloading.

An image of a fox curled up in a ball, sleeping amongst some grass, divided into four columns, showing JPEG XL progressive rendering. At 4% it's very blurry. At 15% you can tell it's a picture of a fox. At 50% the full image is clear, but not full resolution. At 100% it's full resolution.

Although the full image is 135 kB, with only a few kB downloaded the user can determine the subject of the image. Try the above demo image in a browser that supports JPEG XL & progressive rendering, like Firefox Nightly – move the slider to see how the image displays with just a portion downloaded.

JPEG XL vs AVIF

Browsers will now have two modern image formats for developers to choose from. Which you choose depends on your use-case.

  • JPEG XL: Excels at lossless imagery, progressive rendering, and further compressing JPEGs without quality loss.
  • AVIF: Excels at web-quality photographic images, and images that have a mix of sharp edges and flat surfaces.

For example:

A fox curled up in a ball, sleeping amongst some grass.

The image above is a 116 kB AVIF with a quality score (SSIMULACRA 2) of 62.8, meaning medium-high quality. To get the same quality, the JPEG XL image would be 134 kB.

At a SSIMULACRA 2 score of 80 (very high quality), the AVIF is 227 kB, and the JPEG XL is 264 kB.

But at lossless, the AVIF is 1.76 MB, and the JPEG XL is 1.45 MB. A lossless WebP is 1.55 MB.

Another example is a screenshot of the Interop 2025 scores:

Interop dashboard showing browser scores. At the top are two large circles: ‘Interop’ with a score of 95 in green, and ‘Investigations’ with a score of 36 in orange. Below are four browser scores in green circles: Chrome 99, Edge 98, Firefox 99, and Safari 98, each shown with their respective browser icons.

At a SSIMULACRA 2 score of 78 (very high quality), the AVIF is 11.6 kB, and the JPEG XL is 23.8 kB.

But at lossless, the AVIF is 164 kB, and the JPEG XL is 92 kB. A lossless WebP is 96 kB.

Although AVIF tends to produce smaller files at web-quality than JPEG XL, AVIF only has basic progressive rendering support. So, for very large images, it may be worth taking the filesize hit with JPEG XL.

The key is to test with a representative set of images for your site, at a quality that works best for your users, and remember to optimise for high density.

The post Intent to Ship: JPEG XL appeared first on Mozilla Hacks - the Web developer blog.

Read the whole story
alvinashcraft
10 hours ago
reply
Pennsylvania, USA
Share this story
Delete

How Postman Passport keeps API secrets inside your network

1 Share

Distributing API keys to every consumer that needs one is how most teams end up with secret sprawl. A single key gets copied into a shell profile, a .env file, a CI variable, and a shared password manager. Rotate it and something breaks. Revoke a person’s access and the key is still on their laptop somewhere.

Postman Passport takes a different approach. Instead of handing out the underlying secret, it hands out a credential reference: a token that points to a secret without containing it. The real key stays inside your own network, in your secret store. When a request goes through Passport, a proxy running inside your network resolves the reference, injects the actual credential, and forwards the request. The consumer never sees the key.

Postman Passport is available on Postman Enterprise plans with the Advanced Security Administration add-on. See the Postman pricing page for details.

In this post I’ll walk through the architecture: how credential references work, what happens on every request, the security properties Passport enforces, and how teams manage access through namespaces and roles. For the broader “why now” framing, the Postman Passport announcement post covers the product context.

What a credential reference actually is

A credential reference is a token that identifies a secret without containing it. When Passport grants a consumer access to an API, it issues the credential reference. The consumer places the reference into their request wherever the real secret would go. Whether that’s an Authorization header, a query parameter, or a body field, the reference behaves as a placeholder until the proxy resolves it.

References are cryptographically bound to the holder. If someone intercepts a reference in transit or copies it off a machine, it doesn’t work for them. The proxy checks the caller’s cryptographic identity before it resolves anything, and the private key that backs that identity never leaves the holder’s machine. A stolen reference without the matching key is inert.

That is the important shift. In a traditional API key model, possession of the key is authority. Anyone who gets the string can call the API. In the Passport model, the reference on its own has no authority. The authority is the cryptographic identity, and the reference is a pointer that only the identity’s holder can dereference.

The request flow

Here’s what happens when a consumer calls an API through Passport:

  1. The consumer sends a request with a credential reference in place of the real secret.
  2. The request routes through the secure access proxy running inside your network.
  3. The proxy authenticates the caller using a cryptographic certificate.
  4. The proxy checks whether the caller’s scope includes the referenced credential.
  5. If the check passes, the proxy resolves the secret from your secret store and injects it into the request.
  6. The proxy forwards the request to the destination and returns the response.

An example of what the consumer sees might look like this:

GET https://api.internal.example.com/v1/orders
Authorization: Bearer {{passport:cred_orders_read}}

That {{passport:cred_orders_read}} string is the credential reference. On the consumer’s machine, the Postman CLI sends the request through the local access proxy. The destination API sees a normal request with a real Authorization: Bearer <resolved-token> header. The consumer never had the resolved token.

The resolved secret never leaves the proxy. It doesn’t reach Postman, it doesn’t reach the application layer, and it doesn’t appear in any audit record.

The security model

Passport enforces several properties on every request. These are worth understanding because they shape how you reason about what Passport can and can’t protect against.

Identity is cryptographically proven. Each caller presents a certificate to the proxy, and the private key that backs the certificate stays on the caller’s machine. Identity can’t be forged. If a machine is compromised, that machine’s identity can be used from that machine, but identities can’t be lifted and reused elsewhere.

Scope is checked before resolution. The proxy verifies that the caller is authorized for the referenced credential before it contacts your secret store. If a caller tries to resolve a credential outside their scope, the proxy rejects the request without ever touching the store.

Secrets are resolved inside your network. The secure access proxy runs in the same private environment as your services. Secrets get read from your store, used to sign the outbound request, and then discarded. They don’t transit the Postman cloud, and they aren’t written to logs or audit records.

Passport uses your certificate authority as the trust root. Postman authorizes who can be issued a credential reference, but the certificates that prove caller identity are signed by your key. Team Admins can revoke access from your Private API Network at any time.

For teams in regulated industries like finance and healthcare, this design matters because it means secrets never cross an external network boundary. Third-party tools that terminate credentials outside your VPC are often disqualified by compliance policy. Passport keeps the resolution inside your network by design, which is one of the main reasons it fits into environments where other options don’t.

Team workflow: namespaces, managers, and members

Passport uses two roles inside a namespace to control who can add APIs and who can consume them.

Namespace Manager. Approves or denies workspace addition requests and API usage requests, and maps credential references to workspace environment variables. A Team Admin assigns this role.

Namespace Member. Can request to add a workspace so its APIs become available to others, or request access to an API they want to consume.

A typical setup flow looks like this:

  1. A Team Admin sets up the access proxy in Postman.
  2. The Team Admin creates a namespace and adds Namespace Managers and Namespace Members.
  3. A Namespace Member who produces an API requests to add their workspace to the namespace.
  4. A Namespace Manager approves the workspace request and maps credential references to the workspace’s environment variables.
  5. A Namespace Member who wants to consume an API requests access through the namespace.
  6. A Namespace Manager approves or denies each usage request.
  7. Approved Namespace Members connect to the access proxy from their machine using the Postman CLI.
  8. Approved Namespace Members send authenticated requests with their credential references.

Because access is granted per API and can be revoked at any time, you can offboard someone from a specific API without touching any other credential they hold. The reference stops resolving. There’s no key to rotate on the consumer side and no downstream distribution list to update.

Where Passport fits with your existing setup

Passport doesn’t replace your secret store. It sits in front of it. If you already use HashiCorp Vault, AWS Secrets Manager, Azure Key Vault, or 1Password, the proxy resolves references against your existing vault of record. Rotation policies, audit trails, and access policies inside your vault continue to apply. Passport adds a distribution layer that keeps consumers from ever seeing the resolved values.

The consumer-side integration is the Postman CLI. Namespace Members connect the CLI to the local access proxy once, then call APIs from collections that reference passport variables the same way they’d reference any Postman variable. If you’re already writing test scripts that read environment values with pm.environment.get, you don’t rewrite them for Passport. The reference gets resolved on the way through the proxy.

What this changes in practice

The part I keep coming back to is offboarding. In a static-key world, revoking access means rotating the key and updating everyone who legitimately still needs it. If you missed a copy of the key in someone’s dotfiles, you find out when your monitoring picks up a call from a laptop that shouldn’t have one. With credential references, revoking access is a database write in your Private API Network. There’s no lingering copy of a secret on a former user’s machine, because there was never a secret on their machine to begin with.

The other thing worth noting is that this model works the same way for AI agents as it does for people. An agent running against an API through Passport gets a credential reference bound to its identity, with a scope you approved. When the agent is done, its identity is revoked and every reference it held stops resolving. You don’t have to trust that an agent’s process cleaned up its memory or logs, because it never had the secret to clean up.

Try it out

If you’re on the Postman Enterprise plan with the Advanced Security Administration add-on, the natural place to start is registering an access proxy and setting up a namespace with one API you’d like to onboard. Pick something with a static bearer token that a handful of consumers use today, since that’s the case Passport was designed to replace first.

If you’re evaluating whether Passport fits your architecture, the questions I’d start with: which of your APIs currently distribute static keys to consumers, and what would offboarding one of those consumers look like today? The APIs where the honest answer is “we’d probably miss a copy on someone’s laptop” are the ones where Passport pays for itself first.

Resources

The post How Postman Passport keeps API secrets inside your network appeared first on Postman Blog.

Read the whole story
alvinashcraft
10 hours ago
reply
Pennsylvania, USA
Share this story
Delete
Next Page of Stories