Skip to content

Orders FBS Module

The Orders FBS (Fulfillment by Seller) module provides comprehensive order management for sellers who process and ship orders from their own warehouses to Wildberries offices. This module handles the complete FBS workflow: order retrieval, supply management, shipping label generation, metadata attachment, and warehouse pass management.


Overview

Module Name: ordersFBSSource: Generated from wildberries_api_doc/03-orders-fbs.yamlBase URL: https://marketplace-api.wildberries.ruTotal Methods: 39 methods across 7 functional areas

FBS vs FBW

FeatureFBS (Fulfillment by Seller)FBW (Fulfillment by Wildberries)
Stock LocationSeller's warehouseWildberries warehouse
Order ProcessingSeller packs & shipsWB handles logistics
Shipping LabelsSeller generatesNot applicable
Delivery TargetWB pickup points/officesDirect from WB
Modulesdk.ordersFBSsdk.ordersFBW

Installation and Setup

Accessing the Module

The Orders FBS module is automatically available when you initialize the SDK:

typescript
import { WildberriesSDK } from 'wb-api-sdk';

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

// Access the Orders FBS module
const ordersFBS = sdk.ordersFBS;

Required Permissions

Ensure your API key has the following permissions enabled:

  • Order management (read/write)
  • Supply management (read/write)
  • Sticker generation (read)
  • Metadata management (read/write)

Methods Reference

Orders (6 methods)

MethodDescriptionRate Limit
getOrdersNew()Get all new orders awaiting processing300 req/min
orders(options?)Get orders with pagination and date filters300 req/min
getOrderStatuses(data)Get statuses for multiple orders (bulk)300 req/min
updateOrdersCancel(orderId)Cancel an order100 req/min
getOrdersReshipment()Get orders requiring reshipment300 req/min
createOrdersStatu(data)@deprecated Use getOrderStatuses()300 req/min

Supplies (10 methods)

MethodDescriptionRate Limit
createSupply(data)Create a new supply300 req/min
supplies(options?)List supplies with pagination300 req/min
getSupply(supplyId)Get supply details300 req/min
deleteSupply(supplyId)Delete an empty supply300 req/min
updateSuppliesDeliver(supplyId)Transfer supply to delivery300 req/min
getSuppliesBarcode(supplyId, options?)Get supply QR code300 req/min
addOrdersToSupply(supplyId, data)Add multiple orders to supply (bulk)300 req/min
getSupplyOrderIds(supplyId)Get order IDs in a supply300 req/min
updateSuppliesOrder(supplyId, orderId)@deprecated Use addOrdersToSupply()1000 req/min
getSuppliesOrder(supplyId)@deprecated Use getSupplyOrderIds()300 req/min

Passes (5 methods)

MethodDescriptionRate Limit
getPassesOffices()List warehouses requiring passes300 req/min
passes()List seller passes300 req/min
createPass(data)Create a seller pass1 req/10min
updatePass(passId, data)Update a seller pass300 req/min
deletePass(passId)Delete a seller pass300 req/min

Metadata (8 methods)

MethodDescriptionRate Limit
getOrdersMetaBulk(data)Get metadata for multiple orders (bulk)1000 req/min
deleteOrdersMeta(orderId, options?)Delete order metadata by key300 req/min
updateMetaSgtin(orderId, data)Attach SGTIN marking codes1000 req/min
updateMetaUin(orderId, data)Attach UIN code1000 req/min
updateMetaImei(orderId, data)Attach IMEI code1000 req/min
updateMetaGtin(orderId, data)Attach GTIN code1000 req/min
updateMetaExpiration(orderId, data)Set expiration date1000 req/min
setCustomsDeclaration(orderId, data)Set customs declaration number1000 req/min
getOrdersMeta(orderId)@deprecated Use getOrdersMetaBulk()300 req/min

Stickers (3 methods)

MethodDescriptionRate Limit
createOrdersSticker(options?, data?)Generate order stickers (SVG/PNG/ZPL)300 req/min
createStickersCrossBorder(data?)Get cross-border stickers (PDF)300 req/min
createOrdersExternalSticker(data?)@deprecated Will be removed10 req/min

Cross-Border (2 methods)

MethodDescriptionRate Limit
createStatusHistory(data?)Get cross-border status history300 req/min
createOrdersClient(data)Get client info for Turkey cross-border300 req/min

Transport Boxes - TRBX (4 methods)

