TECH JOURNAL

eBay Order Management API で注文を自動処理する — 受注から追跡番号登録まで

ShareXB!
eBay Order Management API で注文を自動処理する — 受注から追跡番号登録まで
目次

はじめに

eBay の注文管理は長らく Trading API の GetOrders / CompleteSale で行われてきたが、現在は REST ベースの Order Management API(Fulfillment API)への移行が推奨されている。

旧 Trading API はまだ動作するが、新しい機能は Order Management API にしか追加されない。ここでは新 API を使った受注から出荷完了までの実装を解説する。

API の全体像

eBay の注文関連 API は以下の 2 つが中心。

APIエンドポイント用途
Fulfillment APIapi.ebay.com/sell/fulfillment/v1注文取得・出荷登録
Post-Order APIapi.ebay.com/post-order/v2返品・キャンセル処理

認証は OAuth 2.0。https://api.ebay.com/identity/v1/oauth2/token でアクセストークンを取得する。

Step 1: 注文一覧の取得

// 直近 2 時間の注文を取得
async function getRecentOrders(accessToken: string) {
  const creationDateFrom = new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString()
 
  const response = await fetch(
    `https://api.ebay.com/sell/fulfillment/v1/order?filter=creationdate:[${creationDateFrom}..],orderfulfillmentstatus:{NOT_STARTED|IN_PROGRESS}`,
    {
      headers: {
        Authorization: `Bearer ${accessToken}`,
        "Content-Type": "application/json",
      },
    }
  )
 
  const data = await response.json()
  return data.orders ?? []
}

orderfulfillmentstatus フィルタで NOT_STARTED(未処理)と IN_PROGRESS(処理中)を取得する。FULFILLED は処理済みなのでスキップ。

Step 2: 注文詳細の確認

注文オブジェクトには lineItems(注文明細)、buyer(購入者情報)、pricingSummary(金額)などが含まれる。

interface EbayOrder {
  orderId: string
  creationDate: string
  orderFulfillmentStatus: "NOT_STARTED" | "IN_PROGRESS" | "FULFILLED"
  lineItems: Array<{
    lineItemId: string
    sku: string
    quantity: number
    title: string
    lineItemFulfillmentStatus: string
  }>
  buyer: {
    username: string
    taxIdentifier?: { taxpayerId: string }
  }
  fulfillmentStartInstructions: Array<{
    fulfillmentInstructionsType: string
    shipToLocation: {
      contactAddress: {
        addressLine1: string
        city: string
        stateOrProvince: string
        postalCode: string
        countryCode: string
      }
      contact: {
        fullName: string
        primaryPhone: { phoneNumber: string }
      }
    }
    maxEstimatedDeliveryDate: string
  }>
}

Step 3: 出荷情報の登録(Shipping Fulfillment)

WMS から追跡番号を受け取ったら createShippingFulfillment で登録する。

async function registerShipment(
  accessToken: string,
  orderId: string,
  trackingNumber: string,
  lineItems: Array<{ lineItemId: string; quantity: number }>
) {
  const response = await fetch(
    `https://api.ebay.com/sell/fulfillment/v1/order/${orderId}/shipping_fulfillment`,
    {
      method: "POST",
      headers: {
        Authorization: `Bearer ${accessToken}`,
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        lineItems,
        shippedDate: new Date().toISOString(),
        shippingCarrierCode: "JAPAN_POST",
        trackingNumber,
      }),
    }
  )
 
  if (!response.ok) {
    const error = await response.json()
    throw new Error(`Shipment registration failed: ${JSON.stringify(error.errors)}`)
  }
 
  return response.json()
}

shippingCarrierCode は eBay の定義する配送業者コードを使う。日本からの国際発送で使うもの:

コード業者
JAPAN_POST日本郵便(EMS など)
YAMATO_TRANSPORTヤマト運輸
SAGAWA_EXPRESS佐川急便
DHLDHL
FEDEXFedEx

Step 4: 全フローを繋げる

async function processEbayOrders() {
  const token = await getAccessToken()
  const orders = await getRecentOrders(token)
 
  for (const order of orders) {
    // WMS への連携(詳細は省略)
    const wmsResult = await sendOrderToWms(order)
    if (wmsResult.status !== "queued") continue
 
    console.log(`Order ${order.orderId} queued in WMS`)
  }
}
 
// WMS から tracking 番号が確定したら呼ばれる
async function handleWmsShipmentComplete(
  orderId: string,
  trackingNumber: string,
  lineItems: Array<{ lineItemId: string; quantity: number }>
) {
  const token = await getAccessToken()
  await registerShipment(token, orderId, trackingNumber, lineItems)
  console.log(`Order ${orderId} marked as shipped: ${trackingNumber}`)
}

エラーと retry 設計

eBay API は 429 Too Many Requests の他に 503 Service Unavailable も返す。指数バックオフでリトライしつつ、最終的に失敗したらアラートを上げる設計にしておく。

async function fetchWithRetry(url: string, options: RequestInit, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    const response = await fetch(url, options)
 
    if (response.status === 429 || response.status === 503) {
      const retryAfter = response.headers.get("Retry-After") ?? "5"
      await new Promise((r) => setTimeout(r, parseInt(retryAfter) * 1000))
      continue
    }
 
    return response
  }
  throw new Error(`Max retries exceeded for ${url}`)
}

まとめ

eBay Order Management API(Fulfillment API)は REST + OAuth 2.0 で、Trading API より扱いやすい設計になっている。出荷登録は createShippingFulfillment にトラッキング番号を POST するだけで、eBay が自動的に購入者に通知する。

ShareXB!

この記事を書いた人

渡部 誠也

執行役員 / CTO

独立系 SIer で Web・組み込み・基幹システムの開発を経験し、2017 年に illustrious へ。CTO としてシステム開発事業を立ち上げ、要件定義からコーディングまで一貫して担う。EC に特化した Web アプリケーションを数多く手がける。

ECの業務やシステムについて、
ご相談ください。

いまの運用で困っていること、実現したいことから、一緒に整理します。