Skip to content

Migration Guide: Promotion API Deprecation (v2.4)

⚠️ CRITICAL: Wildberries is deprecating standard bid campaign methods (type 8) on February 2, 2026.


Overview

Wildberries is transitioning from standard bid campaigns (type 8) to campaigns with custom and standard bids (type 9). Four API methods will be disabled on February 2, 2026.

Source: Wildberries Release Notes #429


Quick Start: How to Migrate in 3 Steps

Step 1: Identify Type 8 Campaigns (2 minutes)

Run this script to find all type 8 campaigns in your account:

typescript
import { WildberriesSDK } from 'daytona-wildberries-typescript-sdk';

const sdk = new WildberriesSDK({ apiKey: process.env.WB_API_KEY! });

async function findType8Campaigns() {
  const campaigns = await sdk.promotion.getPromotionCount();

  const type8 = campaigns.adverts?.filter(advert => advert.type === 8) || [];
  const type9 = campaigns.adverts?.filter(advert => advert.type === 9) || [];

  console.log(`\n📊 Campaign Analysis:`);
  console.log(`✅ Type 9 campaigns (safe): ${type9.length}`);
  console.log(`⚠️  Type 8 campaigns (need migration): ${type8.length}\n`);

  if (type8.length > 0) {
    console.log('Type 8 campaigns that need migration:');
    type8.forEach(camp => {
      console.log(`  - Campaign ID ${camp.advertId}: ${camp.name || 'Unnamed'}`);
    });
    console.log(`\n⏰ Deadline: February 2, 2026\n`);
  } else {
    console.log('✅ All your campaigns are already type 9. No migration needed!');
  }

  return type8;
}

// Run the check
findType8Campaigns();

Step 2: Update Your Code (10-30 minutes)

Replace deprecated methods in your codebase:

bash
# Search for deprecated methods in your project
grep -r "getAutoGetnmtoadd\|createAutoUpdatenm\|getAutoStatWords\|createAutoSetExcluded" ./src

Quick replacement guide:

Deprecated MethodReplace WithTime Required
getAutoGetnmtoadd()getAuctionAdverts()2 min
createAutoUpdatenm()updateAuctionNm()5 min
getAutoStatWords()getAdvFullstats()10 min
createAutoSetExcluded()Type 9 campaign creation15 min

Step 3: Test and Deploy (15 minutes)

typescript
// Test your migrated code
async function testMigration() {
  const sdk = new WildberriesSDK({ apiKey: process.env.WB_API_KEY! });

  // ✅ Test: Fetch campaign info (replaces getAutoGetnmtoadd)
  const campaigns = await sdk.promotion.getAuctionAdverts({
    id: [your_campaign_id]
  });
  console.log('✅ Campaign fetch works:', campaigns.adverts?.[0]?.name);

  // ✅ Test: Update products (replaces createAutoUpdatenm)
  await sdk.promotion.updateAuctionNm({
    nms: [{
      advert_id: your_campaign_id,
      nms: { add: [product_id_to_add] }
    }]
  });
  console.log('✅ Product update works');

  // ✅ Test: Get statistics (replaces getAutoStatWords)
  const stats = await sdk.promotion.getAdvFullstats({
    ids: String(your_campaign_id),
    beginDate: '2026-01-01',
    endDate: '2026-01-31'
  });
  console.log('✅ Statistics fetch works:', stats);
}

Total migration time: 30-60 minutes for most projects.


Deprecated Methods

1. getAutoGetnmtoadd() - List of Product Cards

Endpoint: GET /adv/v1/auto/getnmtoaddDeprecation Date: February 2, 2026 Affected: Standard bid campaigns (type 8)

Migration Path:

typescript
// ❌ DEPRECATED (will stop working Feb 2, 2026)
const cards = await sdk.promotion.getAutoGetnmtoadd({ id: campaignId });

// ✅ RECOMMENDED: Use type 9 campaigns
// 1. Get campaign information
const campaigns = await sdk.promotion.getAuctionAdverts({ id: [campaignId] });

// 2. View products in campaign (included in campaign details)
const campaign = campaigns.adverts?.[0];
console.log('Products:', campaign.nms);

2. createAutoUpdatenm() - Update Product Cards

Endpoint: POST /adv/v1/auto/updatenmDeprecation Date: February 2, 2026 Affected: Standard bid campaigns (type 8)

Migration Path:

typescript
// ❌ DEPRECATED (will stop working Feb 2, 2026)
await sdk.promotion.createAutoUpdatenm({
  add: [123456, 789012],
  delete: [345678]
}, { id: campaignId });

