The Content Bank Assets endpoints allow you to retrieve media assets from your Storyteller content bank. The content bank stores processed media files with metadata, thumbnails, and processing status information.
You can page this endpoint using either currentPage + pageSize or legacy-style skipCount + maxResultCount.
In legacy mode, omitted aliases fall back to skipCount=0 and maxResultCount=10. Because integrations responses still return currentPage, skipCount must land on a page boundary for the effective page size.
{"status":404,"type":"https://datatracker.ietf.org/doc/html/rfc7231#section-6.5.4","title":"Not Found","detail":"Content bank asset with externalId video-001 not found","instance":""}
constfetch=require('node-fetch');asyncfunctiongetContentBankAssets(searchText='',currentPage=1,pageSize=10,sort=''){constparams=newURLSearchParams({...(searchText&&{searchText}),currentPage:currentPage.toString(),pageSize:pageSize.toString(),...(sort&&{sort})});try{constresponse=awaitfetch(`https://integrations.usestoryteller.com/api/content-bank-assets?${params}`,{method:'GET',headers:{'x-storyteller-api-key':process.env.STORYTELLER_API_KEY}});if(!response.ok){consterrorData=awaitresponse.json();thrownewError(`HTTP ${response.status}: ${errorData.detail}`);}constdata=awaitresponse.json();returndata;}catch(error){console.error('Error fetching content bank assets:',error);throwerror;}}asyncfunctiongetContentBankAssetByExternalId(externalId){try{constresponse=awaitfetch(`https://integrations.usestoryteller.com/api/content-bank-assets/${externalId}`,{method:'GET',headers:{'x-storyteller-api-key':process.env.STORYTELLER_API_KEY}});if(!response.ok){consterrorData=awaitresponse.json();thrownewError(`HTTP ${response.status}: ${errorData.detail}`);}constasset=awaitresponse.json();returnasset;}catch(error){console.error('Error fetching content bank asset:',error);throwerror;}}// Usage examplesasyncfunctionexamples(){// Get all assetsconstallAssets=awaitgetContentBankAssets();console.log(`Found ${allAssets.contentBankAssets.length} assets`);// Search for video assetsconstvideoAssets=awaitgetContentBankAssets('video',1,20);console.log(`Found ${videoAssets.contentBankAssets.length} video assets`);// Get a specific asset by external IDconstspecificAsset=awaitgetContentBankAssetByExternalId('video-001');console.log(`Asset: ${specificAsset.title} (${specificAsset.type})`);// Filter by asset typeconstuserGeneratedAssets=allAssets.contentBankAssets.filter(asset=>asset.assetType==='UserGenerated');console.log(`Found ${userGeneratedAssets.length} user-generated assets`);}
importrequestsimportosfromurllib.parseimporturlencodedefget_content_bank_assets(search_text='',current_page=1,page_size=10,sort=''):url='https://integrations.usestoryteller.com/api/content-bank-assets'headers={'x-storyteller-api-key':os.environ.get('STORYTELLER_API_KEY')}params={'currentPage':current_page,'pageSize':page_size}ifsearch_text:params['searchText']=search_textifsort:params['sort']=sorttry:response=requests.get(url,headers=headers,params=params)response.raise_for_status()data=response.json()returndataexceptrequests.exceptions.RequestExceptionase:print(f'Error fetching content bank assets: {e}')ifhasattr(e.response,'json'):print(f'Error details: {e.response.json()}')raisedefget_content_bank_asset_by_external_id(external_id):url=f'https://integrations.usestoryteller.com/api/content-bank-assets/{external_id}'headers={'x-storyteller-api-key':os.environ.get('STORYTELLER_API_KEY')}try:response=requests.get(url,headers=headers)response.raise_for_status()asset=response.json()returnassetexceptrequests.exceptions.RequestExceptionase:print(f'Error fetching content bank asset: {e}')ifhasattr(e.response,'json'):print(f'Error details: {e.response.json()}')raise# Usage examplestry:# Get all assetsall_assets=get_content_bank_assets()print(f'Found {len(all_assets["contentBankAssets"])} assets')# Search for video assetsvideo_assets=get_content_bank_assets(search_text='video',page_size=20)print(f'Found {len(video_assets["contentBankAssets"])} video assets')# Get a specific asset by external IDspecific_asset=get_content_bank_asset_by_external_id('video-001')print(f'Asset: {specific_asset["title"]} ({specific_asset["type"]})')# Filter by asset typeuser_generated_assets=[assetforassetinall_assets['contentBankAssets']ifasset['assetType']=='UserGenerated']print(f'Found {len(user_generated_assets)} user-generated assets')exceptExceptionase:print(f'Failed to fetch content bank assets: {e}')
usingSystem;usingSystem.Net.Http;usingSystem.Threading.Tasks;usingSystem.Collections.Generic;usingNewtonsoft.Json;publicclassContentBankAssetsClient{privatereadonlyHttpClient_httpClient;privatereadonlystring_baseUrl="https://integrations.usestoryteller.com";publicContentBankAssetsClient(stringapiKey){_httpClient=newHttpClient();_httpClient.DefaultRequestHeaders.Add("x-storyteller-api-key",apiKey);}publicasyncTask<ContentBankAssetsResponse>GetContentBankAssetsAsync(stringsearchText="",intcurrentPage=1,intpageSize=10,stringsort=""){try{varqueryParams=newList<string>{$"currentPage={currentPage}",$"pageSize={pageSize}"};if(!string.IsNullOrEmpty(searchText)){queryParams.Add($"searchText={Uri.EscapeDataString(searchText)}");}if(!string.IsNullOrEmpty(sort)){queryParams.Add($"sort={sort}");}varqueryString=string.Join("&",queryParams);varresponse=await_httpClient.GetAsync($"{_baseUrl}/api/content-bank-assets?{queryString}");response.EnsureSuccessStatusCode();varresponseContent=awaitresponse.Content.ReadAsStringAsync();varassets=JsonConvert.DeserializeObject<ContentBankAssetsResponse>(responseContent);returnassets;}catch(HttpRequestExceptionex){thrownewException($"Error fetching content bank assets: {ex.Message}",ex);}}publicasyncTask<ContentBankAsset>GetContentBankAssetByExternalIdAsync(stringexternalId){try{varresponse=await_httpClient.GetAsync($"{_baseUrl}/api/content-bank-assets/{externalId}");response.EnsureSuccessStatusCode();varresponseContent=awaitresponse.Content.ReadAsStringAsync();varasset=JsonConvert.DeserializeObject<ContentBankAsset>(responseContent);returnasset;}catch(HttpRequestExceptionex){thrownewException($"Error fetching content bank asset: {ex.Message}",ex);}}}publicclassContentBankAssetsResponse{publicContentBankAsset[]ContentBankAssets{get;set;}publicintPageSize{get;set;}publicintCurrentPage{get;set;}publicintTotalPages{get;set;}}publicclassContentBankAsset{publicGuidId{get;set;}publicstringExternalId{get;set;}publicstringTitle{get;set;}publicstringType{get;set;}publicstringAssetType{get;set;}publicintWidth{get;set;}publicintHeight{get;set;}publicstringMimeType{get;set;}publicdoubleDuration{get;set;}publicstringAssetUrl{get;set;}publicstringPlaycardUrl{get;set;}publicboolProcessing{get;set;}publicboolHidden{get;set;}publicboolHasError{get;set;}publicDateTimeCreatedAt{get;set;}publicDateTimeUpdatedAt{get;set;}publicstringCmsUrl{get;set;}publicCategory[]Categories{get;set;}}publicclassCategory{publicstringTitle{get;set;}publicstringExternalId{get;set;}}// Usagevarclient=newContentBankAssetsClient(Environment.GetEnvironmentVariable("STORYTELLER_API_KEY"));try{// Get all assetsvarallAssets=awaitclient.GetContentBankAssetsAsync();Console.WriteLine($"Found {allAssets.ContentBankAssets.Length} assets");// Search for video assetsvarvideoAssets=awaitclient.GetContentBankAssetsAsync("video",1,20);Console.WriteLine($"Found {videoAssets.ContentBankAssets.Length} video assets");// Get a specific asset by external IDvarspecificAsset=awaitclient.GetContentBankAssetByExternalIdAsync("video-001");Console.WriteLine($"Asset: {specificAsset.Title} ({specificAsset.Type})");// Filter by asset typevaruserGeneratedAssets=allAssets.ContentBankAssets.Where(a=>a.AssetType=="UserGenerated").ToArray();Console.WriteLine($"Found {userGeneratedAssets.Length} user-generated assets");}catch(Exceptionex){Console.WriteLine($"Error: {ex.Message}");}
# Get all content bank assets (first page)curl-XGET"https://integrations.usestoryteller.com/api/content-bank-assets"\-H"x-storyteller-api-key: your-api-key-here"# Search for video assetscurl-XGET"https://integrations.usestoryteller.com/api/content-bank-assets?searchText=video&pageSize=20"\-H"x-storyteller-api-key: your-api-key-here"# Get a specific asset by external IDcurl-XGET"https://integrations.usestoryteller.com/api/content-bank-assets/video-001"\-H"x-storyteller-api-key: your-api-key-here"# Get assets sorted by creation datecurl-XGET"https://integrations.usestoryteller.com/api/content-bank-assets?sort=CreatedDesc&pageSize=50"\-H"x-storyteller-api-key: your-api-key-here"
Content bank assets can be referenced in workflow metadata:
// 1. Get available assetsconstassetsData=awaitgetContentBankAssets();constvideoAssets=assetsData.contentBankAssets.filter(asset=>asset.type==='Video');// 2. Use asset information in workflow metadataconstworkflowMetadata={'https://example.com/new-video.mp4':{'Title':'New Product Video','baseVideoId':videoAssets[0].externalId,// Reference existing asset'templateAssetUrl':videoAssets[0].assetUrl}};// 3. Execute workflow with asset referencesawaitexecuteWorkflow(['create-video-variation'],['https://example.com/new-video.mp4'],workflowMetadata);
asyncfunctioncheckProcessingStatus(externalId){constasset=awaitgetContentBankAssetByExternalId(externalId);if(asset.processing){console.log(`Asset ${externalId} is still processing...`);return'processing';}elseif(asset.hasError){console.log(`Asset ${externalId} encountered an error during processing`);return'error';}else{console.log(`Asset ${externalId} is ready: ${asset.assetUrl}`);return'ready';}}// Poll for processing completionasyncfunctionwaitForProcessing(externalId,maxAttempts=30){for(letattempt=1;attempt<=maxAttempts;attempt++){conststatus=awaitcheckProcessingStatus(externalId);if(status==='ready'){returnawaitgetContentBankAssetByExternalId(externalId);}elseif(status==='error'){thrownewError(`Asset processing failed: ${externalId}`);}// Wait before next checkawaitnewPromise(resolve=>setTimeout(resolve,5000));}thrownewError(`Asset processing timeout: ${externalId}`);}
{"status":401,"type":"https://datatracker.ietf.org/doc/html/rfc7235#section-3.1","title":"Unauthorized","detail":"No valid API key provided","instance":""}
{"status":404,"type":"https://datatracker.ietf.org/doc/html/rfc7231#section-6.5.4","title":"Not Found","detail":"Content bank asset with externalId video-001 not found","instance":""}