Enterprise Dreamin'
Data Security← All Articles

Winter '27 Breaks Integration Logins Twice. The Dates Are 1 December and 20 February.

Winter '27 enforces profile filtering on your upgrade weekend and requires the Use Any API Auth permission for SOAP login() from 1 December 2026. The OAuth username-password flow retires on 20 February 2027 and SOAP login() itself in Summer '27. What each change breaks, why most of it fails silently, and the three checks that find your exposure in an afternoon.

By Enterprise Dreamin'

9 min read
Winter '27 Breaks Integration Logins Twice. The Dates Are 1 December and 20 February.. Editorial illustration for Enterprise Dreamin'.
Winter '27 Breaks Integration Logins Twice. The Dates Are 1 December and 20 February.. Editorial illustration for Enterprise Dreamin'.

Winter '27 is half deployed. The first production wave went out on 29 August, and the two remaining waves land on the weekends of 2 to 3 October and 9 to 10 October 2026, which is where most orgs sit. The release notes have been public since 19 August, and the coverage so far has mostly been feature lists.

The part that will generate incident tickets is not a feature. It is a set of four authentication and permission changes, two enforced on upgrade weekend and two with fixed calendar dates afterwards, that mostly affect integration users nobody has looked at in years. This piece is the timeline, what each one breaks, and how to find your exposure before it finds you.

What actually changes for integration users in Winter '27?

Two release updates are enforced when your org upgrades: Enable Profile Filtering, which stops most users from reading other users' profile names, and Assign Use Any API Auth Permission for SOAP login(), which ships with the release but is enforced on a fixed date, 1 December 2026, across every org regardless of upgrade wave.

Two more changes were moved out of Winter '27 and given dates of their own. The retirement of the OAuth 2.0 username-password flow for connected apps is now 20 February 2027. The retirement of the SOAP API login() call itself, in API versions 31.0 through 64.0, is Summer '27. A fifth, the instanced URL update, has been postponed again to Spring '27.

Read together, this is a nine-month schedule for removing password-based authentication from the platform. Each date takes away one way an integration can log in with a username and password.

