DAM Wiki

Tenovos API

Tenovos Corporation · New York, NY, USA · Founded 2018 · independent, VC-backedVerified 2026-10-08 · 81 sources
  • SaaS
  • Enterprise
  • REST API
  • OpenAPI spec
  • Webhooks
Complete · 7 of 7 pages
81sources
3API specs
10-08verified 2026
Official website ↗Tenovos alternatives →

Scope: the public developer documentation at api.tenovos.com (Redocly) S1. It covers three things:

  • the Tenovos REST API v1.5 for the DAM (called "Hermes" in the portal URLs), with v1 deprecated;
  • the Webhooks service (outbound events);
  • the Content Intelligence Platform API, a separate RPC-style API on its own host that matches the Tenovos Glass "no migration" model S8 S9.

The portal's v2 pages and training pages were removed from navigation. Some training pages survive as Markdown files linked from the FAQ S16 S23.

At a glance

API styles
REST/JSON over HTTPS for the DAM API S2 S20. The Content Intelligence API uses POST/api/v1/{service}/{verb} operations with JSON bodies (RPC-style) S9. No GraphQL found.
Base URL(s)
v1.5: one shared host for all customers: https://api.tenovos.io/v1 (production) and https://api.uat.tenovos.io/v1 (UAT) S5 S7. v1 (deprecated): a base URL per customer account, of the form https://{tenant}.services.tenovos.io/content-store-v1 S5. Content Intelligence: https://api.tenovos.net S9. Webhooks spec servers: https://api.tenovos.io/v2 and UAT S15. Non-production and production accounts use different base URLs S2.
Current version(s) & deprecations
v1.5 is the current version used by production customers S2. v1 (1.0–1.4) has been in maintenance mode since 2024-03 (no additions); end of support 2026-07-31, a date now past; whether v1 hosts still answer is Unknown S2 S3. v1 → v1.5 only needs a base-URL change: same endpoints, same request and response shapes S5. v2: mentioned in the OAuth page, the FAQ and the webhooks spec, but its reference pages were removed. Its status is Unknown S6 S16 S23. Unverified An older portal page still says v1 is the only production version and v1.5 a beta/private preview S4.
Auth methods
Standard Tenovos auth: a customer-specific API key in the X-API-Key header on every call, plus a session token from POST/auth/token (username + password) S7 S17. The token is a JWT; the spec's example token and response fields (userPoolId) point to Amazon Cognito S7. OAuth 2.0 authorization code was added in v1.5 as an alternative ("one or the other, not both") S4 S6. The consent, scope and client-credential setup pages are still "Coming Soon" S6. Content Intelligence API: bearer API keys tied to a role S9.
Token lifetime / refresh
Access token expires after 1 hour. Send the previous auth response (access + refresh token) to POST/auth/token to refresh. The refresh token works for up to 30 days or until revoked S7 S17. DELETE/auth/token expires a token early S7. Content Intelligence API keys: optional expiry; without one they do not expire S9.
Scopes / permission model
Every response is limited by the permissions of the API user S17. Two layers: role privileges (e.g. Download, Upload, Replace Mezzanine, Metadata Management, User Management, Security Template Management) and security templates applied to assets, granted to user groups S7 S18. Tenovos suggests a dedicated user per integration (e.g. functional-api-cms) S17. The webhooks spec declares OAuth2 scopes read, write, admin S15. The OAuth scope categories page is "Coming Soon" S6.
Official spec
Yes, downloadable. OpenAPI 3.0.0 bundle for v1.5 (87 paths, 127 operations). OpenAPI 3.0.0 bundle for the Content Intelligence API (135 operations). OpenAPI 3.1.0 webhooks definition (59 events) S7 S9 S15. Archived copies on DAM Wiki: API spec downloads. No Postman collection found.
Rate limits
Not documented for the REST APIs. An unauthenticated 401 from api.tenovos.io/v1 carried x-ratelimit-limit: 60000 and x-ratelimit-reset: 60 S22 Unverified (header meaning and scope not documented). Every Content Intelligence operation lists a 429 response, without a number S9. Webhook deliveries to customer endpoints are rate-limited per customer or per endpoint S10.
Pagination
v1.5 search: offset paging with from + limit (schema max 100; default 50). Results are capped at 10,000 per search S7 S18. Deep result sets: POST/asset/scan with a cursor S7. Admin list endpoints (/metadata/*, /security/*, /users): from + limit (default 100); /storyboards uses limit + cursor S7. Content Intelligence: pagination.maxSize + opaque pageCursor S9.
Webhooks / events
Yes. Subscriptions are managed through the REST API (/webhooks/endpoint…) or the Webhooks section of the Admin UI S11 S7. 59 available event types S14. Deliveries are HMAC-SHA256 signed, optionally with OAuth client-credentials towards the customer endpoint S11 S12. Retries span about 27.5 hours S13.
Official SDKs
None found. Training exercises give Node.js 16 sample code (HTTP helper, auth, search, upload, relationships, collections) S17. The four public GitHub repositories are all archived (including a tenovos-dev-starter-kit) S80. No npm or PyPI package found. The "SDK" on the Connect page is for extending Connect connectors S30.
Sandbox / trial access
Customers get UAT and production accounts with separate base URLs and keys S5 S17. API access comes with "an active subscription"; the key and connection details are requested through a Support ticket S16 S20. No public sandbox or free trial found (demo request only) S27.

Authentication

Standard Tenovos auth (v1 and v1.5) S7 S17 S20

  1. Get the API key (per environment: UAT and production) and the base URL from Tenovos Support. A v1 doc note says the key would later be shown in Admin → Configuration → API key. Whether that exists today is Unknown S20.
  2. Create a local user in the Tenovos account for the integration. Give it a role and groups with just enough privileges and security-template permissions S17.
  3. POST{base}/auth/token with header X-API-Key and a JSON body {username, password}. Since v1.5, clientId is no longer required S4 S7.
  4. The response holds a session object with the access token (JWT) and refresh token, plus account details (endpointUrl, clientId, userPoolId) S7.
  5. Business calls send X-API-Key plus the token in Authorization S7. Unverified The token operation's description calls the header AccessToken, while every other operation documents Authorization. DELETE/auth/token uses AccessToken S7.
  6. Refresh: post the previous auth response back to /auth/token (about 233 ms on average, against about 3.7 s for a new token, per the spec) S7.

OAuth 2.0 (v1.5 and 2.x) S6 S15

  • The authorization code flow is supported. The OAuth page also describes service accounts and web applications (JavaScript origins, redirect URIs).
  • How to register an OAuth client in Tenovos Admin, the scope categories and client-secret rotation are all marked "Coming Soon". The setup procedure is therefore Not public.
  • The webhooks spec declares https://api.tenovos.io/v2/oauth/authorize and /v2/oauth/token S15. Unauthenticated requests to both return 403 from the load balancer S22.

Other auth facts

  • POST/auth/impersonate is marked deprecated in v1.5 S7.
  • Users can be local (password) or federated (an SSO service). Federated users are created through POST/user S7.
  • Content Intelligence API: POST/api/v1/api-key/create-api-key returns the full key once (stored hashed; only the last four characters are shown afterwards). The key is tied to a role. Keys can be listed and revoked S9. Interactive login, SSO and MFA for that platform are handled by Clerk (an external identity service) S9.

Core resources

From the v1.5 OpenAPI bundle (base https://api.tenovos.io/v1) S7 unless noted.

ResourceEndpointsNotes
AuthenticationPOST/auth/token, DELETE/auth/token, POST/auth/impersonate (deprecated)New token / refresh / expire
AssetsPOST/asset, PATCH/asset (bulk edit), GET|PATCH /asset/{id}, POST/asset/{id}/delete, GET/asset/{id}/history, POST/assets/asset, GET|PATCH /assets/asset/{id}POST/asset creates an asset, a new version (pass originalFileId) or a metadata-only asset. The /assets/asset routes are the v1.5 "simplified" create/get/update. GET/asset/{id} accepts an object ID or a file ID
VersionsGET/asset/{id}/version, GET/asset/{id}/latest, POST/asset/{id}/version/promoteVersion list, latest, promote a prior version
Uploads & binariesPOST/asset (presigned URLs), POST/asset/complete, POST/asset/content/preview, GET/asset/{id}/content, POST/asset/exposeSee Uploads & binaries
RelationshipsGET|POST|PATCH /asset/{id}/linkTyped parent/derivative relationships between assets
Renditions / transformsPOST/asset/transformTransform and download, or e-mail a link. Access limited: needs an extra X-API-Verification-Key from Support
SharingPOST/asset/share, POST/collection/{id}/shareShare assets or collections
SearchPOST/search/keyword, POST/search, POST/asset/scan, POST/search/collection, GET/search/users/{searchText}, GET/user/searchesSee Search & querying
CollectionsPOST/collection, GET|PATCH|DELETE /collection/{id}, PATCH/collections/{id}
Story Boards (portals)GET/storyboardsList only, cursor-paged
Metadata templatesGET/metadata/templates, GET|POST /metadata/template, GET|PATCH|DELETE /metadata/template/{id}, POST/metadata/applyTemplates group the attributes applied to an asset
Metadata attributes & groupsGET/metadata/attributes, GET/attributes, POST/metadata/attribute, GET|PATCH|DELETE /metadata/attribute/{id}, GET/metadata/groups, POST/metadata/group, GET|PATCH|DELETE /metadata/group/{id}Metadata admin API, added in v1.5 S4
Controlled vocabulariesGET/metadata/vocabularies, GET|POST /metadata/vocabulary, GET|PATCH|DELETE /metadata/vocabulary/{id}
Cascades & tablesGET|POST /metadata/cascades, GET|PATCH|DELETE /metadata/cascades/{id}, GET|POST /metadata/tables, GET|PATCH|DELETE /metadata/tables/{id}, POST/metadata/tables/{id}/convert-to-smartDependent pick-lists and table attributes
UsersGET|POST /user, GET|PATCH /user/{id}, PATCH/user/{id}/add-to-group, PATCH/user/{id}/remove-from-group, GET/users, GET/users/status-counts, GET/user/search/{searchText} (deprecated)Local or federated accounts
Security: roles & privilegesGET/roles, GET/roles/privileges, GET/security/permissions, GET|POST /security/roles, GET|PATCH|DELETE /security/roles/{id}
Security: templatesGET/security/template, GET|POST /security/templates, GET/security/templates/user, GET|PATCH|DELETE /security/templates/{templateId}Asset-level access templates
Security: groupsGET/security/groups, GET|POST /security/user-groups, POST/security/user-groups/bulk, GET|PATCH|DELETE /security/user-groups/{id}Bulk create: all-or-nothing, max 50 names per request
RightsPOST/rights/associations/removalThe only rights operation in v1.5. Rights projects, agreements and entities appear as webhook topics S14
Requests (upload/download requests)POST/request, PATCH|GET /request/{id}, POST/request/listList returns batches of 100, newest first
Workflow / proofingGET/workflow-templates, GET/proof/{id}/status, POST/proofing/user, POST/proof/{id}/reviewer-url, GET/action/{id}Proof status, reviewer links, async action status
Adaptive TemplatesPOST/template, POST/template/launchBrand-template endpoints added in v1.5 S4
CDN (tagged "Coming Soon!")GET|POST|PATCH /cdn/pullzone…, GET/cdn/pullzone/stats/{pullZoneId}Pull-zone management; not yet released per the tag
WebhooksPOST/webhooks/endpoint, GET/webhooks/endpoint/list, GET/webhooks/event-type/list, GET|PATCH|DELETE /webhooks/endpoint/{id}, PUT|DELETE /webhooks/endpoint/oauth/{endpointId}Subscription management

Content Intelligence Platform API (https://api.tenovos.net, all POST) S9

ServiceOperationsPurpose
Document Management (13)/api/v1/document/{create, retrieve, list, query, query-within, link, unlink, retrieve-links, update, delete, undelete, purge, reindex}Schemaless documents in a graph (nodes + typed links)
Document Types (6), Schemas (5), Rules (8)/api/v1/kind/…, /api/v1/schema/…, /api/v1/rule/{…, enable-rule, disable-rule, test-rule}Kinds (media, brand, campaign, category, toolkit, section, block), field schemas, event rules
Content Storage (18)/api/v1/content/{register, retrieve-upload-url, stage, retrieve-url, retrieve-info, list-info, …-adapter}Binaries behind pluggable storage adapters (S3, CDN origins), always through presigned URLs
Channels (23)/api/v1/channel/{list-channel-types, create-channel, enable-channel, retrieve-oauth-url, update-auth, scan-content, channel-stats, …}Connections to external sources (see Integrations)
Workflows (8), Actions (2), Jobs (4)/api/v1/flow/…, /api/v1/action/…, /api/v1/job/{list, retrieve, restart, cancel}Multi-step flows; each run tracked as a job
Media Processing (3)/api/v1/transform/{submit, status, cancel}Per-organisation transform queue: image, video, document, AI enrichment (via AWS Bedrock)
Sharing (6), Share Authentication (2), Shared Content (3)/api/v1/share/…, /api/v1/share-auth/{generate-otp, exchange-otp}, /api/v1/share-retrieval/…External shares with expiry, password or recipient lists; OTP access
Users (7), User Groups (9), Roles (7), Permissions (2), Access Control (4), Authentication (2), API Keys (3)/api/v1/user/…, /api/v1/user-group/…, /api/v1/role/…, /api/v1/access-control/{has-access, grant-access, revoke-access, …}, /api/v1/api-key/…RBAC plus resource-level access control

Data model

  • Asset (v1.5): identified by an objectId (UUID, also called Asset ID). Each file version has a fileId; originalFileId links versions to the first file S7. A new asset is metadata-only until content is uploaded S7.
  • Metadata: an asset has one metadata template (metadataTemplateId). Values are {metadataDefinitionId, metadataDefinitionValue} pairs. Controlled-vocabulary values are referenced by valueId S19 S7. Attribute types include textbox (max 250 characters), textarea (max 10,000; cannot be facetable), dropdown/vocabulary, cascades and tables. Flags include isRequired, isSearchable, isFacetable, isTypeahead, isSensitive, isMultiSelect, plus mapping from technical metadata S7. Search addresses custom fields as metadataDocument.{search_field} S7.
  • Security: each asset carries one or more security templates (securityTemplateIds). Users get access through groups granted permissions on those templates, plus role privileges S7 S18.
  • Relationships: typed links between a primary and a secondary asset (e.g. parent/derivative). Viewing them requires View access on both assets S7.
  • Federated assets: some asset operations accept S3 contentPaths for files that stay in an external location S7.
  • Content Intelligence: documents are schemaless JSON name/value records typed by a kind (ASSET, REFERENCE, COLLECTION, LAYOUT). They are linked by typed edges and indexed in OpenSearch. Binary content items are referenced separately S9.

Search & querying

S7 S18 unless noted.

  • POST/search/keyword: searchTerm[] (keywords, or facet expressions (Attribute Name:"Value"), a - prefix to exclude), filters[] (same syntax), operation AND (default) / OR / ANY, keywordSearchField (filename, asset ID, metadata or extracted document text), sortBy[{metadataDefinitionSearchField, order}], includeDeleted, includeVersions, excludes[] (drop heavy fields such as technicalMetadataDocument). Default 50 results; page with from = 0, 50, 100…
  • POST/search: the same plus relevancy: true (sort by relevance, desc), includes[] to return more fields, and limit (schema maximum 100). Unverified The operation text says limit goes "up to 50", while the schema allows 100.
  • Result window: at most 10,000 results per search S18. Beyond that, use POST/asset/scan (cursor; optional assetType) S7.
  • Response times are given per operation (e.g. about 4.2 s on average for keyword search) S7.
  • Content Intelligence: document/query (full-text and field-level) and query-within (scoped to a hierarchy such as a brand or campaign) S9.

Uploads & binaries

S7 S19

  1. Look up the IDs you need (metadata template, attribute and vocabulary values, security templates).
  2. POST/asset with the metadata, securityTemplateIds and filename. The response returns the IDs plus presigned S3 URLs (urls[] with partNumber) and an uploadId. A metadata-only asset gets a single url instead.
  3. PUT the binary to each presigned URL. The vendor examples point at S3 Transfer Acceleration endpoints.
  4. For multipart uploads (parts of 100 MB, not configurable; files of at least 5 MB), call POST/asset/complete to complete or abort. Files of 100 MB or less do not need this step.
  • Size limits Unverified: the v1.5 POST/asset text says content must be ≤ 5 GB, while the large-upload training page says its multipart example is for files larger than 5 GB S7 S19. The real maximum is Unknown.
  • Download: GET/asset/{id}/content returns a presigned URL to the source file (needs download rights). POST/asset/expose creates temporary presigned links with an expiry in seconds (needs the Download privilege) S7.
  • Preview replacement: POST/asset/content/preview (needs the Replace Mezzanine privilege) S7.
  • Content Intelligence: content/retrieve-upload-url gives presigned upload URLs; content/stage pushes content to a CDN origin adapter S9.

Events & webhooks

  • Model: events (create, update, delete, share, download, restore, purge…) on topics (asset, asset metadata, asset renditions, asset security, collection, metadata attribute/group/template/vocabulary, relationship, request, RM project/agreement/entity, security group/role/template, story board, user, version) S10 S14. 59 event types are available. rm.agreement.expired is listed as not available S14.
  • Configuration: through the REST API (POST/webhooks/endpoint and related) or the Webhooks section of the Admin UI. One endpoint can subscribe to several event types S11 S7. Tenovos sets a delivery rate limit (messages per second) per customer or per endpoint, based on load-test figures the customer provides S10.
  • Payload: small JSON message with context and summary only. Call the REST API back for full data. Ordering is not guaranteed S10.
  • Endpoint authentication: none, Basic, or header auth S10. Optional OAuth client-credentials: PUT/webhooks/endpoint/oauth/{endpointId} with clientId, clientSecret, tokenUrl, extraParams, scope S11.
  • Signature: headers webhook-id, webhook-timestamp and webhook-signature (space-separated, versioned v1,<base64> values). Sign id.timestamp.body with HMAC-SHA256, keyed with the base64 part of a whsec_… secret. Check the timestamp tolerance S12.
  • Retries: an endpoint must return 200 within 30 seconds S10. Otherwise retries run immediately, then after 5 s, 5 min, 30 min, 2 h, 5 h, 10 h and 10 h. After that the message is marked Failed and a message.attempt.exhausted event is sent. Endpoints failing for 5 days are disabled automatically S13. A Webhooks Admin Dashboard shows subscriptions and delivery analytics. It allows manual retry or "Recover" from a date S13.
  • Status: one copy of the webhooks spec still carries a "currently in Beta" banner; the developer-portal copy does not S15. General availability date: Unknown.
  • Tenovos Connect can generate receiving endpoints for customers who cannot host one S10 S15.

Limits & quirks

  • Rate limits are not documented. The only signal is the x-ratelimit-* header pair seen on an unauthenticated 401 S22 Unverified.
  • Latency is documented per operation, and some values are high: new token about 3.7 s; create user about 5.1 s; get asset by object ID about 3.0 s (about 0.45 s by file ID) S7. The FAQ claims v2 is "600%+" faster than v1 on average S16 (vendor claim; v2 itself is not documented publicly).
  • Error codes: a missing X-API-Key gives 403 Forbidden; a missing or expired token gives 401 S7 S22. An invalid asset ID on GET/asset/{id}/content returns 502 S7.
  • Documentation drift: v1.5 is called both "current" and "beta" on different pages S2 S4. The OAuth setup sections are placeholders S6. Training pages are reachable only through FAQ links to Markdown files S16 S23.
  • Restricted operations: POST/asset/transform needs an extra verification key from Support S7. The CDN pull-zone endpoints are tagged "Coming Soon!" S7.
  • Batch: the portal states that all versions support batch requests S2. Concrete batch operations include bulk asset edit (PATCH/asset), bulk group creation (max 50) and POST/request/list S7.

SDKs, tools & code samples

ItemLanguage / formStatus
Training exercises (authenticate, search, relationships, bulk relationships, large upload, collections)Node.js 16 (node-fetch, lodash)Published as Markdown files; HTML routes removed S16 S17 S18 S19
tenovos-dev-starter-kit (infrastructure for an integration)JavaScriptArchived on GitHub (last push 2023-05) S80
tenovos (collection of open-source packages)JavaScriptArchived (last push 2022-08) S80
Tenovos Connect SDK / REST app / public trigger APILow-code studioFor building Connect connectors, not a DAM client SDK S30
Official client SDKs (npm, PyPI, NuGet, Maven, Packagist)—None found S80
Postman collection—None found—
Docs search assistant ("Ask AI") and llms.txtPortal featureLive S1 S21

Changelog of the API

DateChange
2026-07-31Scheduled end of support for API v1 (1.0–1.4) S2 S3
2025-2026Content Intelligence Platform API (v3.0) published on the developer portal; exact date Unknown S9 S21
2024-06 (planned)A commented-out note in the old v1 index planned v2 "early customer access" for June 2024. The outcome is not documented S81 Unverified
2024-03v1 enters maintenance mode (no further additions) S2
Unknownv1.5 released: OAuth 2.0 authorization code, clientId no longer required, simplified asset endpoints, Adaptive Templates and metadata-admin endpoints S4 S7
UnknownWebhooks service introduced (beta banner on one spec copy) S15

The portal's v1.5 changelog page (/developer-portal/hermes/changelog) is empty S21.

Stored API specs

3 files · 2.5 MB · verbatim copies of public vendor filesSpecs README & provenance
FileFormatSizeDownload
tenovos_content-intelligence_openapi.jsonOpenAPI1.0 MBDownload
tenovos_openapi_v1.5.jsonOpenAPI1.2 MBDownload
tenovos_webhooks_openapi.jsonOpenAPI240 KBDownload
Search the wiki