Invoke the Action API to retrieve information about invoked Actions.
- API v1.5 Documentation
- Payload Reference
API Endpoint Reference (1.5)
Tenovos has introduced version 1.5 to provide non-breaking improvements over previous versions.
Key Changes:
- Authentication Standards now include OAuth2 code flow.
- Client ID is no longer required to be passed when requesting an Authorization token using our Standard Auth from v1.4
- New endpoints have been added and will continue to be added until v2 is generally available to all customers.
- Adaptive Template endpoints
- A new Get Asset endpoint with a simplified Response
- A new Create Asset endpoint with simplified payloads for the Request and Response
- A new Update Asset endpoint with simplified payloads for the Request and Response
- Metadata Admin API endpoints for managing Attributes, Groups, and Templates
- We've made some performance improvements to most endpoints
Tenovos Content Delivery Network (CDN) - Coming Soon!
Tenovos CDN: Pull Zone Overview
Tenovos CDN provides global content acceleration and optimization through a pull zone architecture, ensuring that your assets are delivered to end users with maximum speed, reliability, and efficiency. A Content Delivery Network (CDN) works by caching static content—such as images, videos, and other media—on servers distributed across the globe. When an asset is requested, the CDN serves it from the nearest edge location, reducing load times and offloading traffic from the origin server, which in this case is Tenovos DAM.
A pull zone is the core mechanism that powers this system. It automatically fetches content from the origin the first time it is requested, then caches it at the edge. Subsequent requests are served directly from the CDN cache, improving response times and reducing bandwidth consumption.
Through the Tenovos CDN API, you can create, update, and manage pull zones programmatically. Pull zones support advanced features such as global edge caching, cache purging, bandwidth controls, and real-time performance statistics like cache hit rate and geographic request distribution. Optional optimization settings allow you to enhance performance further by enabling image compression, WebP and AVIF support, and content minification.
With just a few API calls, you can fully integrate high-performance content delivery into your Tenovos workflows—no complex infrastructure required.
Invoke the Collection API to create, retrieve, edit, and delete Collections. Collections are used to group and catalog related Assets for quick access and consumption. Collections can be configured as:
- private: Visible only to the user who created the Collection.
- secured: Visible to users with.
When retrieving the Assets within a Collection, the requesting user will only see the Assets that the user has access to view. For example, a librarian may see all Assets within a Collection, but a general consumer user may only see a portion of those Assets, due to limited security access.
Invoke the Metadata Attributes API to retrieve Metadata Attributes, and to create, read, update, and delete Metadata Attribute definitions. Metadata Attributes come in varying types, including Text, Date, Controlled Vocabulary, Tabular, and Cascading, and can be assigned to Metadata Groups and Templates.
Admin Endpoints (NEW!): Create, read, update, and delete Metadata Attributes. These endpoints require the Metadata Management admin privilege.
Invoke the Metadata Templates API to create, read, update, and delete Metadata Templates, and to apply Metadata definition changes. A Metadata Template defines a set of Metadata Attributes that, when assigned to an Asset, become available for population on that Asset.
Admin Endpoints (NEW!): Create, read, update, and delete Metadata Templates. These endpoints require the Metadata Management admin privilege.
Request
Retrieve a paginated, searchable list of metadata tables for UI consumption. Column detail is excluded to keep this endpoint lightweight; only a count (fieldCount) is returned here, with full column detail available via GET /metadata/tables/{id}.
Defaults:
sortFielddefaults toname.orderdefaults toasc.fromdefaults to0.limitdefaults to100, maximum100.
Business Rules:
searchTermis a case-insensitive partial match on tablename.inUseaccepts a boolean (true/false— aggregate: used anywhere at all) or one ofmetadataGroups,metadataTemplates, filtering to tables referenced in that specific usage category. Omitted applies no filter.inUseandisSmartTableare both validsortFieldvalues.isSmartTablefilters to smart or standard tables only; omitted applies no filter.includeSystemdefaults tofalse. Whentrue, also returns read-only, platform-owned tables used internally by various platform functionalities, alongside user-created ones. System tables cannot be edited or deleted by users.visibleandtableNameVisibleare excluded entirely from this response — both are dead fields (the admin screen never lets anyone set either to anything but its fixed default).usedInis shaped{ metadataGroups: [], metadataTemplates: [] }and never includes anattributescategory — attributes never reference a table; a table contains attributes as its columns, never the reverse.
The user submitting the request must have the Metadata Template Management admin privilege.
Filters by usage status. true/false filters on aggregate usage (referenced anywhere at all). One of metadataGroups, metadataTemplates filters to tables referenced in that specific usage category. Omitted applies no filter.
Returns only tables referenced directly in at least one Group.
Returns only tables referenced directly in at least one Template.
Filters to smart (true) or standard (false) tables only. Omitted applies no filter.
When true, also returns read-only, platform-owned tables used internally by various platform functionalities, in addition to user-created ones. System tables cannot be edited or deleted by users. Defaults to false.
Number of results to return per page. Defaults to 100, maximum 100.
Field to sort results by. Defaults to name.
- https://api.uat.tenovos.io/v1/metadata/tables
- https://api.tenovos.io/v1/metadata/tables
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X GET \
'https://api.uat.tenovos.io/v1/metadata/tables?searchTerm=string&inUse=true&isSmartTable=true&includeSystem=false&from=0&limit=100&sortField=name&order=asc' \
-H 'Authorization: string' \
-H 'X-API-Key: YOUR_API_KEY_HERE'{ "hitCount": 24, "results": [ { … } ] }
Request
Create a new metadata table in a single call.
Defaults:
isSmartTabledefaults tofalse.
Business Rules:
tableFieldsmust contain between 1 and 12 effective columns — a plain or controlled-vocabulary field counts as 1, a cascade field counts as its number of levels. Example: a table with 9 plain fields can add one more cascade only if that cascade has 3 or fewer levels.- Each
tableFields[].fieldIdmust reference an existing attribute or cascade (never another table); no two entries may reference the samefieldId. isSingleRowandisSmartTableare mutually exclusive and permanently fixed once set.isSmartTableis subject to a 25-per-customer smart-table cap, enforced at creation time.- A duplicate
name/searchFieldis rejected with409.
The user submitting the request must have the Metadata Template Management admin privilege.
JSON object defining the table to create. Required: name, isSingleRow, tableFields. Optional: isSmartTable (defaults to false).
Display name for the new table. Maximum 32 characters.
Whether the table is a smart table. Defaults to false. Permanent once set; mutually exclusive with isSingleRow: true. Subject to a 25-per-customer smart-table cap, enforced at creation time.
Columns for the table. Between 1 and 12 effective columns — a plain or controlled-vocabulary field counts as 1, a cascade field counts as its number of levels. Each fieldId must reference an existing attribute or cascade (never another table); no two entries may reference the same fieldId.
- https://api.uat.tenovos.io/v1/metadata/tables
- https://api.tenovos.io/v1/metadata/tables
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
https://api.uat.tenovos.io/v1/metadata/tables \
-H 'Authorization: string' \
-H 'Content-Type: application/json' \
-H 'X-API-Key: YOUR_API_KEY_HERE' \
-d '{
"name": "Store Locations Table",
"isSingleRow": false,
"isSmartTable": false,
"tableFields": [
{
"fieldOrder": 1,
"fieldId": "d3f8a1c2-6b4e-4a17-9c3f-2e7b5d0a8f61"
},
{
"fieldOrder": 2,
"fieldId": "b7e41f2a-6c9d-4a17-8f3b-2d5c8a0e3f61"
},
{
"fieldOrder": 3,
"fieldId": "f4a92e6d-3c81-4f5a-9d27-6b3e8a1c4f90"
}
]
}'Created. Same shape as GET /metadata/tables/{id}, usedIn empty.
Fixed at creation. Remains false while a standard-to-smart conversion is pending (see convertTo).
Set to smart while a standard-to-smart conversion is pending "Apply Changes"; null otherwise.
Ordered columns. Stays flat even for a cascade-backed column — no nested expansion of the cascade's own levels here.
User-profile id of the table's creator.
User-profile id of the last user to update the table.
{ "id": "e6a91f4c-8b2d-4a17-9c6e-3f5a8d1b7c92", "name": "Store Locations Table", "searchField": "store_locations_table", "isSingleRow": false, "isSmartTable": false, "convertTo": null, "featured": null, "tableFields": [ { … }, { … }, { … } ], "createdBy": "8f2a5c91-4e6d-4b83-9a17-6c0d3e8b2f45", "createdEpoch": 1772704800000, "createdDate": "2026-03-05T10:00:00Z", "lastUpdatedBy": "8f2a5c91-4e6d-4b83-9a17-6c0d3e8b2f45", "lastUpdatedEpoch": 1772704800000, "lastUpdatedDate": "2026-03-05T10:00:00Z", "usedIn": { "metadataGroups": [], "metadataTemplates": [] } }
Request
Retrieve a single metadata table by its ID, returning the same fields as the list endpoint (minus fieldCount) plus the full, flat list of columns (tableFields), each denormalized with a type indicator so the UI can render the right control without a second lookup.
The user submitting the request must have the Metadata Template Management admin privilege.
- https://api.uat.tenovos.io/v1/metadata/tables/{id}
- https://api.tenovos.io/v1/metadata/tables/{id}
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X GET \
https://api.uat.tenovos.io/v1/metadata/tables/e6a91f4c-8b2d-4a17-9c6e-3f5a8d1b7c92 \
-H 'Authorization: string' \
-H 'X-API-Key: YOUR_API_KEY_HERE'The requested metadata table.
Fixed at creation. Remains false while a standard-to-smart conversion is pending (see convertTo).
Set to smart while a standard-to-smart conversion is pending "Apply Changes"; null otherwise.
Ordered columns. Stays flat even for a cascade-backed column — no nested expansion of the cascade's own levels here.
User-profile id of the table's creator.
User-profile id of the last user to update the table.
{ "id": "e6a91f4c-8b2d-4a17-9c6e-3f5a8d1b7c92", "name": "Store Locations Table", "searchField": "store_locations_table", "isSingleRow": false, "isSmartTable": false, "convertTo": null, "featured": null, "tableFields": [ { … }, { … }, { … } ], "createdBy": "8f2a5c91-4e6d-4b83-9a17-6c0d3e8b2f45", "createdEpoch": 1772704800000, "createdDate": "2026-03-05T10:00:00Z", "lastUpdatedBy": "8f2a5c91-4e6d-4b83-9a17-6c0d3e8b2f45", "lastUpdatedEpoch": 1773325200000, "lastUpdatedDate": "2026-03-12T14:20:00Z", "usedIn": { "metadataGroups": [], "metadataTemplates": [ … ] } }
Request
Update an existing table's name and/or its column list. searchField, isSingleRow, isSmartTable, and featured are permanently fixed once set and are never accepted here — featured in particular exists specifically to protect a table from deletion; if it could be toggled here, that protection would mean nothing.
Business Rules:
- At least one of
name,tableFieldsis required. nameis capped at 32 characters and does not regeneratesearchField.- When
tableFieldsis provided, it fully replaces the existing columns — same effective-12-column, valid-reference, and no-duplicate-fieldIdrules as create. - A new
namecolliding with an existing table'sname/searchFieldis rejected with409.
The user submitting the request must have the Metadata Template Management admin privilege.
JSON object updating the table. At least one of name, tableFields is required. searchField, isSingleRow, isSmartTable, and featured are never accepted.
New display name for the table. Maximum 32 characters. Does not regenerate searchField.
- https://api.uat.tenovos.io/v1/metadata/tables/{id}
- https://api.tenovos.io/v1/metadata/tables/{id}
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
- Rename Table
- Replace Columns
curl -i -X PATCH \
https://api.uat.tenovos.io/v1/metadata/tables/e6a91f4c-8b2d-4a17-9c6e-3f5a8d1b7c92 \
-H 'Authorization: string' \
-H 'Content-Type: application/json' \
-H 'X-API-Key: YOUR_API_KEY_HERE' \
-d '{
"name": "Store Locations Table (US)"
}'Updated. Same shape as GET /metadata/tables/{id}, lastUpdated* refreshed; createdBy/createdEpoch unchanged.
Fixed at creation. Remains false while a standard-to-smart conversion is pending (see convertTo).
Set to smart while a standard-to-smart conversion is pending "Apply Changes"; null otherwise.
Ordered columns. Stays flat even for a cascade-backed column — no nested expansion of the cascade's own levels here.
User-profile id of the table's creator.
User-profile id of the last user to update the table.
{ "id": "e6a91f4c-8b2d-4a17-9c6e-3f5a8d1b7c92", "name": "Store Locations Table", "searchField": "store_locations_table", "isSingleRow": false, "isSmartTable": false, "convertTo": null, "featured": null, "tableFields": [ { … } ], "createdBy": "8f2a5c91-4e6d-4b83-9a17-6c0d3e8b2f45", "createdEpoch": 1772704800000, "createdDate": "2026-03-05T10:00:00Z", "lastUpdatedBy": "8f2a5c91-4e6d-4b83-9a17-6c0d3e8b2f45", "lastUpdatedEpoch": 1773325200000, "lastUpdatedDate": "2026-03-12T14:20:00Z", "usedIn": { "metadataGroups": [ … ], "metadataTemplates": [ … ] } }
Request
Permanently remove a metadata table by its ID. Deletion is blocked if the table is featured, and blocked if it is still referenced by any group or template.
Business Rules:
- Checks run in this order: not found, then featured, then in-use.
The user submitting the request must have the Metadata Template Management admin privilege.
- https://api.uat.tenovos.io/v1/metadata/tables/{id}
- https://api.tenovos.io/v1/metadata/tables/{id}
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X DELETE \
https://api.uat.tenovos.io/v1/metadata/tables/e6a91f4c-8b2d-4a17-9c6e-3f5a8d1b7c92 \
-H 'Authorization: string' \
-H 'X-API-Key: YOUR_API_KEY_HERE'Request
Stage a standard table for one-way conversion to a smart table. This endpoint does not perform the search-index remapping migration itself — that happens later, generically, when the admin applies changes in the metadata admin screen. Conversion is irreversible once it completes, which is why it's its own deliberate endpoint rather than something that could happen as a side effect of a routine field update via PATCH /metadata/tables/{id}.
Business Rules:
isSingleRowtables cannot be converted.- At least one column, directly or via a cascade level, must be facetable.
- Subject to the same 25-per-customer smart-table cap enforced at creation.
- A table that's already smart, or already has a conversion pending, is rejected with
409.
The user submitting the request must have the Metadata Template Management admin privilege.
- https://api.uat.tenovos.io/v1/metadata/tables/{id}/convert-to-smart
- https://api.tenovos.io/v1/metadata/tables/{id}/convert-to-smart
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
https://api.uat.tenovos.io/v1/metadata/tables/e6a91f4c-8b2d-4a17-9c6e-3f5a8d1b7c92/convert-to-smart \
-H 'Authorization: string' \
-H 'X-API-Key: YOUR_API_KEY_HERE'Conversion staged. Same shape as GET /metadata/tables/{id}, with convertTo set to smart; isSmartTable remains false until the reindex completes separately via "Apply Changes".
Fixed at creation. Remains false while a standard-to-smart conversion is pending (see convertTo).
Set to smart while a standard-to-smart conversion is pending "Apply Changes"; null otherwise.
Ordered columns. Stays flat even for a cascade-backed column — no nested expansion of the cascade's own levels here.
User-profile id of the table's creator.
User-profile id of the last user to update the table.
{ "id": "e6a91f4c-8b2d-4a17-9c6e-3f5a8d1b7c92", "name": "Store Locations Table", "searchField": "store_locations_table", "isSingleRow": false, "isSmartTable": false, "convertTo": "smart", "featured": null, "tableFields": [ { … } ], "createdBy": "8f2a5c91-4e6d-4b83-9a17-6c0d3e8b2f45", "createdEpoch": 1772704800000, "createdDate": "2026-03-05T10:00:00Z", "lastUpdatedBy": "8f2a5c91-4e6d-4b83-9a17-6c0d3e8b2f45", "lastUpdatedEpoch": 1773325200000, "lastUpdatedDate": "2026-03-12T14:20:00Z", "usedIn": { "metadataGroups": [], "metadataTemplates": [] } }
Invoke the Story Boards API to retrieve and manage Story Boards. Story Boards are curated content experiences that combine collections, saved searches, and other content blocks into a single shareable view.
Coming Soon: Additional endpoints for creating, updating, and deleting Story Boards.
Tenovos Webhook Subscriptions
For more information about our Webhooks, see the Webhook section of our Developer Portal