MethodDescriptionRate Limit
getSuppliesTrbx(supplyId)List boxes in a supply300 req/min
createSuppliesTrbx(supplyId, data?)Create boxes for a supply300 req/min
deleteSuppliesTrbx(supplyId, data?)Delete boxes from a supply300 req/min
createTrbxSticker(supplyId, options?, data?)Get box stickers300 req/min

Usage Examples

Getting New Orders and Checking Status

typescript
import { WildberriesSDK } from 'wb-api-sdk';

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

async function processOrders() {
  // 1. Get all new orders awaiting processing
  const { orders: newOrders } = await sdk.ordersFBS.getOrdersNew();
  console.log(`Found ${newOrders?.length ?? 0} new orders`);

  if (!newOrders?.length) return;

  // 2. Display order details
  for (const order of newOrders) {
    console.log(`Order ${order.id}:`);
    console.log(`  Article: ${order.article}`);
    console.log(`  NM ID: ${order.nmId}`);
    console.log(`  Price: ${(order.price ?? 0) / 100} RUB`);
    console.log(`  Cargo Type: ${order.cargoType}`);
    console.log(`  Required Meta: ${order.requiredMeta?.join(', ') || 'None'}`);
  }

  // 3. Check statuses for these orders
  const orderIds = newOrders.map(o => o.id!);
  const statusResponse = await sdk.ordersFBS.getOrderStatuses({ orders: orderIds });

  statusResponse.orders?.forEach(status => {
    console.log(`Order ${status.id}: ${status.supplierStatus} / ${status.wbStatus}`);
  });
}

Complete Supply Workflow

typescript
import { WildberriesSDK } from 'wb-api-sdk';
import { writeFileSync } from 'fs';

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

async function createAndProcessSupply() {
  // 1. Create a new supply
  const { id: supplyId } = await sdk.ordersFBS.createSupply({
    name: `Supply ${new Date().toISOString().split('T')[0]}`
  });
  console.log(`Created supply: ${supplyId}`);

  // 2. Get new orders
  const { orders: newOrders } = await sdk.ordersFBS.getOrdersNew();
  if (!newOrders?.length) {
    console.log('No new orders to process');
    await sdk.ordersFBS.deleteSupply(supplyId!);
    return;
  }

  // 3. Add orders to supply (changes status: new -> confirm)
  // Note: Only orders with matching cargoType can be in the same supply
  const orderIds = newOrders.slice(0, 10).map(o => o.id!);
  await sdk.ordersFBS.addOrdersToSupply(supplyId!, { orders: orderIds });
  console.log(`Added ${orderIds.length} orders to supply`);

  // 4. Generate shipping stickers (PNG format, 58x40mm)
  const stickersResponse = await sdk.ordersFBS.createOrdersSticker(
    { type: 'png', width: 58, height: 40 },
    { orders: orderIds }
  );

  // 5. Save stickers to files (base64 decoded)
  stickersResponse.stickers?.forEach(sticker => {
    const buffer = Buffer.from(sticker.file!, 'base64');
    writeFileSync(`sticker-${sticker.orderId}.png`, buffer);
    console.log(`Saved sticker for order ${sticker.orderId}`);
  });

  // 6. Deliver supply (changes status: confirm -> complete)
  await sdk.ordersFBS.updateSuppliesDeliver(supplyId!);
  console.log('Supply delivered');

  // 7. Get supply QR code (only available after delivery)
  const barcode = await sdk.ordersFBS.getSuppliesBarcode(supplyId!, { type: 'png' });
  const qrBuffer = Buffer.from(barcode.file!, 'base64');
  writeFileSync(`supply-${supplyId}.png`, qrBuffer);
  console.log(`Saved supply QR code: ${barcode.barcode}`);
}

Attaching Metadata (IMEI, SGTIN)

typescript
async function attachOrderMetadata(orderId: number) {
  // Check what metadata is required
  const metaResponse = await sdk.ordersFBS.getOrdersMetaBulk({ orders: [orderId] });
  const orderMeta = metaResponse.orders?.find(o => o.id === orderId);
  console.log('Current metadata:', orderMeta?.meta);

  // Attach IMEI for electronics
  await sdk.ordersFBS.updateMetaImei(orderId, {
    imei: '354567890123456'
  });

  // Attach SGTIN marking codes (for tracked products)
  await sdk.ordersFBS.updateMetaSgtin(orderId, {
    sgtins: ['01046009544741002']
  });

  // Set expiration date (for perishable goods)
  await sdk.ordersFBS.updateMetaExpiration(orderId, {
    expiration: '2025-12-31'
  });

  // Attach customs declaration (for cross-border)
  await sdk.ordersFBS.setCustomsDeclaration(orderId, {
    customsDeclaration: '10129050/010120/0001234'
  });

  console.log('Metadata attached successfully');
}

