Upload Ad Creatives to GAM Without the UI: MCP Inline vs CLI Multipart
The Google Ad Manager API has no single "file upload" endpoint. OrbiAds exposes two surfaces for programmatic creative uploads — with very different size limits and use cases.
OA
OrbiAds Engineering
Published May 28, 2026 · 6 min read
Why Upload Creatives Programmatically?
The Google Ad Manager UI is designed for manual, one-at-a-time use. As soon as you need to push dozens of banners — A/B variants, format-specific cuts, multi-language sets — the UI becomes a bottleneck. CI/CD workflows and AI agents need a reliable programmatic surface.
OrbiAds exposes two surfaces for this capability, each suited to a different context:
MCPInline base64
The creative_assets tool encodes the file as base64 and sends it directly in the JSON payload. Ideal for AI agents that generate or modify creatives on-the-fly inside Claude or another LLM.
Zero shell dependency
Native to Claude agents
Images ≤ 1.1 MB · HTML5 ZIP ≤ 2.25 MB
Video / audio not supported
CLIMultipart
The orbiads creatives upload command uses a standard multipart request (Content-Type: multipart/form-data) to stream files directly without base64 overhead. Designed for CI/CD scripts and large files.
PNG / JPG / GIF / WebP ≤ 5 MB
HTML5 ZIP ≤ 9.5 MB
Video MP4 / WebM / MOV and audio MP3 / OGG / AAC
300 s timeout for large files
Format & Size Limit Comparison
Format
MCP (base64)
CLI (multipart)
PNG / JPG / GIF / WebP
≤ 1.1 MB
≤ 5 MB
SVG
≤ 1.1 MB
≤ 5 MB
HTML5 ZIP
≤ 2.25 MB
≤ 9.5 MB
MP4 / WebM / MOV
—
✓ (server-side limit)
MP3 / OGG / AAC
—
✓ (server-side limit)
MCP Example: Inline Image Upload via Claude
In a Claude session with the OrbiAds plugin installed, ask the agent to upload a creative. The agent calls creative_assets with action="create_image". The file is read locally, base64-encoded, and transmitted in the JSON payload to the GAM API.
MCP base64 limit — The payload is capped at 1,500,000 characters (~1.1 MB decoded) for images and 3,000,000 characters (~2.25 MB) for HTML5 ZIPs. Beyond those limits, use the CLI.
CLI Example: Multipart Upload in One Command
The OrbiAds CLI auto-detects the creative type from the file extension. For an image banner, specify the size with --size WxH:
MCP (Claude / LLM) — When you're already in an AI agent session, the file is under 1 MB, and you don't want to open a terminal.
CLI — As soon as the file exceeds 1 MB, you're uploading video or audio, or you're integrating the upload into a CI/CD pipeline (GitHub Actions, Bash scripts).
Both surfaces go through the same OrbiAds backend and produce the same GAM creative object. The difference is purely in transport: base64 JSON vs multipart/form-data.
OrbiAds handles GAM API compatibility for you
GAM API v202605 removed the legacy CreativeAssetService. OrbiAds transparently handles both paths — inline bytes via createCreatives for MCP, multipart upload via a dedicated REST endpoint for the CLI — without requiring you to know the underlying SOAP API details.
Start Uploading Creatives Programmatically
Install OrbiAds as a Claude Code plugin (claude plugin install orbiads) or the PyPI CLI (pip install orbiads-cli). Both tools share the same OrbiAds account and credit balance.