Docs menu

MCP tool · Creatives

get_upload_urls

For files on your computer: one signed upload URL per file (50 per call, 500 MB per file, valid 1 hour). The assistant uploads each file with an HTTP PUT.

Writes in Apogee Scope: launch Pro and Scale plans Credits: Free*

What it does

For creatives on the user's computer: returns one signed upload URL per file (max 50 per call, 500 MB per file, valid 1 hour), for a Meta, TikTok or Snapchat launch (ad_account_id: the account the files are for).

Upload each file with: curl -sS -X PUT -H "Content-Type: <mimeType>" --data-binary @"<local path>" "<upload_url>"

then call confirm_uploads with the returned paths (it checks each file arrived and is not empty), and pass each ref in prepare_launch files. Detect each file's format (width/height, e.g. with ffprobe) yourself: 9:16, 4:5, 1:1 or 16:9.

Parameters

  • ad_account_id string required

    The ad account (list_ad_accounts): Meta act_…, a TikTok advertiser id, a Snapchat ad account id

    Matches ^(act_\d{1,32}|[A-Za-z0-9][A-Za-z0-9-]{0,63})$

  • files array of objects required

    1 to 50 items

    Fields of each item (3)
    • name string required

      File name with its extension

      1 to 255 characters

    • size integer required

      Bytes (required: e.g. stat -f%z, or wc -c)

      > 0 · ≤ 524,288,000

    • mimeType string optional

      up to 100 characters

Example

Your assistant calls it for you when you ask in your own words. What it sends (MCP tools/call, JSON-RPC 2.0):

tools/call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_upload_urls",
    "arguments": {
      "ad_account_id": "act_1234567890",
      "files": [
        {
          "name": "NORDLICHT_RAIN_HOOK1_9x16.mp4",
          "size": 48213112,
          "mimeType": "video/mp4"
        }
      ]
    }
  }
}

The same call over HTTP with an API key, for an MCP client of your own (an assistant that signs in sends its OAuth token instead):

curl
curl -X POST https://app.apogee.ad/mcp \
  -H "Authorization: Bearer $APOGEE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_upload_urls","arguments":{"ad_account_id":"act_1234567890","files":[{"name":"NORDLICHT_RAIN_HOOK1_9x16.mp4","size":48213112,"mimeType":"video/mp4"}]}}}'

Access and cost

PlansPro and Scale.
Scopelaunch: a connection or an API key without it does not see this tool (scopes).
EffectChanges Apogee only (imports, uploads, settings, comment syncs, AI drafts): nothing on the ad account.
CreditsFree up to the daily free reads (5,000 a day on Pro, 10,000 on Scale), then 1 credit per read. A call that fails costs nothing (credits).
Rate limit600 MCP requests per 15 minutes on Pro, 1,200 on Scale (rate limits).
Daily capCounts 2 units toward the 2,000 units one API key or assistant connection can use in 24 hours.

In the REST API

The same thing for your own code, with an API key:

Creatives: Bring the files in before a launch. Nothing reaches Meta at this point.

Last updated on . The parameters, limits, credits and error codes of these pages are generated from the code of the Apogee API (contract 2026-10-06).

A question, something missing? Write to hello@apogee.ad.

Book a demo

Pick the time that suits you.

Open in a new tab

Loading the calendar…

Talk to Founder