---
title: "Upload image assets from URLs"
method: POST
path: "/api/v1/tools/google_add_image_assets/execute"
tags: ["Google Ads"]
---

# Upload image assets from URLs

`POST /api/v1/tools/google_add_image_assets/execute`

## Request

- Base URL: `https://adako.ai`
- URL: `https://adako.ai/api/v1/tools/google_add_image_assets/execute`
- Auth: HTTP bearer

Downloads images from https URLs, checks them against Google's rules (PNG/JPEG/static GIF, at most 5120 KB, the aspect ratio and minimum size of the slot they are for) and uploads the ones that pass as image assets.
Use when: the user gave you image URLs and you are about to build a Performance Max asset group or add image extensions.
Do not use when: you have not seen the images pass google_validate_and_prepare_assets and the user has not confirmed which slot each one is for — an image in the wrong slot is rejected by Google with an unhelpful error.
Nothing is uploaded unless every image passes: a half-uploaded set is harder to clean up than a refusal. Google silently drops a new name for an image whose bytes already exist, so re-uploading the same file is safe but keeps the original name.
The upload creates assets in the account library; it does not link them to anything. Link them with google_add_sitelinks-style tools or by building an asset group.
If you are unsure which account, campaign or period the user means, ask them — do not guess ids or dates.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `arguments` object, required
    - `customer_id` string: Google Ads customer id (10 digits, dashes optional). Omit to use the primary account; list_connected_accounts shows the valid ids.
    - `images` object[], required: The images to upload.
      - `url` string, uri, required: The image file (PNG, JPEG or static GIF). Adako hosts no files: the platform downloads this URL itself, from its own servers and often hours later, so it must be a public link straight to the file — not a file on the computer, not a Drive, Dropbox or design-tool share page, not a link that expires or asks for a login. Call check_media first: it repairs the usual share links, checks the file against this platform, and says where to put a file that has no link yet.
      - `name` string, required: A name for the asset library, e.g. "Spring sale — square".
      - `field_type` 'MARKETING_IMAGE' | 'SQUARE_MARKETING_IMAGE' | 'PORTRAIT_MARKETING_IMAGE' | 'LOGO' | 'LANDSCAPE_LOGO', required: Which slot the image fills. Each slot has its own aspect ratio; the tool checks it before uploading.
    - `idempotency_key` string: Optional caller-supplied key; identical keys never execute twice.

## Response `200`

The tool ran. A write returns proposal_id and approve_url while the change waits for approval.

- SuccessEnvelope
  - `success` unknown, required
  - `tool` string, required
  - `data` object, required: Machine-readable result.
  - `markdown` string, required: The same result written for a person or a model.
  - `quota` Quota: Task usage for the current billing period.
    - `plan` string
    - `used` integer
    - `limit` integer
    - `period_end` string
    - `upgrade_url` string
  - `proposal_id` string: Present for writes. Nothing changes on the ad platform until it is approved.
  - `approve_url` string: Where a person approves the proposal.
  - `request_id` string, required

## Other responses

- `400`: Invalid arguments, or the ad account could not be resolved.
- `401`: Missing, invalid, revoked or expired API key.
- `402`: Monthly task quota used up, or the plan does not include this tool.
- `403`: The connected ad account lacks the access level this tool needs.
- `404`: Unknown tool name.
- `409`: Not connected, reconnect needed, confirmation required, a proposal already pending or no longer pending, an identical create that failed earlier today (proposal_failed_before), a create that duplicates an approved one (duplicate_create), the ad-account limit of the plan reached (account_limit), or an Idempotency-Key reused with different arguments.
- `429`: Rate limited by Adako or by the ad platform. See Retry-After.
- `500`: Unexpected error inside Adako.
- `502`: The ad platform returned an error.

---

[API](https://skmtc.dev/adako/apis/adako-rest-api.md) · [All operations](https://skmtc.dev/adako/apis/adako-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/adako/apis/adako-rest-api/revisions/59ee60d48a56?raw)
