Lock in $67
METHOD

Uploading ad creative through Claude: what the connector takes

Why the upload step asks for a URL, what changed for images, and the two files a video ad actually needs.

Espen Opdahl Published 5 min read
The short answer

Meta's official connector accepts creative two ways. Give it a public link and its server fetches the bytes signed in as nobody — which is why Google Drive, Dropbox and Canva links fail. Or, for images only, ask it to upload from your device and it opens a file picker. Video stays link-only, encodes in the background, and needs a separate cover image before it can become an ad. Everything built from it is created paused.

You have a folder of cuts. Three hooks, two ratios each, a still frame pulled for every one, all sitting on a laptop. The account is connected, the model is willing, and the first thing it wants is a link.

That request is the whole subject. The thing on the other end is not reading your disk. It is a server that has to end up holding the same bytes you are holding, and the route it takes decides what a creative upload can and cannot be.

Why it asks for a link instead of a file

Meta's own Marketing API does the obvious thing. An image goes up as a multipart file upload and you “get back a hash, and use the hash in an ad or creative”. Bytes out, hash back, and the hash is what every later step refers to.

The connector reverses that transfer. Its upload tool takes an image_url and, in its own words, downloads the image and stores it. The schema is blunt about the terms: the link must be direct and publicly accessible, and the server fetches the bytes with no authentication. A link that asks anyone to sign in cannot work, because there is nobody there to sign in.

So the schema names the failures rather than leaving you to find them. Google Drive, Dropbox and similar share links are listed as unsupported for a stated reason: they answer with a sign-in wall or an interstitial page, so what the fetch receives is markup. The unified tool adds Canva.

worth knowing The standing advice to stage every asset on a CDN before you start is now only half true, and the half that changed is the one most people hit first.

The unified upload tool declares a second source: set it to a local file and, per the schema, it “opens the upload app so the user can choose a file from their device.” The same paragraph limits that path to images — JPEG, PNG and GIF. Read from the live tool schema on 1 September 2026. That is a declaration in a schema rather than an upload I have watched complete in every client, and the older single-purpose upload tools are described there as kept only temporarily, so the surface is still moving.

The Claude Ads Operator course covers the drafting loop this sits inside — upload, build, preview, approve.

What the guides say, and what the schema declares

Published adviceWhat the tool schema says
“The MCP needs publicly accessible URLs for images and videos. Local file paths… won't work” — adkit.so setup guide, by Nico, 8 May 2026, under the heading Local File Uploads Fail True of video. For images the unified tool now declares a local-file source with a device picker
“Upload the videos in my Google Drive folder as new ads” — a suggested prompt on Porter Metrics' Claude tutorial, updated 28 May 2026, written for Porter's own server rather than Meta's Drive links are named unsupported. On the official connector that prompt has nowhere to fetch from
“Use the CLI for creative upload — it reads the filesystem directly” — Ads Uploader, a vendor blog by Chris Pollard, updated 23 July 2026 Still right for video and for a folder at once. No longer the only route for one image

None of those pages is careless. Each describes a surface that was accurate when written and has since grown a door — the ordinary condition of writing about this connector, and the reason a claim is worth less than the date on it.

Video is the half that makes you wait

The video upload returns immediately, and returns something unfinished. Encoding is asynchronous, the reply carries a processing status, and the identifier it hands back is a durable handle you poll against the video listing until the status reads ready. Build the creative before that and you are pointing at something not yet there.

Then the creative wants one more file. A single-video creative requires an image as the cover shown before playback — a hash or a URL, exactly one of them — so the smallest video ad is two uploads and a wait. Carousels relax it: a video card may skip the cover and fall back to the video's own default thumbnail.

The libraries are quiet, too. Ask for images and you get a hash and a name; ask for videos and you get an identifier and a title. Dimensions, URLs, status and timestamps are omitted from a plain listing, and the schema warns in bold not to read a missing field as an empty one. Name the fields you want, or look the asset up by identifier.

A library that answers with two fields is not telling you it holds only two.

Three things to settle before the file moves

  1. The AI-disclosure declaration DECIDE FIRST

    The creative tool carries a field for declaring whether the media was made or edited with a third-party generative AI tool, and it is set once, at creation. The schema says no update tool can set it afterwards, tells the model to always put the field in front of the advertiser, and says the declaration takes effect where AI-transparency rules require it — naming the European Region, India, Taiwan, California and New York. The trade: it is a claim about how your file was produced, which no tool can check, so it belongs to whoever made it rather than whoever is typing.

  2. Where the asset sits while Meta fetches it

    Public means public: while that link is up, an unreleased cut is reachable by anyone who has it. The trade: put-it-up, upload, take-it-down is the safest version and the one that breaks when you retry tomorrow, because the hash survives and the link does not.

  3. A name, supplied at upload

    The name is optional and auto-assigned when you leave it out. The image listing filters by name substring and almost nothing else, so an auto-assigned name is an asset you find again by scrolling. Name it in the same breath as uploading it.

The mistakes

  • Reading a failed fetch as a broken connector. A share link that returns a sign-in page delivers a page, and a page is not an image. The fix is a direct link, not a reconnect.
  • Expecting two entries from the same file uploaded twice. Identical content returns the existing hash without creating a new entry, so a variant that is byte-identical to another quietly becomes the same asset.
  • Correcting a headline on a creative that already exists. Media, copy, link and call-to-action are immutable; the update tool takes a name, an active status and labels. A typo means a new creative.
  • Deleting a creative still attached to a live ad. Refused until you detach or delete those ads — and a deleted creative leaves the listings while staying reachable by its identifier.

Try this tonight Ask for your ad image library, then ask again for the same assets naming the fields you want — width, height, url, created time. The second answer is the real one, and the gap between them is what a plain listing hides. If two uploads you remember making come back as one asset, that is the duplicate collapse, and your file names are carrying more of your creative bookkeeping than you thought. Nothing is created, so there is nothing to undo.

Can it upload a video from my computer?

Not according to the schema: the local-file path is declared for images only. Video needs a direct, publicly reachable link, or a tool that reads your filesystem — which is what the command-line route exists for.

Why does my Google Drive link fail?

Because the fetch happens with no sign-in. Drive, Dropbox and similar services answer an unauthenticated request with a login wall or a preview page, so what arrives is HTML. The schema lists them by name for that reason.

Does a video ad need a separate thumbnail?

A single-video creative does: it requires either an image hash or an image URL as the cover frame. A video card inside a carousel may omit it, and the video's default thumbnail is used instead.

Can I swap the image on an ad that is already running?

Not on the creative — media, copy, link and button are fixed once published. You make a new creative and point the ad at it, which is also why one asset ends up behind many ads and becomes its own reporting problem.

Uploading is the least interesting part of running ads and the likeliest to stop a session dead, because it is the one place the conversation needs something out of the physical world. Stage the file where a stranger could read it, name it as you send it, let video finish encoding, and answer the disclosure question before you build. What follows arrives paused, which is what makes drafting this way safe at all. Still deciding how much of the build to hand over? Start with what the connection can and cannot do, then what it sees once the creative is up.

Draft the ad, don't just talk about it

The course walks the whole build through the connector — upload, creative, ad, preview — and where a human has to sign off before anything runs.

See what's inside — $67 founding price

Pre-sale: the modules are still being recorded and founding members get the checkout link first. No charge today. Public price $97.

Espen Opdahl Writes The Claude Ads Operator. I run Meta ad accounts through Claude and Meta's official ads connector, and I write down what actually happens — including the parts that don't work. Not affiliated with Meta or Anthropic.