DAM Wiki

Storyteq API

Inspired Thinking Group (ITG) Limited (Storyteq brand) · United Kingdom (ITG, Birmingham); Storyteq originated in Amsterdam, Netherlands · Founded 2016 · subsidiary of Inspired Thinking GroupVerified 2026-11-10 · 71 sources
  • SaaS
  • Enterprise
  • REST API
  • OpenAPI spec
  • Webhooks
Complete · 7 of 7 pages
71sources
2API specs
11-10verified 2026
Official website ↗Storyteq alternatives →

In brief

From this page’s summary fields, verified 2026-11-10. Sources in each section.
Authentication (details in section Authentication)
OAuth 2.0 (password, PKCE), API key
Rate limit (details in section Limits & quirks)
CMP V2: 5,000 requests/min and 500,000/month per account
Webhooks (details in section Events & webhooks)
Asset events set up by App Support (API key, batched, 5 retries); v4 render callbacks
Pagination (details in section At a glance)
offset (listing-offset + listing-limit 20/50/100); v4 media lists 50 per page
API spec (details in section Stored API specs)
OpenAPI 3.1: CMP V2 (36 ops) + Storyteq API v4 (5 ops, 5 webhooks)

Storyteq publishes several separate integration surfaces rather than one general-purpose API:

  1. CMP V2 API ("Content Management Platform API V2"): a lightweight REST API over the LUMA back end for assets, taxonomy, lenses, projects and workflows. Its OpenAPI file is public S17 S19.
  2. Storyteq API (Creative Automation) v4: render media from Adaptation Studio templates. Public OpenAPI file with webhook definitions S18.
  3. Embeddable components: the Asset Picker (web component or iframe) and the Dynamic Asset Transformation (DAT) web component, plus URL-based image transforms on the CDN S8 S12 S13.
  4. Identity Broker: OIDC + PKCE sign-in for external integrations such as Figma and Jira S4.
  5. Asset event webhook service: outbound asset change events S6.

The OpenAPI files sit on a Swagger UI portal at developer.storyteq.com. Prose documentation sits on docs.storyteq.com, which has no REST reference S17 S2. All API access needs credentials issued by the Storyteq account team S19 S18.

At a glance