Managing Warehouse Passes

typescript
async function manageWarehousePasses() {
  // 1. Get list of warehouses requiring passes
  const offices = await sdk.ordersFBS.getPassesOffices();
  console.log('Available offices:', offices);

  // 2. Create a pass for a driver
  const { id: passId } = await sdk.ordersFBS.createPass({
    firstName: 'Ivan',
    lastName: 'Petrov',
    carModel: 'GAZelle Next',
    carNumber: 'A123BC77',
    officeId: offices[0]?.id ?? 1
  });
  console.log(`Created pass: ${passId}`);

  // 3. List all passes
  const passes = await sdk.ordersFBS.passes();
  passes.forEach(pass => {
    console.log(`Pass ${pass.id}: ${pass.firstName} ${pass.lastName}`);
    console.log(`  Vehicle: ${pass.carModel} (${pass.carNumber})`);
    console.log(`  Office: ${pass.officeName}`);
    console.log(`  Expires: ${pass.dateEnd}`);
  });

  // 4. Update pass if needed
  await sdk.ordersFBS.updatePass(passId!, {
    firstName: 'Ivan',
    lastName: 'Petrov',
    carModel: 'GAZelle Next',
    carNumber: 'B456DE99',  // Updated car number
    officeId: offices[0]?.id ?? 1
  });

  // 5. Delete pass when no longer needed
  // await sdk.ordersFBS.deletePass(passId!);
}

Paginated Order Retrieval

typescript
async function getAllOrdersForPeriod(startDate: Date, endDate: Date) {
  const allOrders = [];
  let nextCursor = 0;

  // Convert dates to Unix timestamps
  const dateFrom = Math.floor(startDate.getTime() / 1000);
  const dateTo = Math.floor(endDate.getTime() / 1000);

  do {
    const response = await sdk.ordersFBS.orders({
      limit: 1000,
      next: nextCursor,
      dateFrom,
      dateTo
    });

    allOrders.push(...(response.orders ?? []));
    nextCursor = response.next ?? 0;

    console.log(`Fetched ${response.orders?.length} orders, total: ${allOrders.length}`);
  } while (nextCursor > 0);

  return allOrders;
}

// Usage: Get orders from last 7 days
const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000);
const orders = await getAllOrdersForPeriod(sevenDaysAgo, new Date());

Managing Transport Boxes (TRBX)

typescript
async function manageTransportBoxes(supplyId: string) {
  // 1. Create boxes for a supply (for PVZ deliveries)
  const { trbxIds } = await sdk.ordersFBS.createSuppliesTrbx(supplyId, { amount: 5 });
  console.log(`Created ${trbxIds?.length} boxes`);

  // 2. Get list of boxes
  const { trbxes } = await sdk.ordersFBS.getSuppliesTrbx(supplyId);
  console.log('Current boxes:', trbxes);

  // 3. Generate box stickers
  const boxStickers = await sdk.ordersFBS.createTrbxSticker(
    supplyId,
    { type: 'png' },
    { trbxIds: trbxIds ?? [] }
  );

  boxStickers.stickers?.forEach((sticker, index) => {
    const buffer = Buffer.from(sticker.file!, 'base64');
    writeFileSync(`box-${index + 1}.png`, buffer);
  });

  // 4. Delete unused boxes (only while supply is open)
  // await sdk.ordersFBS.deleteSuppliesTrbx(supplyId, { trbxIds: ['box-1'] });
}

Types

Key Entity Types

typescript
// Order status types
type OrderSupplierStatus = 'new' | 'confirm' | 'complete' | 'cancel';

type OrderWbStatus =
  | 'waiting'
  | 'sorted'
  | 'sold'
  | 'canceled'
  | 'canceled_by_client'
  | 'declined_by_client'
  | 'defect'
  | 'ready_for_pickup'
  | 'postponed_delivery'
  | 'accepted_by_carrier'
  | 'sent_to_carrier';

// Cargo types
type CargoType = 1 | 2 | 3;  // 1=small, 2=oversized, 3=large

// Sticker format
type StickerType = 'svg' | 'zplv' | 'zplh' | 'png';

// Order entity
interface Order {
  id?: number;
  article?: string;
  rid?: string;
  nmId?: number;
  chrtId?: number;
  price?: number;
  cargoType?: CargoType;
  createdAt?: string;
  warehouseId?: number;
  supplyId?: string;
  address?: { fullAddress?: string; longitude?: number; latitude?: number };
  // ... additional fields
}