ChangeTypeEffectiveWhat stops working
Enable Profile FilteringRelease update, enforcedYour Winter '27 upgrade date (29 Aug, 2 to 3 Oct, 9 to 10 Oct 2026)Apex, Flow and validation logic that reads another user's Profile.Name returns empty
Use Any API Auth for SOAP login()Release update, enforced1 December 2026, all orgsSOAP login() calls from any user without the permission
OAuth 2.0 username-password flowRetirement20 February 2027 (was Winter '27)Connected apps posting grant_type=password
SOAP login() in API 31.0 to 64.0RetirementSummer '27 (already absent from 65.0 and later)The login() call in those versions, permission or not
Update Instanced URLs in API TrafficRelease updateSpring '27 (third postponement)API calls to na139.salesforce.com-style hostnames

Dates for the two release updates come from the Winter '27 release notes and the Release Updates node in Setup. Your exact upgrade date is on Salesforce Trust, and it is worth checking rather than assuming, because the waves are by instance, not by region.

Which integrations stop authenticating on 1 December?

Any integration that authenticates with the SOAP API login() call, using a user that does not hold the Use Any API Auth permission. From 1 December 2026 the call returns INSUFFICIENT_ACCESS: SOAP API login() requires the Use Any API Auth user permission and nothing else happens. There is no notification to an admin, because server-to-server authentication has no user interface to put one in.

The permission is a standard user permission, API name PermissionsUseAnyApiAuth, available on both profiles and permission sets. System Administrator has it. The users most likely not to have it are the ones you built carefully: integration users on a cut-down profile, cloned years ago, with exactly the object access the job needed and nothing more. Least privilege was the right call and it is now the exposure.

One thing to get right, because a good share of the published coverage gets it wrong: Use Any API Auth is not Use Any API Client. Use Any API Client belongs to API Access Control and governs whether a user can self-authorise a connected app. Granting it does nothing for SOAP login(). If you assign the wrong one in October and test in November, you will find out on 1 December.

The Winter '27 release update includes a test option in Setup, so you can enforce it early in a sandbox and watch what fails. For the enforcement date itself, our reading of the release note is that 1 December applies to all orgs regardless of when they upgraded, which means an org upgraded on 10 October has seven weeks, not none.

What typically calls SOAP login()? Older Data Loader builds configured with username, password and security token. ETL and middleware connectors set up the same way before OAuth became the default. Custom code that was written against the Partner or Enterprise WSDL and never revisited. Some reporting and BI connectors. The pattern is age: login() is already absent from API version 65.0 and later, so anything pinned to a current API version cannot be calling it, and anything that can is at least two years old.

Why will profile filtering break logic without an error?

Because it returns empty rather than failing. After the upgrade, a user without one of the eight bypass permissions sees only their own profile name. The primary bypass is View All Profiles; the others (Manage Users, Customize Application, Manage Profiles and Permission Sets, and four Experience Cloud administration permissions) bypass it as a side effect.

Logic that reads the running user's own profile, such as $Profile.Name in a formula or Flow, is unaffected. Logic that reads someone else's profile is not. A Flow that looks up Owner.Profile.Name to decide a routing path gets a blank and takes the default branch. A validation rule that checks the approver's profile passes or fails on an empty string. An Apex query for Profile.Name on another user, particularly in user mode, comes back with no rows. List views and reports that show other users' profile names go blank in that column.

None of this throws. That is what makes it expensive: the failure mode is a decision going the wrong way, quietly, for weeks. Profile filtering has been available to switch on since Summer '26, so orgs that enabled it early have already seen what breaks. If yours did not, the sandbox preview is the only place to look before production.

The remediation Salesforce recommends is to assign View All Profiles where the role genuinely needs it. The better remediation, for most of these cases, is to stop branching on profile names. Profile-name logic is one of the oldest forms of security debt in a Salesforce org, and this release update is the first time the platform has actively punished it. We covered the general shape of that debt in the security debt hiding in your Salesforce org; this is a specific instance with a date.

What moved out of Winter '27, and why that is not a reprieve

The OAuth 2.0 username-password flow retirement was scheduled for Winter '27 and has been moved to 20 February 2027. When enforced, any connected app integration that posts grant_type=password to the token endpoint stops receiving tokens. The migration paths Salesforce names are the web-server flow (with PKCE) for anything with a browser, and the client-credentials flow or JWT bearer flow for server-to-server work.

Two details make this less of a reprieve than it looks. First, orgs created in Summer '26 or later already cannot use the username-password flow; the retirement is only a deferral for existing orgs. Second, the deferral moved the date by roughly four months, into a period when most teams are closing a financial year and the release after it, Spring '27, is already in sandbox preview. February is not far.

The SOAP login() retirement in Summer '27 is the end of the road for the first change above. Once it lands, the Use Any API Auth permission no longer preserves anything; the call is gone in versions 31.0 through 64.0. The permission is a bridge, and the bridge is nine months long. Salesforce's stated destination is External Client Apps with OAuth, which is a larger migration than adding a permission and is the reason to start with the inventory now rather than in May.

How do you find the exposure in an afternoon?

Three checks cover the four changes.

1. Find every SOAP login() user. Setup, then Login History, then export. SOAP login() calls appear with a Login Type of Other Apex API or Partner Product and a Login Subtype of SOAP API; filter on those and group by username. Setup shows around six months, so a quarterly job that last ran in April will not appear; ask each integration owner about anything that runs less often than monthly. If you prefer SOQL, LoginHistory supports grouping on UserId, Application and Status over LoginTime = LAST_N_DAYS:90, but several of the descriptive fields are groupable and not filterable, so filter the result set rather than the WHERE clause. A shortcut to the same list: the Summer '27 retirement has its own release update with a test run that disables login() in a sandbox, and whatever breaks is your inventory.

2. Find who already holds the permission. SELECT Id, Name FROM Profile WHERE PermissionsUseAnyApiAuth = true and SELECT AssigneeId, Assignee.Username FROM PermissionSetAssignment WHERE PermissionSet.PermissionsUseAnyApiAuth = true. Subtract this from the list in step 1. What is left breaks on 1 December.

3. Inventory profile-name branching. Search Flows, validation rules, Apex and formula fields for Profile.Name, Profile.Id and $Profile. Anything referencing the running user is fine. Anything referencing another user's profile, through Owner, CreatedBy, LastModifiedBy, an approver or a lookup, needs either View All Profiles on the users who trigger it or, better, a rewrite against a custom permission or permission set group.

Then, separately, list every connected app whose consumer posts grant_type=password. This one does not appear in Login History as SOAP; it appears as an OAuth login. Connected app owners usually know. Where they do not, the Connected Apps OAuth Usage page in Setup shows which apps have active tokens, and the app's own configuration will show the flow.

What to decide before your upgrade weekend

The four changes share one root cause. Integration users were set up once, with a password, on a narrow profile, and then left alone because they worked. Salesforce is now removing every one of the mechanisms that let that pattern keep working.

That is the same least-privilege problem we described for agents in the agent action surface piece: identities that act without a human present, with permissions nobody reviews because nothing forces a review. Winter '27 forces one for integration users. Treat it as the review, not as a permission to add.

Concretely, the decisions are these. Whether each SOAP login() integration gets the permission as a bridge or gets migrated to OAuth directly, given the bridge expires in Summer '27. Whether profile-name logic gets View All Profiles or gets rewritten, given that View All Profiles is a broad grant on a permission that exists to make profiles less visible. And who owns each integration user, because the honest answer in many orgs is that nobody currently does, and the retirement dates are going to ask.

If your org upgrades on 9 or 10 October, the Release Updates node in Setup will let you enforce both updates in a sandbox now. That is a week of testing you can have for free, and the only week in which a blank profile name is a finding rather than an incident.

What this does not change

It does not change REST API authentication, and it does not retire the SOAP API. Only the login() call is affected, and only in the named versions; SOAP calls authenticated with an OAuth token continue. It does not change how the running user's own profile is read, so $Profile.Name in formulas and Flows keeps working. It does not affect integrations already on the web-server, client-credentials or JWT bearer flows, which is most of anything built in the last three years. And it does not, on its own, remove the need for the migration to External Client Apps that Salesforce has signalled for Summer '27; it schedules it.

The Winter '27 auto-enable of Agentforce has had most of the attention in this release. The authentication changes will generate more support cases. Both are worth a look before your date.

*Release update details are drawn from the Winter '27 release notes (published 19 August 2026), the Salesforce Help release update pages for Use Any API Auth, Profile Filtering and the OAuth username-password flow retirement, and practitioner analysis by Software Insights and Apex Hours. Production upgrade dates vary by instance; confirm yours on Salesforce Trust. Third-party sources give 1 June 2027 for the SOAP login() retirement; Salesforce's release note says Summer '27, and we have used that. A separate release update on email change verification exceptions, dated 1 December 2026, is reported by one source and not independently confirmed here. Enterprise Dreamin' has no commercial relationship with Salesforce.*

Key Takeaways
  • 1

    Two Winter '27 release updates are enforced: Enable Profile Filtering on your upgrade date (remaining waves 2 to 3 and 9 to 10 October 2026), and Use Any API Auth for SOAP login() on 1 December 2026 across all orgs.

  • 2

    From 1 December, SOAP login() from any user without Use Any API Auth fails with INSUFFICIENT_ACCESS and no admin notification. Integration users on narrow, cloned profiles are the most exposed.

  • 3

    Use Any API Auth is not Use Any API Client. The second belongs to API Access Control and does nothing for SOAP login(). Several published guides conflate them.

  • 4

    Profile filtering returns empty, not an error. Flows, validation rules and Apex that read another user's Profile.Name take the wrong branch silently; the running user's own $Profile.Name is unaffected.

  • 5

    The OAuth 2.0 username-password flow retirement moved from Winter '27 to 20 February 2027, but orgs created in Summer '26 or later are already blocked from using it.

  • 6

    SOAP login() in API versions 31.0 to 64.0 retires in Summer '27, so the Use Any API Auth permission is a nine-month bridge, not a fix. The destination is OAuth via External Client Apps.

Frequently Asked Questions

From 1 December 2026, in all orgs, regardless of which Winter '27 upgrade wave your instance was in. The release update ships with Winter '27 and can be tested early through the Release Updates node in Setup. After 1 December, a SOAP login() call from a user without the permission returns INSUFFICIENT_ACCESS: SOAP API login() requires the Use Any API Auth user permission.

Use Any API Auth (API name PermissionsUseAnyApiAuth) controls whether a user can authenticate with the SOAP API login() call. Use Any API Client is part of API Access Control and governs whether a user can self-authorise a connected app. They are separate permissions; granting Use Any API Client does not satisfy the Winter '27 SOAP login() requirement.

Any logic that reads a profile other than the running user's. After the upgrade, users without View All Profiles or one of seven other bypass permissions see only their own profile name, so a Flow reading Owner.Profile.Name, a validation rule checking an approver's profile, or Apex querying Profile.Name on another user gets an empty value rather than an error. Formulas and Flows that use $Profile.Name for the running user are unaffected.

On 20 February 2027, moved from the original Winter '27 date. From then, connected apps that post grant_type=password to the token endpoint stop receiving tokens. Orgs created in Summer '26 or later already cannot use the flow. Salesforce recommends the OAuth 2.0 web-server flow or client credentials flow instead; the JWT bearer flow is the usual choice for unattended server-to-server integrations.

No. Only the SOAP API login() call is being retired, in API versions 31.0 through 64.0, in Summer '27. SOAP calls that authenticate with an OAuth access token continue to work. The practical effect is that integrations using username and password to obtain a session ID need to move to an OAuth flow, which Salesforce is steering towards External Client Apps.

Export Login History from Setup and filter for Login Type Other Apex API or Partner Product with Login Subtype SOAP API, grouped by username. Setup shows around six months, so ask integration owners about jobs that run less often than monthly. Then query Profile and PermissionSetAssignment for PermissionsUseAnyApiAuth = true and subtract; the remainder fails on 1 December 2026. The Summer '27 retirement release update also has a sandbox test run that disables login() outright.

Subscribe

One email a week. Practitioner analysis, no vendor spin.

The Weekly Brief — sessions and essays from senior Salesforce practitioners working through AI, security, and architecture in production.

The Weekly Brief

One email each Friday. The sharpest analysis on Salesforce, AI, and enterprise architecture — written for senior practitioners.

No spam. Unsubscribe anytime.