// ✅ RECOMMENDED: Use type 9 campaigns with updateAuctionNm()
await sdk.promotion.updateAuctionNm({
  nms: [{
    advert_id: campaignId,
    nms: {
      add: [123456, 789012],
      delete: [345678]
    }
  }]
});

3. getAutoStatWords() - Statistics by Phrase Clusters

Endpoint: GET /adv/v2/auto/stat-wordsDeprecation Date: February 2, 2026 Affected: Standard bid campaigns (type 8)

Migration Path:

typescript
// ❌ DEPRECATED (will stop working Feb 2, 2026)
const stats = await sdk.promotion.getAutoStatWords({ id: campaignId });
console.log('Clusters:', stats.clusters);
console.log('Excluded:', stats.excluded);

// ✅ RECOMMENDED: Use universal statistics method
const fullStats = await sdk.promotion.getAdvFullstats({
  ids: String(campaignId),
  beginDate: '2025-01-01',
  endDate: '2025-01-31'
});

// getAdvFullstats() provides comprehensive statistics for ALL campaign types
console.log('Campaign stats:', fullStats);

Note: getAdvFullstats() provides more detailed statistics than getAutoStatWords(), including:

  • Views, clicks, orders, revenue
  • CTR, CR, conversion rates
  • Daily breakdown by SKU
  • Keywords and phrase performance

4. createAutoSetExcluded() - Set/Remove Minus-Phrases

Endpoint: POST /adv/v1/auto/set-excludedDeprecation Date: February 2, 2026 (moved from Jan 15) Affected: Standard bid campaigns (type 8)

Migration Path:

typescript
// ❌ DEPRECATED (will stop working Feb 2, 2026)
await sdk.promotion.createAutoSetExcluded({
  excluded: ['Samsung', 'Xiaomi']
}, { id: campaignId });

// ✅ RECOMMENDED: Use type 9 campaigns
// Minus-phrases are configured via campaign creation/management endpoints
// Consult Wildberries API documentation for type 9 minus-phrase management

Campaign Type 8 vs Type 9

Type 8: Standard Bid Campaigns (Deprecated)

  • Single bid for all products in campaign
  • Limited control over individual product bids
  • Being phased out on February 2, 2026

Type 9: Custom/Standard Bid Campaigns (Current)

  • Flexible bidding: Choose between unified bid or manual bid per product
  • More control: Set individual bids for each product/placement
  • Future-proof: All new features will support type 9

Check campaign type:

typescript
const campaigns = await sdk.promotion.getPromotionCount();

campaigns.adverts?.forEach(advert => {
  if (advert.type === 8) {
    console.warn('⚠️ Type 8 campaign detected - migrate to type 9!');
  } else if (advert.type === 9) {
    console.log('✅ Type 9 campaign - no migration needed');
  }
});

Migration Checklist

Before February 2, 2026

  • [ ] Audit your code for deprecated method usage:

    bash
    # Search for deprecated methods in your codebase
    grep -r "getAutoGetnmtoadd\|createAutoUpdatenm\|getAutoStatWords\|createAutoSetExcluded" .
  • [ ] Identify type 8 campaigns using getPromotionCount():

    typescript
    const campaigns = await sdk.promotion.getPromotionCount();
    const type8Campaigns = campaigns.adverts?.filter(a => a.type === 8);
    console.log(`Found ${type8Campaigns?.length} type 8 campaigns`);
  • [ ] Migrate to type 9 alternatives:

    • Replace createAutoUpdatenm()updateAuctionNm()
    • Replace getAutoStatWords()getAdvFullstats()
    • Update campaign creation logic to use type 9
  • [ ] Test migration in staging environment

  • [ ] Monitor TypeScript/IDE warnings: Methods marked with @deprecated will show strikethrough in IDE

  • [ ] Update documentation and team knowledge base


IDE Support

The SDK now marks deprecated methods with @deprecated JSDoc tags. Your IDE will display:

  • Strikethrough on deprecated method names
  • Warning messages with migration hints
  • Links to alternative methods

Example in VS Code:

typescript
// IDE shows strikethrough and warning
sdk.promotion.getAutoStatWords({ id: 123 });
          //  ~~~~~~~~~~~~~~~~
          //  @deprecated This method is deprecated and will be disabled on February 2, 2026.
          //  Migrate to universal statistics method getAdvFullstats()

Timeline

DateEvent
December 24, 2024Wildberries announces deprecation
January 15, 2025Original deprecation date for createAutoSetExcluded()
February 2, 2026All 4 methods will be disabled

Recommendation: Migrate before January 31, 2025 to allow buffer time for testing.


Common Migration Patterns

