Added

v0.2.0 — API v1 namespace consolidation

The public API under /open/v1/* has been reorganised into clearer
namespaces. This version is the first stable shape we plan to keep for
external integrations — if you wrote code against earlier paths,
you'll need to update endpoints once; after this release the
namespaces are committed.

Breaking changes. All legacy ad / brand / image / video paths
have been removed and replaced. See Removed for the
rename table.

Added

Ad Library — global ad catalog

The /ads* endpoints moved under a single /ad-library namespace so
that "the global library" is a first-class noun, distinct from an
ad-account's own ads.

  • GET /open/v1/ad-library/search — full-text + filter search across
    the global ad library.
  • GET /open/v1/ad-library/saved — ads the calling workspace has saved.
  • GET /open/v1/ad-library/{ad_id} — single ad detail.

Brand Library — global brand catalog

Mirror of Ad Library, for brands. Replaces /brands*.

  • GET /open/v1/brand-library/search — search the global brand
    catalog by keyword.
  • GET /open/v1/brand-library/followed — brands the workspace tracks.
  • GET /open/v1/brand-library/{brand_id} — single brand detail.
  • GET /open/v1/brand-library/{brand_id}/ads — ads belonging to a
    catalog brand.

Owned Brands — workspace-owned brand profiles

Promoted from /my-brands so the distinction from catalog brands is
visible in the URL. These are the brand profiles you use as brand_id
when calling the image-generation endpoints.

  • GET /open/v1/owned-brands — list the workspace's own brand
    profiles.

Image Generations — image-gen lifecycle as a resource

The previous trio (POST /images/generate, GET /images/jobs/{id},
GET /images/{id}) is now a single image-generations resource with
nested generated-image lookups.

  • POST /open/v1/image-generations — submit a creative brief; returns
    generation_id.
  • GET /open/v1/image-generations/{generation_id} — poll status;
    image_ids populates once individual images are scheduled.
  • GET /open/v1/image-generations/{generation_id}/images/{image_id}
    — fetch a single generated image's detail and URL.

Response field renames are part of the shape change:
project_id → generation_id, image_task_ids → image_ids,
concept_task_ids → concept_ids.

Video transcripts — POST + GET on the same path

Cached video transcripts now live under the owning ad-account, with
POST as the trigger and GET as the read.

  • POST /open/v1/ad-accounts/{account_id}/videos/{video_id}/transcript
    — trigger transcription (synchronous; consumes credits on cache
    miss).
  • GET /open/v1/ad-accounts/{account_id}/videos/{video_id}/transcript
    — cache-only lookup; never triggers, never charges credits. Returns
    404 when no transcript is cached yet.

Pick the verb by intent — same path, different cost.

Changed

Unchanged namespaces

These endpoints were already well-named and stayed put across the
0.2.0 rename pass — no client changes required:

  • /open/v1/boards* — board list / detail / contained ads
  • /open/v1/ad-accounts* — list / summary / per-ad performance

Removed

Legacy paths removed in 0.2.0. Each row tells you what to call instead.

RemovedReplacement
GET /open/v1/adsGET /open/v1/ad-library/search
GET /open/v1/ads/{ad_id}GET /open/v1/ad-library/{ad_id}
GET /open/v1/saved-adsGET /open/v1/ad-library/saved
GET /open/v1/brands/searchGET /open/v1/brand-library/search
GET /open/v1/brandsGET /open/v1/brand-library/followed
GET /open/v1/brands/{brand_id}GET /open/v1/brand-library/{brand_id}
GET /open/v1/brands/{brand_id}/adsGET /open/v1/brand-library/{brand_id}/ads
GET /open/v1/my-brandsGET /open/v1/owned-brands
POST /open/v1/images/generatePOST /open/v1/image-generations
GET /open/v1/images/jobs/{project_id}GET /open/v1/image-generations/{generation_id}
GET /open/v1/images/{image_task_id}GET /open/v1/image-generations/{generation_id}/images/{image_id}
POST /open/v1/videos/{video_id}/transcribePOST /open/v1/ad-accounts/{account_id}/videos/{video_id}/transcript
GET /open/v1/videos/{video_id}?account_id=…GET /open/v1/ad-accounts/{account_id}/videos/{video_id}/transcript

Migration notes

  1. Search-and-replace the path prefixes from the Removed
    table.
  2. If you parse image-generation responses, rename:
    • project_idgeneration_id
    • image_task_idsimage_ids
  3. The single-image fetch is now keyed on (generation_id, image_id)
    instead of a flat image_task_id — update any client that stored
    only the flat id; it's still present as the id field on each
    generated-image response.
  4. For video transcripts: pass account_id as a path parameter (not a
    query parameter or body field) and pick POST vs GET deliberately —
    POST charges on cache miss, GET never does.