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:
| Field | Type | Description |
|---|---|---|
id | string | Creative id |
fileName | string | Original file name |
kind | string | image or video |
contentType | string | MIME type |
status | string | importing, ready, or failed |
width | integer or null | Width in pixels, null until known |
height | integer or null | Height in pixels, null until known |
mediaPath | string or null | Path 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 |
previewPath | string or null | Path to the 720p MP4 preview rendition for videos, served the same way; null until transcoded (always null for images) |
copyCount | integer | Number of copy variants |
createdAt | string | Creation time |
GET/api/v1/creatives
List creatives, newest first.
curl https://upload.ad/api/v1/creatives \
-H "Authorization: Bearer $UPLOADAD_API_KEY"const res = await fetch('https://upload.ad/api/v1/creatives', {
headers: { Authorization: `Bearer ${process.env.UPLOADAD_API_KEY}` }
});
const { creatives } = await res.json();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
$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);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))
}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"]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());
}
}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);{
"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 -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"] }'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();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
$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);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))
}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"]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());
}
}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());{ "deleted": 2 }