Creatives

A creative is a file in your library, created by a completed upload. Each creative can hold any number of copy variants.

The creative object:

FieldTypeDescription
idstringCreative id
fileNamestringOriginal file name
kindstringimage or video
contentTypestringMIME type
statusstringimporting, ready, or failed
widthinteger or nullWidth in pixels, null until known
heightinteger or nullHeight in pixels, null until known
mediaPathstring or nullPath to the media binary, for example /api/media/cr_1; fetch it with the same Bearer key; add ?download=<filename> to receive it as an attachment; null until the creative is ready
previewPathstring or nullPath to the 720p MP4 preview rendition for videos, served the same way; null until transcoded (always null for images)
copyCountintegerNumber of copy variants
createdAtstringCreation time

GET/api/v1/creatives

List creatives, newest first.

cURL
curl https://upload.ad/api/v1/creatives \
  -H "Authorization: Bearer $UPLOADAD_API_KEY"
JavaScript
const res = await fetch('https://upload.ad/api/v1/creatives', {
	headers: { Authorization: `Bearer ${process.env.UPLOADAD_API_KEY}` }
});
const { creatives } = await res.json();
Python
import os, requests

res = requests.get(
    "https://upload.ad/api/v1/creatives",
    headers={"Authorization": f"Bearer {os.environ['UPLOADAD_API_KEY']}"},
)
creatives = res.json()["creatives"]
PHP
<?php
$ch = curl_init('https://upload.ad/api/v1/creatives');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer ' . getenv('UPLOADAD_API_KEY')]);
$creatives = json_decode(curl_exec($ch), true)['creatives'];
curl_close($ch);
Go
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
)

func main() {
	req, _ := http.NewRequest("GET", "https://upload.ad/api/v1/creatives", nil)
	req.Header.Set("Authorization", "Bearer "+os.Getenv("UPLOADAD_API_KEY"))
	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
Ruby
require "net/http"
require "json"

uri = URI("https://upload.ad/api/v1/creatives")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer #{ENV['UPLOADAD_API_KEY']}"
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
creatives = JSON.parse(res.body)["creatives"]
Java
import java.net.URI;
import java.net.http.*;

public class ListCreatives {
	public static void main(String[] args) throws Exception {
		HttpRequest req = HttpRequest.newBuilder(URI.create("https://upload.ad/api/v1/creatives"))
			.header("Authorization", "Bearer " + System.getenv("UPLOADAD_API_KEY"))
			.build();
		HttpResponse<String> res = HttpClient.newHttpClient().send(req, HttpResponse.BodyHandlers.ofString());
		System.out.println(res.body());
	}
}
C#
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization",
    $"Bearer {Environment.GetEnvironmentVariable("UPLOADAD_API_KEY")}");
var body = await client.GetStringAsync("https://upload.ad/api/v1/creatives");
Console.WriteLine(body);
json
{
	"creatives": [
		{
			"id": "cr_1",
			"fileName": "banner.png",
			"kind": "image",
			"contentType": "image/png",
			"status": "ready",
			"width": 1080,
			"height": 1080,
			"mediaPath": "/api/media/cr_1",
			"copyCount": 2,
			"createdAt": "2026-07-09T10:16:00.000Z"
		}
	]
}

DELETE/api/v1/creatives

Delete creatives by id, 1 to 200 ids per request. Ids that do not exist or belong to another account are skipped; the response reports how many were deleted.

cURL
curl -X DELETE https://upload.ad/api/v1/creatives \
  -H "Authorization: Bearer $UPLOADAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "ids": ["cr_1", "cr_2"] }'
JavaScript
const res = await fetch('https://upload.ad/api/v1/creatives', {
	method: 'DELETE',
	headers: {
		Authorization: `Bearer ${process.env.UPLOADAD_API_KEY}`,
		'Content-Type': 'application/json'
	},
	body: JSON.stringify({ ids: ['cr_1', 'cr_2'] })
});
const { deleted } = await res.json();
Python
import os, requests

res = requests.delete(
    "https://upload.ad/api/v1/creatives",
    headers={"Authorization": f"Bearer {os.environ['UPLOADAD_API_KEY']}"},
    json={"ids": ["cr_1", "cr_2"]},
)
deleted = res.json()["deleted"]
PHP
<?php
$ch = curl_init('https://upload.ad/api/v1/creatives');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer ' . getenv('UPLOADAD_API_KEY'),
    'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['ids' => ['cr_1', 'cr_2']]));
$deleted = json_decode(curl_exec($ch), true)['deleted'];
curl_close($ch);
Go
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"strings"
)

func main() {
	body := strings.NewReader(`{ "ids": ["cr_1", "cr_2"] }`)
	req, _ := http.NewRequest("DELETE", "https://upload.ad/api/v1/creatives", body)
	req.Header.Set("Authorization", "Bearer "+os.Getenv("UPLOADAD_API_KEY"))
	req.Header.Set("Content-Type", "application/json")
	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	out, _ := io.ReadAll(res.Body)
	fmt.Println(string(out))
}
Ruby
require "net/http"
require "json"

uri = URI("https://upload.ad/api/v1/creatives")
req = Net::HTTP::Delete.new(uri)
req["Authorization"] = "Bearer #{ENV['UPLOADAD_API_KEY']}"
req["Content-Type"] = "application/json"
req.body = { ids: ["cr_1", "cr_2"] }.to_json
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
deleted = JSON.parse(res.body)["deleted"]
Java
import java.net.URI;
import java.net.http.*;

public class DeleteCreatives {
	public static void main(String[] args) throws Exception {
		HttpRequest req = HttpRequest.newBuilder(URI.create("https://upload.ad/api/v1/creatives"))
			.header("Authorization", "Bearer " + System.getenv("UPLOADAD_API_KEY"))
			.header("Content-Type", "application/json")
			.method("DELETE", HttpRequest.BodyPublishers.ofString("{ \"ids\": [\"cr_1\", \"cr_2\"] }"))
			.build();
		HttpResponse<String> res = HttpClient.newHttpClient().send(req, HttpResponse.BodyHandlers.ofString());
		System.out.println(res.body());
	}
}
C#
using System.Text;

using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization",
    $"Bearer {Environment.GetEnvironmentVariable("UPLOADAD_API_KEY")}");

var req = new HttpRequestMessage(HttpMethod.Delete, "https://upload.ad/api/v1/creatives")
{
    Content = new StringContent("{ \"ids\": [\"cr_1\", \"cr_2\"] }", Encoding.UTF8, "application/json")
};
var res = await client.SendAsync(req);
Console.WriteLine(await res.Content.ReadAsStringAsync());
json
{ "deleted": 2 }