Static Ads Lab
Concepts

Brands

Brand identity — name, logos, color palettes, and fonts. Every product and image ad belongs to a brand.

A brand is the top-level container for your visual identity in Static Ads Lab. Every product and every image ad belongs to exactly one brand.

Mental model

A brand is the source of truth for the look and feel that the API applies to every ad it generates for you. When you generate an image ad, the brand provides the colors, fonts, and logo treatment; the reference ad URL provides composition and layout inspiration; the product and audience provide the content and tone.

ID prefix: brand_.

Fields

FieldTypeDescription
idstringbrand_…
namestringBrand name
descriptionstring | nullShort brand description
color_palettesobject | nullBrand color palettes (hex values)
fontsarrayFont families the brand uses, e.g. [{ "name": "Inter" }]
logo_image_idsstring[] | nullImage IDs (img_…) for brand logos
detailsobject | nullFree-form brand metadata (mission, voice, tagline)
duplicated_from_idstring | nullThe brand this one was duplicated from, if any
created_at / updated_atstringISO timestamps

Endpoints

MethodPathPurpose
POST/v1/brandsCreate a brand
GET/v1/brandsList brands
GET/v1/brands/:idGet a brand
PATCH/v1/brands/:idUpdate a brand
DELETE/v1/brands/:idDelete a brand
POST/v1/brands/:id/duplicateDuplicate a brand

Duplicating

POST /v1/brands/:id/duplicate creates an independent copy named "<name> - copy". Unlike archive and delete, cascade defaults to true — the copy arrives with the brand's active products, variants, and audiences, because a brand without its catalog is rarely what you wanted. Pass ?cascade=false for the brand record alone.

Only the brand is renamed; its products and variants keep their names. Logos and variant images are shared rather than re-uploaded, so the copy references the same img_… records. Archived children are left out, and an archived brand still yields an active copy.

const response = await fetch(
  "https://api.staticadslab.com/v1/brands/brand_.../duplicate",
  { method: "POST", headers: { "X-API-Key": "YOUR_API_KEY" } },
);

const { data, duplicated } = await response.json();
// data.name  → "Acme Corp - copy"
// duplicated → { products: 3, product_variants: 8, audiences: 5, variant_images: 24 }

If any part of the copy fails, everything created by that request is rolled back — you get an error and no partial brand.

Common patterns

Create a brand

const response = await fetch("https://api.staticadslab.com/v1/brands", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    name: "Acme Corp",
    description: "Premium outdoor gear",
    fonts: [{ name: "Inter" }],
  }),
});
const { data } = await response.json();
console.log(data.id); // brand_...
curl -s -X POST https://api.staticadslab.com/v1/brands \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Acme Corp",
    "description": "Premium outdoor gear",
    "fonts": [{ "name": "Inter" }]
  }'
import requests

response = requests.post(
    "https://api.staticadslab.com/v1/brands",
    headers={"X-API-Key": "YOUR_API_KEY", "Content-Type": "application/json"},
    json={
        "name": "Acme Corp",
        "description": "Premium outdoor gear",
        "fonts": [{"name": "Inter"}],
    },
)
print(response.json()["data"]["id"])  # brand_...

Attach logos

Upload images first via POST /v1/images, then PATCH /v1/brands/:id with the resulting IDs:

await fetch(`https://api.staticadslab.com/v1/brands/${brandId}`, {
  method: "PATCH",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    logo_image_ids: ["img_logo_dark", "img_logo_light"],
  }),
});

Pitfalls

  • A brand created via API has empty color_palettes, fonts, and logo_image_ids unless you provide them. Image ads generated against a brand with no visual data may look generic.
  • The dashboard onboarding flow can auto-extract brand identity from a Shopify URL. The API exposes per-field create/update only — there is no public auto-extract endpoint today.

Prompt for your agent

Read https://www.staticadslab.com/docs/resources/brands.mdx and help me create a brand via the API with a name, description, and a logo image I'll provide later.