Pattern 1: Fetching Campaign Products

Scenario: You need to get the list of products in a campaign.

typescript
// ❌ OLD CODE (Type 8)
async function getCampaignProducts(campaignId: number) {
  const productIds = await sdk.promotion.getAutoGetnmtoadd({ id: campaignId });
  return productIds;
}

// ✅ NEW CODE (Type 9)
async function getCampaignProducts(campaignId: number) {
  const campaigns = await sdk.promotion.getAuctionAdverts({ id: [campaignId] });
  const campaign = campaigns.adverts?.[0];
  return campaign?.nms || []; // Returns array of product IDs
}

Key difference: Type 9 returns complete campaign info, including products in nms field.


Pattern 2: Adding Products to Campaign

Scenario: You need to add multiple products to an existing campaign.

typescript
// ❌ OLD CODE (Type 8)
async function addProductsToCampaign(campaignId: number, productIds: number[]) {
  await sdk.promotion.createAutoUpdatenm(
    { add: productIds },
    { id: campaignId }
  );
}

// ✅ NEW CODE (Type 9)
async function addProductsToCampaign(campaignId: number, productIds: number[]) {
  await sdk.promotion.updateAuctionNm({
    nms: [{
      advert_id: campaignId,
      nms: { add: productIds }
    }]
  });
}

// ✅ BATCH UPDATE (Type 9) - Update multiple campaigns at once!
async function addProductsToMultipleCampaigns(
  updates: Array<{ campaignId: number; productIds: number[] }>
) {
  await sdk.promotion.updateAuctionNm({
    nms: updates.map(u => ({
      advert_id: u.campaignId,
      nms: { add: u.productIds }
    }))
  });
}

Advantage: Type 9 allows batch updates across multiple campaigns in one API call!


Pattern 3: Removing Products from Campaign

Scenario: You need to remove specific products from a campaign.

typescript
// ❌ OLD CODE (Type 8)
async function removeProducts(campaignId: number, productIds: number[]) {
  await sdk.promotion.createAutoUpdatenm(
    { delete: productIds },
    { id: campaignId }
  );
}

// ✅ NEW CODE (Type 9)
async function removeProducts(campaignId: number, productIds: number[]) {
  await sdk.promotion.updateAuctionNm({
    nms: [{
      advert_id: campaignId,
      nms: { delete: productIds }
    }]
  });
}

Pattern 4: Getting Campaign Statistics

Scenario: You need to analyze campaign performance and keyword clusters.

typescript
// ❌ OLD CODE (Type 8) - Limited statistics
async function getCampaignStats(campaignId: number) {
  const stats = await sdk.promotion.getAutoStatWords({ id: campaignId });

  console.log('Keyword clusters:', stats.clusters);
  console.log('Excluded phrases:', stats.excluded);
  // ⚠️ Missing: views, clicks, orders, revenue, CTR, conversion rate
}

// ✅ NEW CODE (Type 9) - Comprehensive statistics
async function getCampaignStats(campaignId: number) {
  const stats = await sdk.promotion.getAdvFullstats({
    ids: String(campaignId),
    beginDate: '2026-01-01',
    endDate: '2026-01-31'
  });

  // ✅ Access to MUCH MORE data:
  console.log('Views:', stats.views);
  console.log('Clicks:', stats.clicks);
  console.log('Orders:', stats.orders);
  console.log('Revenue:', stats.sum);
  console.log('CTR:', stats.ctr);
  console.log('Conversion Rate:', stats.cr);

  // ✅ Daily breakdown by SKU
  stats.days?.forEach(day => {
    console.log(`Date ${day.date}:`, {
      views: day.views,
      clicks: day.clicks,
      orders: day.orders
    });

    // Per-SKU statistics
    day.apps?.forEach(sku => {
      console.log(`  SKU ${sku.nm_id}: ${sku.views} views, ${sku.clicks} clicks`);
    });
  });
}

Major improvement: getAdvFullstats() provides 10x more data than getAutoStatWords()!


Pattern 5: Campaign Type Detection and Auto-Migration

Scenario: You want to automatically handle both type 8 and type 9 campaigns during the transition period.

