eBay Media API video upload: 150 MB, MP4, and the LIVE status

eBay's Media API takes a listing video in two calls: createVideo with the exact byte size (max 150 MB), then uploadVideo as MP4. Prep the file with Sume.

6 min readSume
All posts

To put a video on an eBay listing through the API, make two Media API calls and one listing call. createVideo registers the video with a title, its exact size in bytes (at most 150 MB, or 157,286,400 bytes) and a classification of ITEM; uploadVideo sends the file as an MP4 of the type MPEG-4 Part 10 (AVC) with Content-Type: application/octet-stream; then you attach the returned video ID to the listing. The uploaded size has to match the size you declared.

This post follows eBay's Managing videos guide and Media API Overview, then shows how to prepare the file with Sume. It is about the API upload, not the length rules for Promoted Listings ads, which the eBay listing video length post covers.

What are the three calls?

The guide describes a create-then-upload flow. createVideo is POST /video and answers 201 Created with the new video ID in the location header. uploadVideo is POST /video/{video_id}/upload. getVideo is GET /video/{video_id} and reports status. Large files can also use the staged and resumable upload flow the overview mentions.

Media API video flow, from eBay's Managing videos guide and Media API Overview, read 2026-10-03.
StepCallWhat eBay says
1. RegistercreateVideo, POST /videoNeeds title, size in bytes (maximum 150 MB) and classification ITEM; returns 201 and a location header with the video ID
2. UploaduploadVideo, POST /video/{video_id}/uploadMP4, MPEG-4 Part 10 / AVC; Content-Type: application/octet-stream; file size must match the declared size
3. CheckgetVideo, GET /video/{video_id}Returns upload status and metadata
4. AttachInventory API createOrReplaceInventoryItem, or Trading API callsproduct.videoIds, or Item.VideoDetails.VideoID on AddItem, ReviseItem, RelistItem

What do the statuses and expiry mean?

The overview lists five states: PENDING_UPLOAD, PROCESSING, PROCESSING_FAILED, BLOCKED and LIVE. A good upload moves from pending to processing to live; the other two are failure states. You can attach a video before it is LIVE, but it will not display until processing finishes, so poll getVideo before you tell anyone the listing has a video.

The overview also says each successfully uploaded video expires 30 days after its initial upload. The pages do not say what a listing shows after expiry, so do not assume a re-upload happens by itself: build a date check into any job that keeps listings evergreen.

  • The guide lists the EBAY_US, EBAY_GB and EBAY_MOTORS_US marketplaces.
  • It says videos can currently be viewed only in the native iOS and Android apps.
  • Titles and descriptions are plain text with no markup tags, and thumbnails are generic: custom images are not supported.

What the eBay pages do not give you

Neither page states video length, resolution or bitrate limits; the guide points to eBay's seller help for formatting. Do not take the 150 MB figure as a quality target. It is a ceiling, and a short clip at moderate resolution sits far below it.

How do I prepare the file with Sume?

Generate the clip with POST /v1/videos (see Video generation: seedance-2.5 takes 4 to 30 seconds, and Video Router says Auto create controls default to 720p and 8 seconds). Sume's docs show completed artifacts as video/mp4, but they do not promise an AVC stream, so do not rely on the generator's codec.

To land on H.264 deterministically, run the finished clip through Video trim with precision left at its default, exact, which the docs describe as a frame-accurate re-encode with libx264 and yuv420p. Pass start: 0 and an end at or past the clip's length; past the source it clamps and the result warns trim_clamped_to_source. An optional output of { width, height, fps } (256 to 2160 pixels, fps 24, 25, 30 or 60) shrinks the file if it is too big. The source clip must be a media.sume.com URL, and a trim costs $0.02 per job per the docs.

Then measure the bytes you will upload. The declared size must equal the file you send, so read it from the file itself, not from a header or a rounded figure.

import json, os, sys

LIMIT = 157_286_400  # 150 MB, per eBay's Managing videos guide
path = sys.argv[1]
size = os.path.getsize(path)
if size > LIMIT:
    sys.exit(f"{size} bytes is over eBay's {LIMIT}-byte limit; re-render smaller")
print(json.dumps({"title": "Product clip", "size": size, "classification": "ITEM"}))

Keep the clip honest

I did not find an eBay help page that sets a rule for AI-generated listing video, so this post makes no claim about one. The safest practice does not need a rule: start from a real photo of the item you are shipping, and let the clip move the camera, not change the product. Keep a record of which job made which clip with the AI-generated video disclosure checklist, and send one Idempotency-Key per SKU so a retry replays the original job.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume