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.
{"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":""}