Retrieves full channel instance details by their IDs.
Request: ids - List of channel instance IDs to retrieve.
Response: channelInstances - List of ChannelInstance objects with complete configuration and status.
Secure, scalable REST APIs for the Tenovos Content Intelligence Platform — enabling content discovery, metadata management, AI enrichment, governance, and distribution across enterprise systems.
Documents are the primary data model in the Content Intelligence Platform. Each document is a JSON object that holds metadata as flexible name/value pairs — there is no fixed schema enforced at the storage layer, which allows content from diverse external systems (DAMs, cloud storage, SharePoint, Box, etc.) to be ingested without transformation.
Documents exist within a graph-like structure where nodes (individual documents) and edges (links between documents) form a highly relational content model. For example, a media document can be linked to a campaign document, enabling hierarchical queries and relationship traversal across the content graph.
Document traits define behavioral capabilities of a document type:
| Trait | Description |
|---|---|
SUMMARY | Document has a displayable summary representation |
CHILDREN | Document can contain child documents |
TILE | Document can be displayed as a tile/card |
CONTENT | Document is linked to binary content (files) |
PREVIEW | Document can generate a visual preview |
INSIGHTS | Document tracks engagement analytics |
TIMELINE | Document has a temporal lifecycle (start/end dates) |
VERSION | Document supports versioning |
SOURCE | Document tracks its originating content channel |
Endpoint reference:
create — create one or more documents of a given kind, with optional external ID for deduplicationretrieve — fetch a document by ID with full metadata and linked content referenceslist — paginated listing of documents, filtered by kind, status, or metadata valuesquery — full-text and field-level search across the document graphquery-within — scoped search within a specific document hierarchy (e.g., within a brand or campaign)link / unlink — create or remove typed edges between documents (e.g., link media to a campaign)retrieve-links — traverse outbound edges from a document to its related documentsupdate — modify document metadata fields; uses partial update (only supplied fields change)delete / undelete — soft-delete with restore; deleted documents remain queryable with a filterpurge — permanently remove a document and all its edgesreindex — trigger re-indexing of a document into OpenSearch; use after bulk imports or schema changesDocuments reference binary content managed by the Content Storage service and are typed using Document Types with optional schema enforcement via Document Schemas.
Document Types (internally called kinds) define the categories of content that exist in your organization — controlling how documents are classified, displayed, and processed by downstream services. Every document must declare a kind at creation time.
Kinds have a KindType classification that describes their primary role:
| KindType | Description |
|---|---|
ASSET | Represents a binary file or media asset (images, video, documents) |
REFERENCE | Represents a business entity that other documents relate to (brands, campaigns) |
COLLECTION | Groups related documents together (categories, playlists) |
LAYOUT | Structures content for presentation (toolkits, sections, blocks) |
OTHER | Custom or unclassified kind |
Platform-provided default kinds:
| Kind | KindType | Description |
|---|---|---|
media | ASSET | Represents assets that originate from external channels (images, video, files). Linked to binary content, brands, campaigns, and source channel. |
brand | REFERENCE | Organizational brand entity. Links to a logo and splash image. Fields: name, description, fgColor, bgColor. |
campaign | REFERENCE | Marketing campaign. Links to brands and splash images. Fields: title, description, brief, start, end. |
category | COLLECTION | Dynamically generated content groupings. Supports subcategory hierarchies. Fields: name, label, description, versionNumber, depth, isLatest, keywords. |
toolkit | LAYOUT | Groups sections of content representing a brand identity. Links to sections and a parent brand. |
section | LAYOUT | Page layout element holding multiple blocks. Links to a toolkit, parent section, and child blocks. |
block | LAYOUT | Page element holding rich text and media. Links to media items. |
Kinds are organized into groups for display in the platform UI (e.g., "Media Assets", "Creative Briefs"). Use list-default-groups to retrieve platform-defined groupings. Custom kinds can be created to extend this model for organization-specific content structures.
Kinds work in conjunction with Document Schemas, which define the metadata field structure and validation rules applied to documents of a given kind.
Schemas define the metadata field structure for a Document Type — specifying which fields should be present, their data types, display labels, and validation rules (required, allowed values, min/max constraints). The platform stores metadata as schemaless name/value pairs at the document layer, but schemas allow you to enforce structure when needed.
Schema types:
| SchemaType | Description |
|---|---|
ROOT | Top-level schema attached directly to a Document Kind |
SUB | Nested schema for structured sub-objects within a document |
TRAIT | Schema associated with a behavioral trait (e.g., SUMMARY, TIMELINE) |
Available field types:
| Field Type | Description |
|---|---|
string | Plain text value |
integer | Whole number |
number | Floating point number |
bool | Boolean true/false |
date | ISO 8601 date or datetime |
array | List of values — element type can be string, integer, number, bool, or date |
object | Nested JSON object (references a SUB schema) |
link | Edge to another document; has a cardinality (ONE_TO_ONE, ONE_TO_MANY, MANY_TO_ONE, MANY_TO_MANY) |
ref | Read-only reference to a field on a linked document |
computed | Derived field calculated from other field values |
Schema operations:
create-schema — define a new schema and attach it to a kindupdate-schema — revise field definitions; changes apply to subsequent document writesretrieve-schema / list-schema — inspect field definitions for a given kinddelete-schema — remove a schema, returning the kind to free-form metadata modeDocument Rules are automated policies that govern how documents behave as they are created or updated in the platform. Each rule defines conditions (when to fire) and actions (what to do). Rules are evaluated asynchronously by the Action & Media Flows service whenever a matching document event occurs.
Condition matching:
Rules evaluate conditions against document fields. The matchType controls how multiple conditions combine:
| Match Type | Behavior |
|---|---|
MATCH_ALL | All conditions must be true (AND logic) |
MATCH_ANY | At least one condition must be true (OR logic) |
MATCH_NONE | No conditions may be true (NOT logic) |
Condition operators:
| Operator | Description |
|---|---|
OP_EQ | Field equals the specified value |
OP_NE | Field does not equal the specified value |
OP_MATCHES | Field matches a regular expression |
OP_NOT_MATCHES | Field does not match a regular expression |
OP_IS_EMPTY | Field is absent or null |
OP_IS_NOT_EMPTY | Field is present and non-null |
Condition sources — what the condition evaluates against:
| Source | Description |
|---|---|
SOURCE_KIND | The document kind (type) |
SOURCE_DOC_VALUE | The current value of a document field |
SOURCE_PREV_DOC_VALUE | The previous value of a field (before the triggering update) |
Available actions:
| Action | Description |
|---|---|
setProperty | Write a metadata field value on the document |
setLink | Create a link edge between the document and another document |
setPolicy | Apply an access policy grant (READ or MODIFY) to the document |
Rule lifecycle:
create / update — define or revise rule conditions and actionsenable / disable — activate or pause a rule without deleting ittest — evaluate a rule against a sample document payload before enabling in productiondelete — permanently remove a ruleThe Content Storage service manages references to binary content (files) through a pluggable adapter model. Adapters represent different physical storage backends — for example, AWS S3 (full read/write), CDN origins (Bunny, Bria), or external DAM connectors. Callers never interact with storage directly; they work with pre-signed URLs that the service generates on demand, allowing content to be streamed directly from the storage provider without proxying through the platform.
The service supports multiple adapters per organization with a priority ordering, so that suitable storage defaults are chosen automatically without callers needing to specify where content lives. Different adapters can be configured for different storage classes (hot, warm, cold), affecting retrieval latency and cost.
Content lifecycle:
| Endpoint | Description |
|---|---|
register | Record that a piece of content exists at a known storage location (used during channel sync) |
retrieve-upload-url | Get a pre-signed URL to upload a new file directly to the configured storage adapter |
stage | Prepare content for CDN delivery by writing it to the CDN origin adapter |
retrieve-url | Get a pre-signed download or streaming URL for a content item |
retrieve-info | Fetch content metadata: size, MIME type, checksums, dimensions (for images) |
list-info | Batch retrieval of content metadata for multiple items |
update | Update mutable content metadata (alt text, tags, etc.) |
delete / undelete | Soft-delete a content record with restore capability |
purge | Permanently remove the content record (does not delete the underlying file from storage) |
deregister | Remove the content reference without affecting the underlying stored file |
Adapter management:
| Endpoint | Description |
|---|---|
create-adapter | Configure a new storage backend for the organization |
update-adapter | Modify adapter settings (credentials, priority, storage class) |
retrieve-adapter / list-adapters | Inspect configured adapters |
delete-adapter / undelete-adapter / purge-adapter | Manage adapter lifecycle |
These endpoints provide authorization primitives for verifying user permissions and bootstrapping new user access within the Content Intelligence Platform.
The platform uses a role-based access control (RBAC) model managed by the Authorization service. Roles carry named permissions, and users are assigned one or more roles either explicitly or via User Groups.
has-permission — check whether the calling user holds a specific named permission; use this as a guard in custom integrations before performing sensitive operationsassign-default-role — assign the platform default role to a user, typically called during user provisioning or invite acceptance flowsFor fine-grained, resource-level access decisions (e.g., "can this user access this specific document?"), see Access Control. For managing the roles themselves, see Roles.
User Groups organize users into named collections for streamlined access control and administration. Instead of assigning roles and permissions user-by-user, you assign them to a group and manage membership centrally.
Groups support a full lifecycle:
Groups integrate with the Roles and Access Control systems, and are a key building block for multi-tenant or brand-scoped permission models.
Roles are named collections of Permissions that define what actions a user can perform across the platform. The platform uses a hierarchical RBAC model where users are assigned roles (directly or via User Groups), and those roles carry the permissions that gate access to API operations and content resources.
Role operations:
Roles are evaluated alongside fine-grained resource policies managed by Access Control to produce the final authorization decision for any given user and resource combination.
Manage user accounts within an organization — from initial invitation through ongoing profile management and access lifecycle.
create-invite — send an email invitation to a new user; the invited user completes signup via the platform authentication flow (powered by Clerk)retrieve / list-users — inspect user profiles and organization membershipupdate-user — modify user profile attributesassign-user-role — directly assign a Role to a specific userdisable-user — suspend access without deleting the accountdelete-user — remove a user from the organizationUser identity and authentication (login, SSO, MFA) are handled externally by Clerk. These endpoints manage the platform-side user record, role assignments, and access state.
Permissions are the atomic units of access control — named capabilities that define what a user or role is allowed to do (e.g., document:create, content:delete, channel:manage). Permissions are grouped into Roles, which are then assigned to users or User Groups.
list-permissions — enumerate all permissions defined in the platform; use this to understand what capabilities are available when designing custom rolescreate-permission — define a new named permission, typically used when extending the platform with custom action types or integration-specific access gatesAccess Control provides fine-grained, resource-level authorization on top of the role-based model. Where Roles and Permissions define what a user can do in general, Access Control governs what a user can do to a specific resource (e.g., a particular document, channel, or brand).
Document-level access supports two grant types:
| Grant | Description |
|---|---|
READ | User can view and retrieve the resource |
MODIFY | User can update or delete the resource |
has-access — evaluate whether the calling user has access to a specific resource; the primary authorization check for content-level operationsretrieve-resource-groups — list the logical resource groups a user has access to, used for scoping queries and UI navigationgrant-access — explicitly grant a user or group access to a specific resourcerevoke-access — remove a previously granted resource-level accessAPI Keys enable programmatic, non-interactive access to the platform — suitable for server-to-server integrations, CI/CD pipelines, and automated content workflows that cannot use user-delegated OAuth tokens.
Each API key is scoped to the organization of the user who creates it and carries that user's permissions. Keys should be stored securely and rotated regularly.
create-api-key — generate a new API key; the raw key value is only returned once at creationlist-api-keys — enumerate existing keys (key values are not re-exposed)revoke-api-key — permanently invalidate a key; any integrations using it will lose access immediatelyChannels are the integration layer for connecting to external content systems — cloud storage, DAM platforms, social media, enterprise file systems, and others. Each Channel is a configured, authenticated connection to one of these external sources that the platform monitors, indexes, and keeps in sync.
The Channel Manager authenticates against external systems, scans for new and modified content, manages webhook subscriptions for real-time change notifications, and makes raw content available for retrieval — without managing the binary files directly. Binary retrieval is handled via pre-signed URLs delegated to Content Storage.
Channel categories:
| Category | Description |
|---|---|
ORIGIN | External content source to pull from (Box, Google Drive, SharePoint, S3, DAMs, etc.) |
OBSERVATION | External system to observe for engagement events (Instagram, Facebook, Website, etc.) |
DELIVERY | Destination to push content to |
Currently available channel types:
Origin (content pull):
| Channel | Group | Auth |
|---|---|---|
| Box | Cloud File Storage | OAuth |
| Google Drive | Cloud File Storage | OAuth |
| AWS S3 | Object Store | Service Credentials |
| Tenovos DAM | DAM | OAuth |
| Adobe AEM | DAM | Service Credentials |
| Sitecore | DAM | OAuth |
| Bynder | DAM | OAuth |
| Brand Folder | DAM | OAuth |
| Azure Blob | Object Store | OAuth |
| Google Cloud Storage | Object Store | OAuth |
| SharePoint | Cloud File Storage | OAuth |
Observation (engagement events):
| Channel | Group |
|---|---|
| Social | |
| Social | |
| Website | Content Management and Sites |
Authentication methods:
| Auth Type | Description |
|---|---|
OAUTH | User-delegated OAuth 2.0 flow; use retrieve-oauth-url then update-auth |
API_KEY | Static API key submitted during channel creation |
BASIC_AUTH | Username and password credentials |
SERVICE_CREDENTIALS | Service account JSON or IAM role credentials (used by Adobe AEM, AWS S3) |
Channel status lifecycle:
| Status | Description |
|---|---|
DRAFT | Channel created but not yet authenticated |
AUTHENTICATED | Credentials stored; not yet scanning |
ENABLED | Actively scanning and webhook-registered |
DISABLED | Paused; configuration and credentials retained |
Channel lifecycle endpoints:
list-channel-types / retrieve-channel-types — discover available integrations and their configuration requirementscreate-channel — configure a new connection (name, settings, auth)update-channel — modify an existing channel's settingsenable-channel — activate scanning and webhook registration; channel begins syncing contentdisable-channel — pause sync without deleting configuration; webhooks are torn downdelete-channel / purge-channels — remove channel(s) and all associated webhooks and scan statevalidate-channel-config — test credentials and connectivity before enabling; returns OK, AUTH_FAILURE, or CONFIG_FAILUREAuthentication flow endpoints:
retrieve-oauth-url — get the OAuth authorization URL to redirect a user throughupdate-auth — exchange an OAuth authorization code or service credentials for stored tokensContent discovery endpoints:
retrieve-folders — browse the folder, site, or library tree of a connected sourceget-config-description — fetch the dynamic field schema for configuring a channel type; field types are TREE, DROPDOWN, or TEXTget-config-details — retrieve selectable items (sites, folders, document libraries) for a specific channel instancescan-content — manually trigger or resume a paginated content scanretrieve-content — generate pre-signed download URLs for specific content items from the sourceretrieve-content-metadata — fetch metadata for a specific item directly from the external sourceretrieve-content-data — stream raw file content from the external sourceretrieve-channel-account — return the authenticated account info (user profile, tenant ID, etc.) for a connected channelSync and operations:
resolve-webhook-payload — parse an inbound push notification from an external system into a normalized platform event (used internally)channel-stats — retrieve scan statistics and sync state (ACTIVE, INACTIVE, SYNCING, or ERROR) for a channelScan behavior: Enabled channels run on an automatic schedule. Initial scans perform a full content crawl; subsequent delta scans (default interval: 10 minutes) retrieve only changes since the last successful scan using source-native change detection (e.g., Graph delta queries for SharePoint, change tokens for Box). Failed scans retry up to 5 times with a 30-minute cooldown between attempts.
Retrieves full channel instance details by their IDs.
Request: ids - List of channel instance IDs to retrieve.
Response: channelInstances - List of ChannelInstance objects with complete configuration and status.
curl -i -X POST \
https://api.tenovos.net/api/v1/channel/retrieve-channels \
-H 'Authorization: Bearer <YOUR_JWT_HERE>' \
-H 'Content-Type: application/json' \
-d '{
"ids": [
"chnl_01hzpg52tgeap9x6cvmyrec4dg"
]
}'{ "channelInstances": [ { … } ] }
Creates a new channel instance connecting the organization to an external system.
Request: channelInstance - The channel to create, including channelTypeId, name, optional description, and type-specific settings. authDetails - Authentication credentials for the external system (OAuth code, API key, basic auth, or service credentials).
Response: channelInstance - The created ChannelInstance in DRAFT status with its assigned ID.
curl -i -X POST \
https://api.tenovos.net/api/v1/channel/create-channel \
-H 'Authorization: Bearer <YOUR_JWT_HERE>' \
-H 'Content-Type: application/json' \
-d '{
"channelInstance": {
"channelTypeId": "chnltype_01h7agvwgefxgstg37gbqsyh4c",
"name": "Acme Box Storage",
"description": "Primary Box account for the EMEA marketing team",
"settings": {}
},
"authDetails": {
"oauthCode": "auth_code_from_oauth_redirect"
}
}'{ "channelInstance": { "id": "string", "channelTypeId": "string", "name": "string", "description": "string", "settings": {}, "hasFailed": true, "status": 0, "scanState": "string", "weightage": 0.1, "createdAt": { … }, "updatedAt": { … }, "deletedAt": { … } } }
Updates the name, description, and configuration settings of an existing channel instance.
Request: channelInstance - Update payload containing the channel id, new name, optional description, and updated settings. Authentication credentials are not changed by this call; use UpdateAuth for that.
Response: updated - Number of records updated (1 on success).
curl -i -X POST \
https://api.tenovos.net/api/v1/channel/update-channel \
-H 'Authorization: Bearer <YOUR_JWT_HERE>' \
-H 'Content-Type: application/json' \
-d '{
"channelInstance": {
"id": "chnl_01hzpg52tgeap9x6cvmyrec4dg",
"name": "Acme Box Storage (EMEA)",
"settings": {
"foldersIds": {
"checked": [
"folder_12345",
"folder_67890"
]
}
}
}
}'Workflows (internally "flows") are the orchestration mechanism for longer-running, multi-step content operations. Where individual API calls handle atomic short-lived operations, Workflows wire multiple service calls together into a composite action — for example: ingest content from a Channel → extract metadata → apply Document Rules → publish to a destination.
The platform's services are designed around short-lived RPC calls. Workflows bridge them into durable, sequenced processes managed by the Action & Media Flows service, with each step tracked as a Job.
list-default-groups returns platform-provided workflow templates as a starting pointRunning instances of a workflow are tracked as Jobs. Use the Jobs API to monitor progress, handle failures, and restart or cancel executions.
Actions are the individual, atomic operations that can be composed into Workflows. Each action represents a discrete capability of the platform — for example, "ingest document from channel", "run media transform", "apply metadata schema", "send notification", or "publish to destination".
These endpoints are read-only discovery endpoints:
list — enumerate all available actions in the platform; filter by category or type to find actions relevant to a specific workflow stepretrieve — fetch the full definition of a specific action, including its input parameters, output shape, and configuration requirementsUse the Actions API to programmatically build or validate workflow definitions without relying on hardcoded action identifiers.
Jobs represent individual executions of Workflow steps or standalone async operations (such as a media transform). The Job system provides visibility into the progress, status, and output of long-running background tasks managed by the Action & Media Flows service.
Each job moves through a lifecycle: queued → running → succeeded / failed. Jobs run in isolated per-organization priority queues, ensuring one organization's workload does not block another's.
list — query jobs by workflow, status, date range, or content referenceretrieve — fetch the full status, logs, and output of a specific jobrestart — re-queue a failed job; useful for transient failures such as network timeouts or temporary service unavailabilitycancel — terminate a running or queued job; the job will not be retriedThe Media Processing API exposes the Transform service — a managed job queue for converting, resizing, transcoding, and analyzing media files. Each organization has its own isolated priority queue, ensuring processing workloads remain independent across tenants.
Workers execute in Docker containers on AWS Lambda (migrating to Spot Fargate) and support a wide range of operations:
| Operation | Examples |
|---|---|
| Image processing | Resize, crop, format conversion (JPEG, PNG, WebP, AVIF), resolution scaling, thumbnail generation |
| Video transcoding | Format conversion, bitrate adjustment, preview clip generation |
| Document conversion | Office/PDF to image preview, page extraction |
| AI enrichment | Image hash generation, visual feature extraction, content classification, captioning (via AWS Bedrock) |
Job operations:
submit — enqueue a new transform job, specifying the input content reference, operation type, and output parameters; returns a job ID for status trackingstatus — poll the current state of a job (queued, running, completed, failed) and retrieve the output content location when completecancel — remove a queued job before execution begins; jobs already running cannot be cancelled mid-execution