API styles
REST/JSON for CMP V2 and v4 S19 S18. CMP V2 uses RPC-style operation paths (/ListAssets, /GetAsset, /SetAssetFields…) rather than resource URLs S19. DAT AI transforms are documented as mutations (ImageTransform_removeBackground…) called by the web component; their endpoint is not published S14.
Base URL(s)
CMP V2: https://enterprise.api.storyteq.com/cmp/v2/ (spec server); the auth example uses https://enterprise.api-dev.storyteq.com/cmp/v2/token, and the Asset Picker routes to https://enterprise.api-${env}.storyteq.com S19 S9. The tenant is passed in a CMP-Tenant header (the customer's CMP instance URL, https://{tenant}.storyteq.com) S19. v4: https://api.{region}.storyteq.com/v4 with region = europe-west1 (default) or us-east4; https://api.storyteq.com/v4 is marked "Legacy, Deprecated" S18. Internal LUMA (Asset Picker default): {host}/api/{domain}/com.intrepia.luma.{endpoint} S9. CDN transforms: https://cdn.assets.storyteq.com/{tenant}/version/{asset-id}/transform/image/… S13 (the path segment after the host is shown as ca in the example; its meaning is not documented).
Current version(s) & deprecations
CMP V2 (info.version 1.0.0; file name cmp-v2-34) S19. Storyteq API v4.0 S18. Deprecated: the non-regional v4 host S18. Canopy API V1 (CanopyCloud era, `https://{canopyApiHost}/{api
Auth methods
CMP V2: OAuth 2.0 password grant: POST/token with client_id (cmp-v2-<dev|uat|prd>), username, password and the CMP-Tenant header; bearer JWT on later calls S19. v4: static bearer token obtained from "your regular contact person" S18. External integrations: OIDC authorization code + PKCE through the Identity Broker (Keycloak) S4 S5. Asset Picker (internal): API key + lens ID in attributes S9. Webhooks to your endpoint: X-API-Key header S7.
Token lifetime / refresh
CMP V2 token response carries access_token, expires_in, refresh_token, id_token, scope, token_type; a refresh_token grant is defined S19. Actual lifetimes: Not public. Identity Broker: short-lived access token + refresh token, lifetimes not stated S4 S5. v4 token expiry: Not public.
Scopes / permission model
No OAuth scopes are documented S19. Access follows the CMP user: domain hierarchy (a user sees their domain and its children), roles and groups, and lenses S19 S33. External integrations sign the user in through the Identity Broker and then call the LUMA v2 endpoints, so results follow that user's rights S8 Unverified (inferred from the sign-in model; not stated as a rule).
Official spec
Yes: two OpenAPI 3.1.0 YAML files on the Developer Portal S17 S18 S19. Archived copies on DAM Wiki: API spec downloads. No Postman collection found.
Rate limits
CMP V2: "as a general guideline" 5,000 requests per minute and 500,000 requests per month per account S19. Identity Broker: 20 requests per minute S5. v4: not documented; regional hosts return x-ratelimit-limit: 1000000 on the unauthenticated root S36 Unverified (window and scope not documented).
Pagination
CMP V2 ListAssets: listing-style=Page, listing-limit ∈ {20, 50, 100}, listing-offset (increment by the limit) S19. ListUserProjectNodes: same pattern, sets of 50 S19. v4 GET…/media: 50 per page S18.
Webhooks / events
Asset event webhooks: CREATED, EDITED, DELETED, PURGED, REVERSION; batched about every minute; configured by Storyteq App Support, not self-service S6 S7. v4 render notifications: per-request notifications with type: webhook and a route URL; events MediaQueued, MediaRendering, MediaUploading, MediaFinished, MediaFailed S18.
Official SDKs
None maintained. storyteq-api-php (v4 client) is self-described as incomplete and was archived on 2024-04-18 S34. The Asset Picker and DAT ship as web components loaded from Storyteq hosts (no npm package documented) S10 S12.
Sandbox / trial access
Credentials come from the account team; Storyteq says CMP must first be configured for your company before the API returns meaningful data S19. Dev, staging/UAT and production hosts exist (app.storyteq.io, app.storyteq.work, app.storyteq.com for the Asset Picker; `cmp-v2-<dev

Authentication

CMP V2 (password grant) S19

  1. Ask the account team for a client ID, a username/password and your CMP-Tenant value (your CMP instance URL).
  2. POST{base}/token with headers Content-Type: application/json and CMP-Tenant: {tenant} and a JSON body: client_id, username, password, grant_type: "password".
  3. Use the returned access_token (JWT) as Authorization: Bearer … with the CMP-Tenant header on every call.
  4. Refresh with grant_type: "refresh_token" and the refresh_token.
  • Without credentials, the API answers 400 {"error": "Authorization field missing"} S36.
  • The spec documents only this flow for CMP V2; no client-credentials or authorization-code flow is described for it.

Storyteq API v4 (bearer token) S18

  • Every request carries Authorization: Bearer {token}. Tokens are issued by Storyteq; no self-service creation is documented. An unauthenticated call to /v4/content/templates/ returns 401 {"message":"Unauthenticated."} S36.

Identity Broker (external integrations) S4 S5 S11

  1. The user enters their tenant URL in the integration and clicks Connect.
  2. The Identity Broker finds the tenant's identity provider and region and builds the redirect. Sign-in opens in a new browser tab or window (SSO or Storyteq credentials).
  3. The IdP returns an authorization code; the integration exchanges it (with the PKCE verifier) for access and refresh tokens.
  4. The integration polls the broker to detect completion (no WebSocket). The session times out after 5 minutes.
  • Broker endpoints are limited to 20 requests per minute. Endpoint paths and client registration: Not public.
  • Storyteq CMP uses Keycloak; tenants still on LUMA sign-in are being migrated S4.

Asset Picker credentials (internal integrations) S8 S9

  • The host passes domain, domainId, apiKey and lensId (one lens = one curated set of assets). Users do not sign in. External integrations instead set apiIntegration (external-prod, external-uat…) and sign users in through the Identity Broker.

Core resources

CMP V2 operations, derived from the OpenAPI file (36 operations; all except /token require the bearer token and CMP-Tenant) S19.

ResourceEndpointsNotes
AuthenticationPOST/tokenPassword and refresh-token grants
Discovery: domainsGET/ListUserDomainsDomains the user can access; IDs needed elsewhere. IDs can change if configuration changes
Discovery: configurationGET/ListFolders, /ListSites, /ListLensesForDomain, /ListTransforms, /ListTypeTree, /ListTypeFieldsByType, /ListTypeSchema, /ListGenera, /GetGenus, /ListKeywordsFolders, portal sites, lenses, transforms (derivative recipes), type tree, type fields, project schemas, taxonomy genera and keywords
Assets: search & listGET/ListAssetsdomainID, filters (URL-encoded JSON), lensID, available, inherit, sort by name / created / modified / type / state
Assets: readGET/GetAsset, /GetAssetInfo, /GetAssetFields, /GetAssetTaxonomy, /ListAssetNarratives, /ListAssetAvailability, /GetAssetURLsMetadata, extended info, fields, keywords, narratives, availability windows, external (public) URLs
Assets: writePOST/SetAssetFields, /SetAssetNarrative, /EditAssetKeywordsField values, narratives, keyword binding
Renditions / downloadsGET/GetAssetDerivativeMenu, /DownloadAssetDerivative, /DownloadAssetPreviewSigned temporary link to a derivative (operation=Link); previews generated on demand
ProjectsPOST/CreateProjectRoot, GET/GetProject, /GetProjectRootTypesForDomain, /ListUserProjectNodes, POST/AddProjectResourcesFetchCreate and read workflow projects; add a resource from a URL
WorkflowsGET/ListProcesses, /ListAssetWorkflows, /GetWorkflowUserTransitions, POST/WorkflowStart, /WorkflowTransitionStart a process on a project and move it through transitions
Users / groupsnoneNot exposed in CMP V2
Uploadsnone (only AddProjectResourcesFetch from a URL)Bulk upload and download are out of scope; contact the integrations team S19
RightsGET/ListAssetAvailabilityAvailability windows; phases (Quarantined / Active / Expired)

Storyteq API v4 (creative automation) S18

ResourceEndpointsNotes
TemplatesGET/content/templates/, GET/content/templates/{templateId}Templates the token can use, with parameter configuration; version status Draft (Ad Builder) / Production / Draft (After Effects)
Media (renders)POST/content/templates/{templateId}/media, GET/content/templates/{templateId}/media, GET/content/media/{mediaId}Create media from template_parameters key-value pairs; status queued → rendering → uploading → finished / failed; download_urls when done. 409 and 422 errors defined

Canopy API V1 (deprecated; read only, not archived because of its licence) S20: 11 GET operations on /domains, /domains/{id}/lenses, /resources, /resources/{id} (info, derivatives, previews, external URLs, latest atom) and /env; offset paging with limit (max 200) and offset.

Data model

  • Domain: hierarchical container for configuration and objects (organisation → business unit → market). Access flows down, never up or sideways S19.
  • Type: the backbone for assets and projects (fields, taxonomy, milestones, states, roles, workflow) S19.
  • Asset (called resource internally): integer assetID plus a UUID (assetUuid) that persists across versions. Each binary version is an atom (atomId) S7 S20. Event supertypes: Resource, Project, Adaptation, Template S7.
  • Metadata: custom fields per type, narratives (named free-text fields), taxonomy keywords grouped in genera, tags S19.
  • Lifecycle: phase (Quarantined, Active, Expired) and an independent availability window S19 S26.
  • Derivatives: produced by transforms (engines Passthru, Chaos, Entropy) per asset type. The original file cannot be downloaded through the API, only a derivative S19 S22.
  • Lens: saved filter (type, file type, phase, keywords with all / any / none) mirroring a portal view S19.
  • Site: a front-end portal; several per domain S19.

Search & querying

S19

  • Simple search by asset name; simple filters (asset ID list, phase, available).
  • Complex filters: a URL-encoded JSON array. The searchFilter type takes clauses, each with flags (Fuzzy, Name, Keyword, Field, Metadata, Tag), an optional field name and a value. Flags inside one clause are OR'ed; clauses and filters are AND'ed.
  • Other filter types use LUMA class names, e.g. com.intrepia.luma.KeywordFilter (keyword IDs), TypeFilter (with descendants) and PeriodFilter (created / modified date ranges).
  • Responses include real-time counts per filter (faceted search).
  • Lens-based search: pass lensID to reproduce a portal view.
  • Max page size 100. A maximum result window is not documented. Storyteq states that the API does not support bulk extraction, wide filters with nested iteration, or polling "in any shape or form". Use webhooks for change detection.

Uploads & binaries

  • No binary upload in the public APIs. CMP V2 can only attach a project resource fetched from a URL (AddProjectResourcesFetch) S19. Bulk upload or download needs the integrations team S19.
  • Download flow: ListAssets → GetAssetDerivativeMenu (choose a transform) → DownloadAssetDerivative with operation=Link, which returns a temporary signed URL. Derivatives need a transform set up in advance; ask the account team to create transforms S19.
  • Previews: DownloadAssetPreview builds previews on request and asynchronously. A 404 can mean "not ready yet", so retry with increasing delays S19.
  • Public URLs: GetAssetURLs returns external URLs. Asset Picker links using public URLs do not expire; service-account links have their own validity period S19 S8.
  • On-the-fly images: CDN URLs with path segments {id}:{parameters} (e.g. resize:fit-in:800x600/quality:85/format:webp). Signing or auth for these URLs: Not public S13.
  • Rendered media (v4): the download_urls object on a finished media item S18.

Events & webhooks

Asset event webhook service S6 S7

AspectDetail
EventsCREATED, EDITED (merged per asset per interval), DELETED (moved to Trash, restorable), PURGED (permanent; bypasses filters), REVERSION (new binary/version)
ConfigurationThrough Storyteq App Support, not self-service. YAML keys under assetUpdater.webhooks: url, enabled, apikey, headers, resourceTypes, eventTypes, filters
FiltersresourceTypes (default Resource), eventTypes, parentId (only top-level assets by default), and filter groups on keywords, additionalFields, state, schemaId, typeId, domainId, parentId with AND / ANY / NONE
PayloadPOST JSON {count, webhookTimestamp, events[]}; each event: eventId (UUID, use for dedup), eventTimestamp, eventType, assetId, assetUuid, atomId
BatchingAbout every minute; 100 events per request by default (smaller on request); 16 MB cap
Auth to your endpointX-API-Key header (secret held in GCP Secret Manager by Storyteq) plus optional custom headers. No payload signature. No OAuth
RetriesNon-2xx: up to 5 retries, exponential back-off 1 → 8 minutes. 4xx not retried. After 24 h, events go to an internal dead-letter store
Replay / monitoringNo self-service replay (ask App Support with event IDs); no delivery dashboard

Unverified The two pages disagree on undeliverable events: the explanation page says they are "dropped" after 24 hours, the reference says they go to a dead-letter store. The reference lists event types in upper case, while its YAML examples use title case ("Edited") S6 S7.

v4 render notifications S18: add notifications: [{type: "webhook", route: "https://…"}] to a media request. Defined callbacks: MediaQueued, MediaRendering, MediaUploading, MediaFinished, MediaFailed. Signature and retry policy: Not public.

Limits & quirks

  • CMP V2 is for UI-scale use: small subsets of data for pickers, metadata reads and edits, project creation. No bulk, no polling, no original-file download S19.
  • Rate limits are "general guidelines" (5,000/min, 500,000/month per account) S19. A fair-use policy in the spec forbids reselling data and circumventing limits S19.
  • IDs may change when the DAM configuration changes. Cache them but plan to rediscover S19.
  • Assets visible in the front end must be Active, available and usually carry keywords matching the lens S19.
  • Preview 404s on first request are normal (asynchronous generation) S19.
  • Two v4 docs: the API root still points to an Apiary reference (storyteq.docs.apiary.io) while the Developer Portal serves the OpenAPI 3.1 file S36 S38 S17.
  • Asset Picker apiIntegration: the parameters page also mentions an external-site value that is not in the accepted-values list S9 Unverified.
  • Generative Expand is unavailable for images of 4,000 px or more in either dimension S14 S28.
  • Agent Console is not an API product: there are no public endpoints for agents S15 S16.

SDKs, tools & code samples

ToolLanguageStatusSource
storyteq-api-php (Composer storyteq/storyteq-api-php)PHP, API v4Self-described as incomplete; archived 2024-04-18 S34
Asset Picker web component (asset-picker.umd.js, <asset-picker>) / iframeJavaScriptCurrent; loaded from app.storyteq.com/asset-picker/ S10 S9
DAT web component (<cmp-dat>)JavaScriptCurrent; standalone mode for testing S12
storyteq-video-player, platform-integration reposJavaScript / TypeScriptPublic repos without documentation; not presented as SDKs S35

No npm, PyPI or NuGet package was found. No llms.txt on storyteq.com or docs.storyteq.com S36.

Changelog of the API

DateChangeSource
2026-06-25Last-Modified date of the CMP V2 and v4 OpenAPI files on the Developer Portal S36 S17
UndatedNon-regional v4 host api.storyteq.com/v4 marked "Legacy, Deprecated"; regional hosts europe-west1 and us-east4 introduced S18
UndatedCanopy API V1 (CanopyCloud era) deprecated for new development and removed from the portal list S20 S17
UndatedLUMA sign-in clients migrating to Keycloak; Identity Broker for external integrations S4
2024-04-18PHP client for v4 archived S34

The product changelog has no API entries S21. Storyteq does not publish a dated API changelog.

Stored API specs

2 files · 115 KB · verbatim copies of public vendor filesSpecs README & provenance
FileFormatSizeDownload
storyteq_api-v4_openapi.yamlOpenAPI13 KBDownload
storyteq_cmp-v2_openapi.yamlOpenAPI101 KBDownload
Search the wiki