// New order (includes required metadata)
interface OrderNew extends Order {
  requiredMeta?: string[];
  optionalMeta?: string[];
  salePrice?: number;
  finalPrice?: number;
}

// Supply entity
interface Supply {
  id?: string;
  name?: string;
  done?: boolean;
  createdAt?: string;
  closedAt?: string;
  cargoType?: 0 | 1 | 2 | 3;
  crossBorderType?: 0 | 1 | null;
}

// Order metadata
interface Meta {
  imei?: { value?: string };
  uin?: { value?: string };
  gtin?: { value?: string };
  sgtin?: { value?: string[] };
  expiration?: { value?: string };
  customsDeclaration?: { value?: string };
}

// Seller pass
interface Pass {
  id?: number;
  firstName?: string;
  lastName?: string;
  carModel?: string;
  carNumber?: string;
  officeId?: number;
  officeName?: string;
  officeAddress?: string;
  dateEnd?: string;
}

Request/Response Types

typescript
// Pagination parameters
interface GetOrdersParams {
  limit: number;      // 1-1000
  next: number;       // Pagination cursor, 0 for first page
  dateFrom?: number;  // Unix timestamp
  dateTo?: number;    // Unix timestamp
}

// Order status request
interface OrderStatusRequest {
  orders: number[];   // 1-1000 order IDs
}

// Sticker options
interface StickerParams {
  type: StickerType;
  width: 58 | 40;
  height: 40 | 30;
}

// Bulk metadata request
interface GetMetaMultiRequest {
  orders: number[];   // Max 100 order IDs
}

// Add orders to supply request
interface AddOrdersToSupplyRequest {
  orders: number[];
}

Error Handling

Common Errors

HTTP CodeError TypeDescriptionResolution
400ValidationErrorInvalid request parametersCheck parameter values and constraints
401/403AuthenticationErrorInvalid or missing API keyVerify API key and permissions
404NotFoundErrorResource not foundVerify order/supply ID exists
409ConflictErrorOperation conflictCheck status requirements (see below)
429RateLimitErrorRate limit exceededWait and retry (see rate limits)

409 Conflict Scenarios

ScenarioCauseResolution
Cargo type mismatchAdding order with different cargoType to supplyCreate separate supply for different cargo types
Warehouse mismatchAdding order from different warehouseGroup orders by warehouse
Supply has ordersAttempting to delete non-empty supplyRemove all orders first
UIN not filledDelivering supply with missing required metadataAttach all required metadata
Invalid status transitionCanceling a completed orderCheck order status before operation
Supply not deliveredRequesting QR code before deliveryCall updateSuppliesDeliver() first

Error Handling Example

typescript
import {
  WBAPIError,
  RateLimitError,
  ValidationError
} from 'wb-api-sdk';

try {
  await sdk.ordersFBS.addOrdersToSupply(supplyId, { orders: orderIds });
} catch (error) {
  if (error instanceof RateLimitError) {
    console.log(`Rate limited. Retry after ${error.retryAfter}ms`);
    await sleep(error.retryAfter);
    // Retry the request
  } else if (error instanceof ValidationError) {
    console.log('Validation error:', error.message);
    // Check parameters
  } else if (error instanceof WBAPIError && error.statusCode === 409) {
    console.log('Conflict:', error.message);
    // Possible cargo type mismatch
  } else {
    throw error;
  }
}

Rate Limits

Rate Limit Tiers

TierLimitIntervalBurstEndpoints
Standard FBS300/min200ms20Most FBS endpoints (28 methods)
Cancel Order100/min600ms20updateOrdersCancel
Meta Attachment1000/min60ms20Metadata PUT methods (SGTIN, UIN, IMEI, etc.)
Create Pass1/10min-1createPass

409 Error Penalty

Important: When an operation returns a 409 (Conflict) error, it counts as 10 requests against your rate limit quota instead of 1. This applies to all supply operations.

Rate Limit Handling

typescript
import { RateLimiter } from 'wb-api-sdk';

// The SDK handles rate limiting automatically
// But you can implement additional backoff for bulk operations

async function processOrdersBatched(orderIds: number[]) {
  const batchSize = 100;

  for (let i = 0; i < orderIds.length; i += batchSize) {
    const batch = orderIds.slice(i, i + batchSize);

    try {
      await sdk.ordersFBS.getOrderStatuses({ orders: batch });
    } catch (error) {
      if (error instanceof RateLimitError) {
        await sleep(error.retryAfter);
        i -= batchSize; // Retry this batch
      }
    }

    // Optional: add delay between batches to avoid rate limits
    await sleep(250);
  }
}

