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_idspopulates 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
404when 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.
| Removed | Replacement |
|---|---|
GET /open/v1/ads | GET /open/v1/ad-library/search |
GET /open/v1/ads/{ad_id} | GET /open/v1/ad-library/{ad_id} |
GET /open/v1/saved-ads | GET /open/v1/ad-library/saved |
GET /open/v1/brands/search | GET /open/v1/brand-library/search |
GET /open/v1/brands | GET /open/v1/brand-library/followed |
GET /open/v1/brands/{brand_id} | GET /open/v1/brand-library/{brand_id} |
GET /open/v1/brands/{brand_id}/ads | GET /open/v1/brand-library/{brand_id}/ads |
GET /open/v1/my-brands | GET /open/v1/owned-brands |
POST /open/v1/images/generate | POST /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}/transcribe | POST /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
- Search-and-replace the path prefixes from the Removed
table. - If you parse image-generation responses, rename:
project_id→generation_idimage_task_ids→image_ids
- The single-image fetch is now keyed on
(generation_id, image_id)
instead of a flatimage_task_id— update any client that stored
only the flat id; it's still present as theidfield on each
generated-image response. - For video transcripts: pass
account_idas a path parameter (not a
query parameter or body field) and pick POST vs GET deliberately —
POST charges on cache miss, GET never does.
