Skip to main content

API Versioning

How we handle API versions, backward compatibility, and changes.


Current Versionโ€‹

PropertyValue
API Version2.8.0
StatusStable
Base URLhttps://api.web3identity.com

Versioning Strategyโ€‹

Semantic Versioningโ€‹

We follow Semantic Versioning (SemVer):

MAJOR.MINOR.PATCH
โ”‚ โ”‚ โ””โ”€โ”€ Bug fixes, no breaking changes
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ New features, backward compatible
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Breaking changes

Current: v2.8.0

  • 2 = Major version (breaking changes from v1)
  • 8 = Minor version (new features added)
  • 0 = Patch version (bug fixes)

Version in Responsesโ€‹

Every response includes the API version:

X-API-Version: 2.8.0
const res = await fetch('https://api.web3identity.com/api/health');
console.log(res.headers.get('X-API-Version')); // "2.8.0"

Stability Commitmentโ€‹

What We Promiseโ€‹

CategoryCommitment
Endpoint URLsWon't change without major version bump
Response fieldsExisting fields won't be removed
Error codesError codes remain stable
Free tier100 calls/day minimum guaranteed

What May Changeโ€‹

CategoryType of Change
New fieldsAdded to responses (non-breaking)
New endpointsAdded regularly
PerformanceResponse times may improve
New error codesAdditional error types may be added

No URL Versioningโ€‹

We chose not to include versions in URLs:

โœ… https://api.web3identity.com/api/ens/vitalik.eth
โŒ https://api.web3identity.com/v2/api/ens/vitalik.eth

Why:

  • Simpler URLs
  • Easier to use and remember
  • No need to update URLs when upgrading
  • Breaking changes are rare

Deprecation Policyโ€‹

When we need to make breaking changes:

Timelineโ€‹

PhaseDurationWhat Happens
AnnouncementDay 0Blog post, changelog, email
Deprecation30 daysOld behavior works, warnings in response
Migration60 daysBoth old and new work
Removal90 daysOld behavior removed

Deprecation Warningsโ€‹

Deprecated features include a warning header:

X-Deprecation-Warning: This endpoint will be removed on 2026-05-01. Use /api/v2/new-endpoint instead.
const res = await fetch(url);
const warning = res.headers.get('X-Deprecation-Warning');
if (warning) {
console.warn('API Deprecation:', warning);
}

Breaking vs Non-Breaking Changesโ€‹

Non-Breaking (Safe)โ€‹

These changes don't require action:

// Adding new fields to responses
// Before
{ "name": "vitalik.eth", "address": "0x..." }

// After (new field added - non-breaking)
{ "name": "vitalik.eth", "address": "0x...", "avatar": "https://..." }

Your code still works โ€” just ignore fields you don't need.

Breaking (Requires Action)โ€‹

These changes require updating your code:

// Removing a field
// Before
{ "name": "vitalik.eth", "owner": "0x..." }

// After (field removed - BREAKING)
{ "name": "vitalik.eth" } // 'owner' gone!

// Changing field type
// Before
{ "balance": "1000000000000000000" } // string

// After (type changed - BREAKING)
{ "balance": 1000000000000000000 } // number

Migration Guideโ€‹

Handling New Fieldsโ€‹

// โœ… Safe: Use optional chaining
const avatar = profile.avatar ?? null;
const twitter = profile.records?.['com.twitter'] ?? '';

// โœ… Safe: Destructure with defaults
const { name, address, avatar = null } = profile;

Handling Deprecationsโ€‹

// โœ… Check for deprecation warnings
async function fetchWithDeprecationCheck(url) {
const res = await fetch(url);

const warning = res.headers.get('X-Deprecation-Warning');
if (warning) {
// Log for your team to address
console.warn(`[DEPRECATION] ${url}: ${warning}`);

// Optionally send to monitoring
sendToMonitoring('api_deprecation', { url, warning });
}

return res.json();
}

Changelogโ€‹

Track all changes in our Changelog.

Recent Changesโ€‹

VersionDateTypeDescription
2.8.02026-02-08FeatureFull modularization, 966 endpoints
2.7.02026-02-08FeatureCache warming, analytics
2.6.02026-02-08FeatureSmart-fetch with fallbacks
2.5.02026-02-07Feature1000+ endpoints milestone

SDK Version Compatibilityโ€‹

SDK VersionAPI VersionStatus
1.1.x2.xโœ… Compatible
1.0.x2.xโœ… Compatible

The SDK handles version differences automatically:

import { ATVClient } from '@atv-eth/x402-sdk';

const client = new ATVClient();
// SDK automatically adapts to API version

Questions?โ€‹