Deprecated Methods

The following methods are deprecated and will be removed in future versions:

MethodReplacementReason
createOrdersStatu(data)getOrderStatuses(data)Incorrect method name (typo)
getOrdersMeta(orderId)getOrdersMetaBulk(data)Single-order endpoint removed; use bulk
updateSuppliesOrder(supplyId, orderId)addOrdersToSupply(supplyId, data)Single-order endpoint removed; use bulk
getSuppliesOrder(supplyId)getSupplyOrderIds(supplyId)Endpoint changed; returns IDs only
createOrdersExternalSticker(data)createStickersCrossBorder(data)Endpoint removed by Wildberries

Migration Examples

typescript
// createOrdersStatu() → getOrderStatuses()
// BEFORE (deprecated)
const statuses = await sdk.ordersFBS.createOrdersStatu({ orders: [123, 456] });

// AFTER (recommended)
const statuses = await sdk.ordersFBS.getOrderStatuses({ orders: [123, 456] });
typescript
// createOrdersExternalSticker() → Note: endpoint removed by Wildberries
// This method now throws - use createStickersCrossBorder() for cross-border orders
// BEFORE (deprecated - no longer works)
const stickers = await sdk.ordersFBS.createOrdersExternalSticker({ orders: [123] });

// AFTER (recommended for cross-border)
const stickers = await sdk.ordersFBS.createStickersCrossBorder({ orders: [123] });
typescript
// getOrdersMeta() → getOrdersMetaBulk()
// BEFORE (deprecated)
const meta = await sdk.ordersFBS.getOrdersMeta(orderId);

// AFTER (recommended)
const metaResponse = await sdk.ordersFBS.getOrdersMetaBulk({ orders: [orderId] });
const meta = metaResponse.orders?.find(o => o.id === orderId)?.meta;
typescript
// updateSuppliesOrder() → addOrdersToSupply()
// BEFORE (deprecated)
await sdk.ordersFBS.updateSuppliesOrder(supplyId, orderId);

// AFTER (recommended - bulk)
await sdk.ordersFBS.addOrdersToSupply(supplyId, { orders: [orderId] });
typescript
// getSuppliesOrder() → getSupplyOrderIds()
// BEFORE (deprecated)
const { orders } = await sdk.ordersFBS.getSuppliesOrder(supplyId);

// AFTER (recommended - returns IDs only)
const { orderIds } = await sdk.ordersFBS.getSupplyOrderIds(supplyId);
// Then fetch full order details if needed
const statuses = await sdk.ordersFBS.getOrderStatuses({ orders: orderIds ?? [] });

Supply Workflow

Status Transitions

Order Status Flow:
┌─────────┐      addOrdersToSupply()     ┌─────────┐      deliverSupply()      ┌──────────┐
│   new   │ ───────────────────────────> │ confirm │ ────────────────────────> │ complete │
└─────────┘                              └─────────┘                           └──────────┘
     │                                        │
     │ updateOrdersCancel()                   │ updateOrdersCancel()
     v                                        v
┌─────────┐                              ┌─────────┐
│ cancel  │ <──────────────────────────  │ cancel  │
└─────────┘                              └─────────┘

Cargo Type Constraints

A supply can only contain orders of the same cargo type:

  • Type 1: Small goods (MGT)
  • Type 2: Oversized goods (SGT)
  • Type 3: Large goods (KGT+)

The first order added to an empty supply determines its cargo type. Subsequent orders must match.

Complete Workflow Checklist

  1. Create supply - createSupply({ name: '...' })
  2. Get new orders - getOrdersNew()
  3. Group by cargo type - Filter orders by cargoType
  4. Add orders to supply - addOrdersToSupply(supplyId, { orders: [...] })
  5. Attach required metadata - Check requiredMeta field
  6. Generate stickers - createOrdersSticker(options, { orders: [...] })
  7. Print and attach stickers to packages
  8. Deliver supply - updateSuppliesDeliver(supplyId)
  9. Get QR code - getSuppliesBarcode(supplyId, { type: 'png' })
  10. Print QR code for warehouse scanning

EPICs

User Stories

API Documentation


Changelog

VersionDateChanges
2.8.02026-02Fixed broken endpoints (EPIC 22), added bulk methods
2.7.02026-01Added getOrdersMetaBulk, addOrdersToSupply, getSupplyOrderIds
2.0.02025-10Initial Orders FBS module with 34 methods

Made with ❤️ for the Wildberries developer community