typescript
// ✅ SMART MIGRATION WRAPPER
async function getProducts(campaignId: number): Promise<number[]> {
  // Step 1: Check campaign type
  const allCampaigns = await sdk.promotion.getPromotionCount();
  const campaign = allCampaigns.adverts?.find(c => c.advertId === campaignId);

  if (!campaign) {
    throw new Error(`Campaign ${campaignId} not found`);
  }

  // Step 2: Use appropriate method based on type
  if (campaign.type === 8) {
    console.warn(`⚠️  Campaign ${campaignId} is type 8 (deprecated). Please migrate to type 9!`);
    // Still works until Feb 2, 2026, but show warning
    return await sdk.promotion.getAutoGetnmtoadd({ id: campaignId });
  } else if (campaign.type === 9) {
    // Use modern type 9 method
    const campaigns = await sdk.promotion.getAuctionAdverts({ id: [campaignId] });
    return campaigns.adverts?.[0]?.nms || [];
  } else {
    throw new Error(`Unknown campaign type: ${campaign.type}`);
  }
}

Use this pattern during transition to gracefully handle both campaign types while encouraging migration.


Pattern 6: Complete Campaign Management Workflow

Scenario: Complete workflow for managing campaign products (check, add, remove, verify).

typescript
// ✅ MODERN WORKFLOW (Type 9)
async function manageCampaignProducts() {
  const campaignId = 12345;

  // 1. Get current campaign state
  const campaigns = await sdk.promotion.getAuctionAdverts({ id: [campaignId] });
  const campaign = campaigns.adverts?.[0];

  console.log(`Campaign: ${campaign.name}`);
  console.log(`Current products: ${campaign.nms?.length || 0}`);

  // 2. Add new products
  const newProducts = [111111, 222222, 333333];
  await sdk.promotion.updateAuctionNm({
    nms: [{
      advert_id: campaignId,
      nms: { add: newProducts }
    }]
  });
  console.log(`✅ Added ${newProducts.length} products`);

  // 3. Remove underperforming products (based on statistics)
  const stats = await sdk.promotion.getAdvFullstats({
    ids: String(campaignId),
    beginDate: '2026-01-01',
    endDate: '2026-01-31'
  });

  // Find SKUs with zero orders
  const underperforming = stats.days?.flatMap(day =>
    day.apps?.filter(sku => sku.orders === 0).map(sku => sku.nm_id) || []
  ) || [];

  if (underperforming.length > 0) {
    await sdk.promotion.updateAuctionNm({
      nms: [{
        advert_id: campaignId,
        nms: { delete: underperforming }
      }]
    });
    console.log(`✅ Removed ${underperforming.length} underperforming products`);
  }

  // 4. Verify final state
  const updated = await sdk.promotion.getAuctionAdverts({ id: [campaignId] });
  console.log(`Final product count: ${updated.adverts?.[0]?.nms?.length || 0}`);
}

This demonstrates the power of type 9 campaigns: unified API, batch operations, rich statistics!


Complete Migration Example

Before (Type 8 - Deprecated)

typescript
import { WildberriesSDK } from 'daytona-wildberries-typescript-sdk';

const sdk = new WildberriesSDK({ apiKey: process.env.WB_API_KEY! });

// ❌ All these methods will stop working Feb 2, 2026
const campaignId = 12345;

// Get products available for campaign
const availableProducts = await sdk.promotion.getAutoGetnmtoadd({ id: campaignId });

// Update products in campaign
await sdk.promotion.createAutoUpdatenm({
  add: [111111, 222222],
  delete: [333333]
}, { id: campaignId });

// Get statistics
const stats = await sdk.promotion.getAutoStatWords({ id: campaignId });
console.log('Keyword clusters:', stats.clusters);

// Set minus-phrases
await sdk.promotion.createAutoSetExcluded({
  excluded: ['competitor brand']
}, { id: campaignId });
typescript
import { WildberriesSDK } from 'daytona-wildberries-typescript-sdk';

const sdk = new WildberriesSDK({ apiKey: process.env.WB_API_KEY! });

// ✅ Use type 9 campaign methods
const campaignId = 12345;

// Get campaign information (includes products)
const campaigns = await sdk.promotion.getAuctionAdverts({ id: [campaignId] });
const campaign = campaigns.adverts?.[0];
console.log('Campaign products:', campaign.nms);

// Update products in campaign
await sdk.promotion.updateAuctionNm({
  nms: [{
    advert_id: campaignId,
    nms: {
      add: [111111, 222222],
      delete: [333333]
    }
  }]
});

// Get comprehensive statistics (supports all campaign types)
const fullStats = await sdk.promotion.getAdvFullstats({
  ids: String(campaignId),
  beginDate: '2025-01-01',
  endDate: '2025-01-31'
});
console.log('Full statistics:', fullStats);

// Minus-phrases configuration for type 9
// (Consult Wildberries documentation for current type 9 API)

Additional Resources


Need Help?


Last Updated: December 24, 2024 Applies to: SDK v2.4+ Deadline: February 2, 2026

Made with ❤️ for the Wildberries developer community