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.

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.
| Step | Call | What eBay says |
|---|---|---|
| 1. Register | createVideo, POST /video | Needs title, size in bytes (maximum 150 MB) and classification ITEM; returns 201 and a location header with the video ID |
| 2. Upload | uploadVideo, POST /video/{video_id}/upload | MP4, MPEG-4 Part 10 / AVC; Content-Type: application/octet-stream; file size must match the declared size |
| 3. Check | getVideo, GET /video/{video_id} | Returns upload status and metadata |
| 4. Attach | Inventory API createOrReplaceInventoryItem, or Trading API calls | product.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
- Elixir 1.20: verify a Sume webhook with :crypto.mac
An Elixir module that checks the Sume sume-v1 header with :crypto.mac and a guard clause that refuses an empty secret. Written against Elixir 1.20.4.
- Episode idempotency keys: season, episode and version for Sume runs
Build the Sume Idempotency-Key from series, season, episode and a version you bump on purpose. What replays, what conflicts, what needs a new key.
- Extend a video Veo didn't make: which API takes an uploaded clip
Veo 3.1 extension only accepts Veo-made videos. Here is what Gemini Omni and Sume accept instead when you need to continue a clip you uploaded.
- Extend an AI clip by hand: last frame to the next clip, in Python
No extend endpoint? Pull a clip's last frame with Sume's video-frames API and feed it as the first frame of the next job. Python code under 30 lines.
Written by Sume