Salesforce API Versioning and Deprecation Policy

Type: ERP Integration System: Salesforce Platform (API v31.0-v66.0) Confidence: 0.92 Sources: 7 Verified: 2026-03-01 Freshness: 2026-03-01

TL;DR

System Profile

This card covers the Salesforce Platform API versioning and deprecation lifecycle across all API surfaces — REST, SOAP, Bulk v1, Bulk 2.0, Metadata, Tooling, Connect, Streaming, and Pub/Sub. The policy applies uniformly to all Salesforce editions (Developer, Professional, Enterprise, Unlimited, Performance) though API call limits vary by edition. All Salesforce instances are cloud-hosted. [src1]

PropertyValue
VendorSalesforce
SystemSalesforce Platform (all cloud editions)
API SurfaceREST, SOAP, Bulk v1, Bulk 2.0, Metadata, Tooling, Connect, Streaming, Pub/Sub
Current API Versionv66.0 (Spring '26)
Editions CoveredDeveloper, Professional, Enterprise, Unlimited, Performance
DeploymentCloud
API DocsSalesforce REST API Developer Guide
StatusGA — versioning policy active and enforced

API Surfaces & Capabilities

All Salesforce API surfaces share the same version numbering scheme and deprecation policy. Each new platform release increments the version number by 1.0 across all surfaces simultaneously. [src1]

API SurfaceProtocolVersion in URL?Retirement Error CodeBulk?Notes
REST APIHTTPS/JSONYes (/services/data/v66.0/)410 GONENoPrimary integration surface
SOAP APIHTTPS/XMLYes (WSDL version)500 UNSUPPORTED_API_VERSIONNoLegacy; requires new WSDL per version
Bulk API v1HTTPS/CSV/XMLYes400 InvalidVersionYesBeing superseded by Bulk 2.0
Bulk API 2.0HTTPS/CSVYes400 InvalidVersionYesRecommended for bulk operations
Metadata APIHTTPS/XMLYes (WSDL version)500 UNSUPPORTED_API_VERSIONNoDeploy/retrieve metadata
Tooling APIHTTPS/JSONYes410 GONENoDevelopment tools and debugging
Connect APIHTTPS/JSONYes410 GONENoChatter, Communities, CMS
Streaming APIBayeux/CometDYesConnection refusedNoLegacy; consider Pub/Sub API
Pub/Sub APIgRPCNo (config)UNSUPPORTED_API_VERSIONNoModern event streaming

Version Numbering System

Salesforce releases 3 major platform updates per year, each incrementing the API version by 1.0. [src5]

Release Cadence

SeasonTypical Release MonthSandbox PreviewYear Convention
SpringJanuary-FebruaryPrevious DecemberSame calendar year (Spring '26 = early 2026)
SummerMay-JunePrevious AprilSame calendar year (Summer '26 = mid 2026)
WinterSeptember-OctoberPrevious AugustNext calendar year (Winter '26 = late 2025)

Important: The Winter release carries the year of the upcoming year. Winter '26 was released in September-October 2025, not 2026. [src5]

Version-to-Release Mapping (2017-2026)

ReleaseAPI VersionReleaseAPI VersionReleaseAPI Version
Summer '17v40.0Summer '20v49.0Summer '23v58.0
Winter '18v41.0Winter '21v50.0Winter '24v59.0
Spring '18v42.0Spring '21v51.0Spring '24v60.0
Summer '18v43.0Summer '21v52.0Summer '24v61.0
Winter '19v44.0Winter '22v53.0Winter '25v62.0
Spring '19v45.0Spring '22v54.0Spring '25v63.0
Summer '19v46.0Summer '22v55.0Summer '25v64.0
Winter '20v47.0Winter '23v56.0Winter '26v65.0
Spring '20v48.0Spring '23v57.0Spring '26v66.0

Deprecation Policy

The Official 3-Year / 1-Year Rule

Salesforce's API End-of-Life policy has two core guarantees: [src1]

  1. Minimum 3-year support: Each API version is supported for at least 3 years from its release date.
  2. 1-year deprecation notice: Customers actively using a version scheduled for retirement receive at least 1 year of advance notice.

Retirement Wave History

WaveVersions RetiredEnforcement DateNotice GivenAffected APIs
Wave 1v7.0-v20.0Summer '22 (June 2022)~1 yearREST, SOAP, Bulk v1
Wave 2v21.0-v30.0Summer '25 (June 2025)~1 yearREST, SOAP, Bulk v1, Metadata, Tooling, Connect, Tableau CRM
Wave 3 (projected)v31.0-v39.0Not yet announcedTBDExpected to follow same pattern

Pattern observation: Waves retire ~10 versions at a time, spaced approximately 3 years apart. If the pattern holds, v31.0-v39.0 retirement could be announced around 2027-2028 — but this is not confirmed by Salesforce. [src2]

What Happens When a Version Is Retired

API SurfaceHTTP StatusError CodeResponse
REST API410GONE[{"errorCode":"GONE","message":"This API version has been decommissioned..."}]
SOAP API500UNSUPPORTED_API_VERSIONSOAP fault with UNSUPPORTED_API_VERSION faultcode
Bulk API v1400InvalidVersionInvalidVersion error in XML response
Login API (SOAP)500UNSUPPORTED_API_VERSIONCannot authenticate — breaks entire integration

[src3]

Rate Limits & Quotas

Rate limits are not version-specific — they are org-wide and edition-dependent. However, version retirement effectively sets a rate limit of zero for retired versions. [src1]

Version-Related Limits

Limit TypeValueNotes
Minimum supported versionv31.0As of Summer '25; calls below this return errors
Versions available simultaneously~35v31.0-v66.0 as of Spring '26
New versions per year3Aligned with seasonal releases
Minimum support window3 yearsPer official policy
Deprecation notice period1 yearFor versions actively in use

Authentication

Authentication is version-aware — SOAP login uses versioned endpoints, while OAuth 2.0 token endpoints are version-independent. [src2]

FlowVersion ImpactNotes
OAuth 2.0 JWT BearerVersion-independent (/services/oauth2/token)Version only matters for subsequent API calls
OAuth 2.0 Web ServerVersion-independentPin API version in resource requests, not auth
SOAP LoginVersion-dependent (/services/Soap/u/{version}/)Retired version = cannot authenticate at all
Username-Password OAuthVersion-independentLegacy; not recommended

Authentication Gotchas

Constraints

Integration Pattern Decision Tree

START — User has a Salesforce integration and needs version guidance
|-- What is your current API version?
|   |-- v30.0 or below
|   |   |-- URGENT: Already retired as of Summer '25
|   |   |-- Action: Upgrade immediately to v59.0+
|   |   +-- Generate new WSDL if SOAP; update URL paths if REST
|   |-- v31.0-v39.0
|   |   |-- SAFE for now, but at risk in next retirement wave
|   |   |-- Action: Plan upgrade within 12 months
|   |   +-- Target: Latest GA version (v66.0 as of Spring '26)
|   |-- v40.0-v55.0
|   |   |-- Within support window but aging
|   |   |-- Action: Upgrade during next quarterly maintenance window
|   |   +-- Focus: Test for breaking changes in release notes
|   +-- v56.0+
|       |-- Current and fully supported
|       +-- Action: Monitor release notes for deprecation announcements
|
|-- How to manage versions going forward?
|   |-- Pin to specific version (recommended for stability)
|   |-- Always use latest (max feature access, 3x/year testing)
|   +-- Stay N versions behind (balanced approach)
|
+-- What API type?
    |-- REST/Bulk 2.0 -> Change version number in URL path
    |-- SOAP/Metadata -> Regenerate WSDL from current version
    |-- Bulk v1 -> Consider migrating to Bulk 2.0 (v41.0+)
    +-- Streaming -> Consider migrating to Pub/Sub API (v53.0+)

Quick Reference

Version Status Matrix (as of Spring '26)

Version RangeStatusRetirement DateAction Required
v7.0-v20.0RetiredSummer '22 (June 2022)Upgrade immediately — calls fail with errors
v21.0-v30.0RetiredSummer '25 (June 2025)Upgrade immediately — calls fail with errors
v31.0-v39.0Supported (aging)Not yet announcedPlan upgrade within 12 months
v40.0-v55.0SupportedNot yet announcedMonitor deprecation notices
v56.0-v66.0Supported (current)3+ years from nowNo action needed

[src1, src2, src6]

Key Version Milestones

API VersionReleaseMilestone Feature
v34.0Summer '15Composite API introduced
v41.0Winter '18Bulk API 2.0 introduced
v43.0Summer '18Change Data Capture (CDC)
v45.0Spring '19Lightning Web Components (LWC) GA
v47.0Winter '20Einstein Prediction Builder API
v53.0Winter '22Pub/Sub API introduced
v55.0Summer '22Wave 1 retirement enforced (v7.0-v20.0)
v59.0Winter '24Recommended minimum for new integrations
v62.0Winter '25Retirement enforcement toggle GA
v64.0Summer '25Wave 2 retirement enforced (v21.0-v30.0)
v66.0Spring '26Current latest version

[src5, src6]

Step-by-Step Version Upgrade Guide

1. Identify your current API version

Query your Salesforce org to see all available API versions. [src1]

# List all supported API versions for your org
curl https://YOUR_INSTANCE.salesforce.com/services/data/ \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Verify: Response contains an array of version objects with version, label, and url fields.

2. Audit integrations using deprecated versions

Use Event Log File Browser or API Total Usage to find integrations on old versions. [src3]

# Query API Total Usage event logs via REST
curl "https://YOUR_INSTANCE.salesforce.com/services/data/v66.0/query?q=SELECT+LogFile+FROM+EventLogFile+WHERE+EventType='ApiTotalUsage'+AND+CreatedDate=TODAY" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Verify: CSV file downloaded. Filter API_VERSION column for versions <= 30.0.

3. Test retirement enforcement in sandbox

Enable voluntary retirement enforcement to identify affected integrations before production. [src3]

Setup > Search "API Version" > Enable "Retirement Enforcement"
This makes deprecated API calls fail immediately in sandbox.

Verify: API calls to retired versions return 410 GONE in sandbox.

4. Update API version in integrations

For each identified integration, update the version reference. [src4]

# REST API: Change version in URL path
# OLD: /services/data/v28.0/sobjects/Account
# NEW: /services/data/v66.0/sobjects/Account

# SOAP API: Regenerate WSDL from Setup > API > Generate WSDL

# Bulk API: Update version in job creation endpoint
# Recommend migrating to Bulk 2.0:
# NEW: /services/data/v66.0/jobs/ingest

Verify: Integration requests return 200 OK with expected data.

5. Regression test for breaking changes

Check release notes for behavioral changes between your old and new version. [src7]

# Test key operations against new version in sandbox
# 1. Authentication
curl -X POST https://YOUR_INSTANCE.salesforce.com/services/oauth2/token \
  -d "grant_type=password&client_id=...&client_secret=...&username=...&password=..."

# 2. Query a known record
curl "https://YOUR_INSTANCE.salesforce.com/services/data/v66.0/query?q=SELECT+Id,Name+FROM+Account+LIMIT+1" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

# 3. Create a test record
curl -X POST "https://YOUR_INSTANCE.salesforce.com/services/data/v66.0/sobjects/Account" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"Name":"API Version Test"}'

Verify: All operations return expected results. Compare response schemas between old and new versions.

Code Examples

Python: Check API version support and audit usage

# Input:  Salesforce access token and instance URL
# Output: List of supported API versions and deprecated version usage

import requests

def check_api_versions(instance_url, access_token):
    """List all supported API versions for the org."""
    headers = {"Authorization": f"Bearer {access_token}"}
    resp = requests.get(f"{instance_url}/services/data/", headers=headers)
    resp.raise_for_status()
    versions = resp.json()

    min_version = float(versions[0]["version"])
    max_version = float(versions[-1]["version"])
    print(f"Supported range: v{min_version} - v{max_version}")
    print(f"Total supported versions: {len(versions)}")
    return versions

def find_deprecated_usage(instance_url, access_token, min_safe="31.0"):
    """Query event logs for API calls using deprecated versions."""
    headers = {"Authorization": f"Bearer {access_token}"}
    soql = (
        "SELECT LogFile FROM EventLogFile "
        "WHERE EventType='ApiTotalUsage' "
        "AND CreatedDate=LAST_N_DAYS:7"
    )
    resp = requests.get(
        f"{instance_url}/services/data/v66.0/query",
        params={"q": soql},
        headers=headers
    )
    resp.raise_for_status()
    for record in resp.json().get("records", []):
        log_url = f"{instance_url}{record['LogFile']}"
        log_resp = requests.get(log_url, headers=headers)
        print(f"Log file: {log_url}")

JavaScript/Node.js: Version-aware API client

// Input:  Salesforce credentials, target API version
// Output: API client that validates version before making calls

// npm install [email protected]
const jsforce = require('jsforce');

const MINIMUM_SAFE_VERSION = 31;
const RECOMMENDED_VERSION = 66;

async function createVersionAwareClient(loginUrl, username, password) {
  const conn = new jsforce.Connection({
    loginUrl,
    version: `${RECOMMENDED_VERSION}.0`
  });

  await conn.login(username, password);

  // Verify the version is supported
  const versions = await conn.request('/services/data/');
  const supported = versions.map(v => parseFloat(v.version));
  const min = Math.min(...supported);
  const max = Math.max(...supported);

  console.log(`Org supports: v${min} - v${max}`);
  console.log(`Client using: v${RECOMMENDED_VERSION}.0`);

  if (RECOMMENDED_VERSION < min || RECOMMENDED_VERSION > max) {
    throw new Error(`Version ${RECOMMENDED_VERSION}.0 not supported`);
  }

  return conn;
}

cURL: Quick version check

# Input:  Instance URL and access token
# Output: List of all supported API versions

# Check supported versions (no version number needed in URL)
curl -s https://YOUR_INSTANCE.salesforce.com/services/data/ \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" | python3 -m json.tool

# Test if a specific version is still supported
curl -s -o /dev/null -w "%{http_code}" \
  "https://YOUR_INSTANCE.salesforce.com/services/data/v31.0/sobjects/" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
# 200 = supported, 410 = retired

# Check API usage limits (version-independent)
curl -s https://YOUR_INSTANCE.salesforce.com/services/data/v66.0/limits/ \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" | python3 -m json.tool

Error Handling & Failure Points

Common Error Codes

CodeAPIMeaningCauseResolution
410 GONEREST, Tooling, ConnectVersion retiredAPI version below minimumUpgrade to v31.0+ (recommended: v59.0+)
500 UNSUPPORTED_API_VERSIONSOAP, MetadataVersion retiredWSDL from retired versionRegenerate WSDL from current version
400 InvalidVersionBulk v1, Bulk 2.0Version retired or invalidRetired version in job URLUpdate version in job creation endpoint
400 Bad RequestRESTInvalid version formatMalformed version stringAlways use vNN.0 format with decimal

[src1, src3]

Failure Points in Production

Anti-Patterns

Wrong: Hardcoding the latest API version and forgetting about it

# BAD -- version will eventually be retired, breaking the integration
SALESFORCE_API_VERSION = "v55.0"  # Set once in 2022, never updated
BASE_URL = f"https://myorg.salesforce.com/services/data/{SALESFORCE_API_VERSION}"

Correct: Centralized version configuration with monitoring

# GOOD -- single config point, easy to update, with deprecation checking
import os

SALESFORCE_API_VERSION = os.environ.get("SF_API_VERSION", "v66.0")
BASE_URL = f"https://myorg.salesforce.com/services/data/{SALESFORCE_API_VERSION}"

def check_version_health(instance_url, token):
    """Run at startup to warn about approaching deprecation."""
    versions = requests.get(f"{instance_url}/services/data/",
                           headers={"Authorization": f"Bearer {token}"}).json()
    supported = [v["version"] for v in versions]
    current = SALESFORCE_API_VERSION.replace("v", "")
    if current not in supported:
        raise RuntimeError(f"API version {current} is no longer supported!")
    idx = supported.index(current)
    if idx < len(supported) * 0.2:  # Bottom 20% of supported range
        print(f"WARNING: Version {current} is aging. Consider upgrading.")

Wrong: Using different API versions across integration endpoints

// BAD -- mixing versions causes inconsistent behavior
const accountUrl = '/services/data/v50.0/sobjects/Account';
const contactUrl = '/services/data/v55.0/sobjects/Contact';
const queryUrl = '/services/data/v62.0/query';

Correct: Single version constant used everywhere

// GOOD -- one version, one upgrade path, consistent behavior
const SF_API_VERSION = 'v66.0';
const accountUrl = `/services/data/${SF_API_VERSION}/sobjects/Account`;
const contactUrl = `/services/data/${SF_API_VERSION}/sobjects/Contact`;
const queryUrl = `/services/data/${SF_API_VERSION}/query`;

Wrong: Skipping regression testing when upgrading versions

# BAD -- blindly changing version number without testing
sed -i 's/v50.0/v66.0/g' src/salesforce-client.js
git commit -m "Upgrade SF API version"
git push origin main  # Deploy to production untested

Correct: Systematic version upgrade with sandbox testing

# GOOD -- test in sandbox with retirement enforcement enabled
# 1. Update version in feature branch
sed -i 's/v50.0/v66.0/g' src/salesforce-client.js
# 2. Deploy to sandbox
npm run deploy:sandbox
# 3. Run integration test suite
SF_INSTANCE=sandbox npm run test:integration
# 4. Enable retirement enforcement in sandbox
# 5. Run tests again with enforcement enabled
# 6. Review release notes for behavioral changes
# 7. Only then merge and deploy to production

Common Pitfalls

Diagnostic Commands

# Check all supported API versions for your org
curl -s https://YOUR_INSTANCE.salesforce.com/services/data/ \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

# Test if a specific version is supported (200 = yes, 410 = retired)
curl -s -o /dev/null -w "%{http_code}" \
  "https://YOUR_INSTANCE.salesforce.com/services/data/v31.0/" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

# Check current API limits (use latest version)
curl -s "https://YOUR_INSTANCE.salesforce.com/services/data/v66.0/limits/" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

# Query event logs for deprecated version usage (last 7 days)
curl -s "https://YOUR_INSTANCE.salesforce.com/services/data/v66.0/query?q=SELECT+LogFile,EventType+FROM+EventLogFile+WHERE+EventType='ApiTotalUsage'+AND+CreatedDate=LAST_N_DAYS:7" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

# Check Apex classes for hardcoded API versions
# SOQL: SELECT Name, ApiVersion FROM ApexClass WHERE ApiVersion < 31

# Check installed package API versions
curl -s "https://YOUR_INSTANCE.salesforce.com/services/data/v66.0/tooling/query?q=SELECT+Name,ApiVersion+FROM+ApexClass+WHERE+NamespacePrefix!=null+AND+ApiVersion<31" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Version History & Compatibility

API VersionReleaseStatus (Mar 2026)Breaking ChangesMigration Notes
v66.0Spring '26CurrentNone yetLatest recommended version
v65.0Winter '26SupportedSOAP login() removed for some contextsCheck login endpoint
v64.0Summer '25Supportedv21.0-v30.0 retiredWave 2 retirement enforced
v62.0Winter '25SupportedRetirement enforcement toggle GAUse for testing deprecation
v59.0Winter '24SupportedNone significantRecommended minimum for new integrations
v55.0Summer '22Supportedv7.0-v20.0 retiredWave 1 retirement enforced
v41.0Winter '18Supported (aging)Bulk API 2.0 introducedConsider Bulk 2.0 migration
v31.0Spring '14Supported (oldest)NoneCurrent minimum — next wave candidate
v30.0Spring '14Retired-Retired Summer '25 — upgrade to v31.0+
v20.0Winter '11Retired-Retired Summer '22 — upgrade to v31.0+

[src1, src2, src5, src6]

When to Use / When Not to Use

Use WhenDon't Use WhenUse Instead
Planning an API version upgrade or migrationNeed rate limits or integration patterns for a specific APISalesforce REST API capabilities card
Checking if your current API version is still supportedNeed authentication flow detailsSalesforce authentication card
Understanding the retirement timelineNeed help with a non-Salesforce ERP's versioningThat ERP's versioning card
Auditing AppExchange packages for deprecated versionsNeed Bulk API migration guidanceSalesforce Bulk API card
Setting up CI/CD pipeline version validationNeed Salesforce licensing/edition comparisonSalesforce edition comparison card

Important Caveats

Related Units