Skip to content

Tenovos Content Intelligence Platform (3.0)

Secure, scalable REST APIs for the Tenovos Content Intelligence Platform — enabling content discovery, metadata management, AI enrichment, governance, and distribution across enterprise systems.

Languages
Servers
Default Server
https://api.tenovos.net

Document Management

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:

TraitDescription
SUMMARYDocument has a displayable summary representation
CHILDRENDocument can contain child documents
TILEDocument can be displayed as a tile/card
CONTENTDocument is linked to binary content (files)
PREVIEWDocument can generate a visual preview
INSIGHTSDocument tracks engagement analytics
TIMELINEDocument has a temporal lifecycle (start/end dates)
VERSIONDocument supports versioning
SOURCEDocument tracks its originating content channel

Endpoint reference:

  • create — create one or more documents of a given kind, with optional external ID for deduplication
  • retrieve — fetch a document by ID with full metadata and linked content references
  • list — paginated listing of documents, filtered by kind, status, or metadata values
  • query — full-text and field-level search across the document graph
  • query-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 documents
  • update — modify document metadata fields; uses partial update (only supplied fields change)
  • delete / undelete — soft-delete with restore; deleted documents remain queryable with a filter
  • purge — permanently remove a document and all its edges
  • reindex — trigger re-indexing of a document into OpenSearch; use after bulk imports or schema changes

Documents reference binary content managed by the Content Storage service and are typed using Document Types with optional schema enforcement via Document Schemas.

Operations

Create documents

Request

Creates one or more documents of a given kind, returning the IDs of newly created documents and any pre-existing duplicates.

Request: documents - List of documents to create. Each entry includes: kind - The Kind name this document belongs to. doc - The document body as an arbitrary JSON value. externalId - Optional identifier from an external system for deduplication and cross-reference.

Response: ids - IDs of the newly created documents. existingIds - IDs of pre-existing documents that matched by externalId (not re-created).

Security
bearerAuth
Bodyapplication/json
documentsArray of objects(tenovos_document_Document_Create)
curl -i -X POST \
  https://api.tenovos.net/api/v1/document/create \
  -H 'Authorization: Bearer <YOUR_JWT_HERE>' \
  -H 'Content-Type: application/json' \
  -d '{
    "documents": [
      {
        "kind": "media",
        "externalId": "box_file_123456789",
        "doc": {
          "name": "Q3 Campaign Hero Image",
          "description": "Primary hero image for the Q3 product launch campaign",
          "status": "approved",
          "tags": [
            "campaign",
            "hero",
            "Q3"
          ],
          "region": "north-america"
        }
      }
    ]
  }'

Responses

OK

Bodyapplication/json
idsArray of strings
existingIdsArray of strings
Response
application/json
{ "ids": [ "string" ], "existingIds": [ "string" ] }

Get documents

Request

Retrieves one or more documents by internal ID or external ID, with optional field projection and soft-delete inclusion.

Request: ids - List of internal document IDs to retrieve. externalIds - List of external IDs to retrieve documents by. fetches - Optional field projection expression limiting which document fields are returned. includeDeleted - When true, includes soft-deleted documents in the results.

Response: documents - List of Document objects (id, kind, doc body, timestamps).

Security
bearerAuth
Bodyapplication/json
idsArray of strings
fetchesstring

Rule data fields

includeDeletedboolean
externalIdsArray of strings
curl -i -X POST \
  https://api.tenovos.net/api/v1/document/retrieve \
  -H 'Authorization: Bearer <YOUR_JWT_HERE>' \
  -H 'Content-Type: application/json' \
  -d '{
    "ids": [
      "doc_01hbgk5cqef94v60bqg6qfv581",
      "doc_01hbgk5cqef94v60bqg6qfv582"
    ],
    "fetches": "$summary, $content, /tags"
  }'

Responses

OK

Bodyapplication/json
documentsArray of objects(tenovos_document_Document)
Response
application/json
{ "documents": [ { … } ] }

List documents

Request

Lists documents filtered by one or more kind names, with optional field projection and cursor-based pagination.

Request: kinds - List of Kind names to filter by. fetches - Optional field projection expression limiting which document fields are returned. includeDeleted - When true, includes soft-deleted documents in the results. pagination - Optional Pagination cursor and page size.

Response: documents - List of Document objects matching the filter. pageCursor - Opaque cursor for the next page. Absent when there are no further results.

Security
bearerAuth
Bodyapplication/json
kindsArray of strings
fetchesstring

Rule data fields

includeDeletedboolean
paginationstring or integer
One of:

Rule data fields

string
curl -i -X POST \
  https://api.tenovos.net/api/v1/document/list \
  -H 'Authorization: Bearer <YOUR_JWT_HERE>' \
  -H 'Content-Type: application/json' \
  -d '{
    "kinds": [
      "media",
      "campaign"
    ],
    "fetches": "$summary, /status",
    "includeDeleted": false,
    "pagination": {
      "maxSize": 25
    }
  }'

Responses

OK

Bodyapplication/json
documentsArray of objects(tenovos_document_Document)
pageCursorstring

Rule data fields

Response
application/json
{ "documents": [ { … } ], "pageCursor": "string" }

Query documents

Request

Executes a structured query against all documents in the organization, returning matching results with full control over which fields and traits are returned, how results are filtered, and how pages are navigated.


Query Language

Queries are expressed as a single string using a structured query language with up to four clauses:

fetch(<fields>)[.orderBy(<path>, asc|desc)][.limit(<n>[, <cursor>])]
from(<kind>[, <kind>...])
[match('<keywords>')]
[filter(<expression>)]

Only fetch and from are required. match and filter are optional and may appear in any order after from.


fetch() — Field and Trait Selection

Specifies which fields or traits to return. Multiple items are comma-separated.

SyntaxDescription
fetch(/)Return the entire root document
fetch(/field)Return a single top-level field
fetch(/field/subfield)Return a nested field
fetch($trait)Return a trait result at the root
fetch(/path/$trait)Return a trait scoped to a field path
fetch($trait$subtrait)Return a trait with a sub-trait qualifier
fetch($trait(key=value))Return a trait with attribute parameters
fetch(/f1, $summary, /path/$preview)Return multiple items

Ordering — append .orderBy(<path>, asc|desc) to fetch():

fetch(/).orderBy(/name, asc)
fetch($summary).orderBy(/createdAt, desc)

Pagination — append .limit(<count>) or .limit(<count>, <cursor>) to fetch():

fetch(/).limit(25)
fetch(/).limit(25, nextPageToken)

The cursor value is the opaque pageCursor string returned in the previous response.


from() — Document Kind Selection

Specifies one or more document kinds to query. Kind names must be lowercase letters and underscores only (3–62 characters).

from(brand)
from(asset, brand, region)

Default platform kinds: media, brand, campaign, category, toolkit, section, block. Custom kinds defined in your organization are also supported.


Performs a full-text keyword search across indexed document content. Keywords are provided as a single-quoted string. Results are ranked by relevance when orderBy is not specified.

match('acme global')
match('Q4 campaign hero')

filter() — Field-Level Conditions

Applies field-level conditions to narrow results. Expressions can be simple or compound.

Comparison operators:

OperatorMeaning
==Equals
!=Not equals
<Less than
<=Less than or equal
>Greater than
>=Greater than or equal
...Contains (substring match or array membership)
!..Does not contain

Logical operators: && (AND), || (OR), (...) (grouping)

Literal value types:

TypeSyntaxExamples
Nullnullnull
Booleantrue / falsetrue
Numberinteger or decimal42, 3.14, -10
Stringsingle-quoted'active', 'Acme Corp'
filter(/status == 'active')
filter(/rating >= 4 && /region != null)
filter((/status == 'active' || /status == 'pending') && /owner != null)
filter(/tags ... 'featured')
filter(/$$id == 'assetAbc123')

Strings in filter conditions must be single-quoted. Supported escape sequences: \\, \', \n, \r, \t.


Property Paths

Property paths reference fields within a document and always begin with /. Nested fields are separated by /.

PathDescription
/The root document
/nameTop-level field
/metadata/createdByNested field
/tagsArray field
/$$idReserved system field (prefixed with $$)

Range selectors on link properties — link fields (relationships to other documents) support a range selector [start..end] to limit which linked items are returned. Both bounds are zero-based; start is inclusive, end is exclusive.

SyntaxDescription
/items[0..5]First 5 linked items
/items[3..]All linked items from index 3 onward
/items[..10]First 10 linked items
/items[2..8]Items at indices 2 through 7

Ranges can appear at multiple levels of a path:

fetch(/sections[0..3]/media[..10]) from(toolkit)

Traits

Traits define a standard contract for a set of fields a document kind can return. They are referenced in fetch() using the $ prefix.

TraitParametersReturned Fields
$summary—name, description
$tile—fgColor, bgColor, iconUrl
$childrenlimit (optional)items (array), depth
$content—id, mimeType, contentType, size, filename, description, caption; plus type-specific: image (width, height), video (width, height, durationMs), document (width, height, pages)
$previeww, h, representationTypeid, url
$insights—Array of insight metrics (single value or timeseries)
$timeline—from, to (timestamps)
$version—number, isLatest

Sub-traits apply a secondary trait to each item returned by the parent:

fetch($children$summary)           # fetch children, return $summary for each
fetch($children$summary(limit=5))  # limit to 5 children

Complete Examples

# Fetch all fields from a single kind
fetch(/) from(brand)

# Fetch specific fields
fetch(/name, /status, /region) from(asset)

# Fetch a trait
fetch($summary) from(brand)

# Fetch multiple traits and fields
fetch($summary, $tile, /metadata) from(brand)

# Fetch a trait at a nested path
fetch(/heroImage/$preview(w=800, h=600)) from(campaign)

# Full-text search
fetch($summary) from(asset) match('product launch 2024')

# Filter by a field value
fetch(/) from(asset) filter(/status == 'approved')

# Filter with AND
fetch($summary) from(asset) filter(/status == 'active' && /owner != null)

# Filter with OR and grouping
fetch($summary) from(asset)
filter((/status == 'active' || /status == 'pending') && /region != null)

# Contains / not-contains
fetch(/) from(asset) filter(/tags ... 'featured')
fetch(/) from(brand) filter(/name !.. 'draft')

# Query multiple kinds
fetch($summary) from(brand, region, asset) filter(/status == 'active')

# Order and paginate
fetch($summary).orderBy(/name, asc).limit(20) from(brand)

# Continue from a cursor
fetch($summary).orderBy(/name, asc).limit(20, nextPageCursorToken) from(brand)

# Fetch linked items with a range
fetch(/items[0..5]) from(category)

# Nested ranges
fetch(/sections[0..3]/media[..10]) from(toolkit)

# Limit children with trait attribute
fetch($children(limit=5)) from(category)

# Combined: search, filter, order, paginate
fetch($summary, $preview(w=400, h=300)).orderBy(/name, asc).limit(10, abc123)
from(asset)
match('campaign hero')
filter(/status == 'active' && /region != null)

Request Parameters

ParameterTypeRequiredDescription
querystringYesThe query expression string
verbosebooleanNoWhen true, includes per-phase execution timing in the response (info field)

Response

FieldDescription
documentsList of matching document objects
pageCursorOpaque token to pass to the next request to retrieve the next page; absent when no further pages exist
infoQuery timing breakdown by phase (match, filter, projection) — only present when verbose: true
Security
bearerAuth
Bodyapplication/json
querystring

Rule data fields

verboseboolean
curl -i -X POST \
  https://api.tenovos.net/api/v1/document/query \
  -H 'Authorization: Bearer <YOUR_JWT_HERE>' \
  -H 'Content-Type: application/json' \
  -d '{
    "query": "fetch($summary, $content).limit(20) from(media) filter(/status == '\''approved'\'' && /region != null)",
    "verbose": false
  }'

Responses

OK

Bodyapplication/json
documentsArray of objects(tenovos_document_Document)
pageCursorstring

Rule data fields

infoobject(tenovos_document_Document_Query_QueryInfo)
Response
application/json
{ "documents": [ { … } ], "pageCursor": "string", "info": { "query": "string", "timings": { … } } }

Search within a document

Request

Performs a keyword search within the content of a specific document, returning a relevance-scored series of matching positions. This is distinct from the query endpoint, which searches across documents — query-within searches inside a single document's indexed content.

This is most useful for long-form content where you want to locate specific passages, pages, or moments, for example:

  • Finding the page in a PDF where a keyword appears
  • Locating the timestamp in a video where a term is spoken
  • Searching within a large document's indexed text body

Request Parameters

ParameterTypeRequiredDescription
idstringYesThe ID of the document to search within
keywordsstringYesThe keyword or phrase to search for within the document's content
minScorenumberNoMinimum relevance score threshold (0.0–1.0). Points scoring below this value are excluded from the response. Use to filter out low-confidence matches.

Response

FieldDescription
seriesA scored series of matching positions within the document

Each point in the series contains:

FieldTypeDescription
scorenumberRelevance score for this match (higher is more relevant)
refinteger or stringPosition reference — an integer page index for paginated content (PDFs, slide decks), or a timecode string for time-based content (video, audio)

Example

To find all moments in a video where "product launch" is mentioned, with a minimum relevance score of 0.5:

{
  "id": "doc01abc123",
  "keywords": "product launch",
  "minScore": 0.5
}

The response series would contain entries like:

{
  "series": [
    { "score": 0.92, "ref": "00:01:34" },
    { "score": 0.71, "ref": "00:08:12" }
  ]
}

For a PDF, ref values would be zero-based page indices (0, 4, 11, etc.).

Security
bearerAuth
Bodyapplication/json
idstring

Rule data fields

keywordsstring

Rule data fields

minScorenumber(float)
curl -i -X POST \
  https://api.tenovos.net/api/v1/document/query-within \
  -H 'Authorization: Bearer <YOUR_JWT_HERE>' \
  -H 'Content-Type: application/json' \
  -d '{
    "id": "doc_01hbgk5cqef94v60bqg6qfv581",
    "keywords": "product launch",
    "minScore": 0.5
  }'

Responses

OK

Bodyapplication/json
seriesobject(tenovos_document_Document_QueryWithin_Series)
Response
application/json
{ "series": { "points": [ … ] } }

Update documents

Request

Applies an ordered sequence of field-level patch operations to one or more existing documents. Patches are applied in the order supplied; if any patch in the sequence is invalid, the entire update for that document is rejected.

Request: updates - List of documents to update. Each entry includes: id - The document ID to target. Either id or externalId must be supplied. externalId - The external system ID to target (alternative to id, useful when the document was created with an externalId for cross-system referencing). patches - Ordered list of patch operations. Field paths use forward-slash notation matching the document's field structure (e.g. /name or /metadata/status). Each patch is one of: Add(path, value) — sets a field that does not yet exist. Remove(path) — removes the field at the given path. Replace(path, value) — overwrites an existing field's value.

Response: ids - IDs of the documents that were successfully updated.

Security
bearerAuth
Bodyapplication/json
updatesArray of strings or tenovos_document_Document_UpdateDocument_Patch (object)
curl -i -X POST \
  https://api.tenovos.net/api/v1/document/update \
  -H 'Authorization: Bearer <YOUR_JWT_HERE>' \
  -H 'Content-Type: application/json' \
  -d '{
    "updates": [
      {
        "id": "doc_01hbgk5cqef94v60bqg6qfv581",
        "patches": [
          {
            "replace": {
              "path": "/status",
              "value": "approved"
            }
          },
          {
            "replace": {
              "path": "/tags",
              "value": [
                "campaign",
                "hero",
                "approved"
              ]
            }
          }
        ]
      }
    ]
  }'

Responses

OK

Bodyapplication/json
idsArray of strings
Response
application/json
{ "ids": [ "string" ] }

Delete documents

Request

Soft-deletes one or more documents; deleted documents remain retrievable when includeDeleted is set.

Request: ids - List of internal document IDs to soft-delete. externalIds - List of external IDs to soft-delete by (alternative to ids).

Response: ids - IDs of the documents that were successfully deleted.

Security
bearerAuth
Bodyapplication/json
idsArray of strings
externalIdsArray of strings
curl -i -X POST \
  https://api.tenovos.net/api/v1/document/delete \
  -H 'Authorization: Bearer <YOUR_JWT_HERE>' \
  -H 'Content-Type: application/json' \
  -d '{
    "ids": [
      "doc_01hbgk5cqef94v60bqg6qfv581"
    ]
  }'

Responses

OK

Bodyapplication/json
idsArray of strings
Response
application/json
{ "ids": [ "string" ] }

Restore deleted documents

Request

Restores one or more soft-deleted documents, making them active again.

Request: ids - List of internal document IDs to restore. externalIds - List of external IDs to restore by (alternative to ids).

Response: ids - IDs of the documents that were successfully restored.

Security
bearerAuth
Bodyapplication/json
idsArray of strings
externalIdsArray of strings
curl -i -X POST \
  https://api.tenovos.net/api/v1/document/undelete \
  -H 'Authorization: Bearer <YOUR_JWT_HERE>' \
  -H 'Content-Type: application/json' \
  -d '{
    "ids": [
      "doc_01hbgk5cqef94v60bqg6qfv581"
    ]
  }'

Responses

OK

Bodyapplication/json
idsArray of strings
Response
application/json
{ "ids": [ "string" ] }

Permanently remove documents

Request

Permanently and irreversibly removes one or more documents, bypassing soft-delete.

Request: ids - List of internal document IDs to permanently delete. externalIds - List of external IDs to permanently delete by (alternative to ids).

Response: ids - IDs of the documents that were successfully purged.

Security
bearerAuth
Bodyapplication/json
idsArray of strings
externalIdsArray of strings
curl -i -X POST \
  https://api.tenovos.net/api/v1/document/purge \
  -H 'Authorization: Bearer <YOUR_JWT_HERE>' \
  -H 'Content-Type: application/json' \
  -d '{
    "ids": [
      "doc_01hbgk5cqef94v60bqg6qfv581"
    ]
  }'

Responses

OK

Bodyapplication/json
idsArray of strings
Response
application/json
{ "ids": [ "string" ] }

Reindex documents

Request

Triggers reindexing of all documents matching a given query expression, returning a cursor for paginated progress.

Request: query - Query expression identifying the documents to reindex.

Response: pageCursor - Cursor to pass in a subsequent request to continue reindexing the next page. Absent when reindexing is complete.

Security
bearerAuth
Bodyapplication/json
querystring

Rule data fields

curl -i -X POST \
  https://api.tenovos.net/api/v1/document/reindex \
  -H 'Authorization: Bearer <YOUR_JWT_HERE>' \
  -H 'Content-Type: application/json' \
  -d '{
    "query": "fetch(/) from(media) filter(/status == '\''approved'\'')"
  }'

Responses

OK

Bodyapplication/json
pageCursorstring

Rule data fields

Response
application/json
{ "pageCursor": "string" }

Document Types

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:

KindTypeDescription
ASSETRepresents a binary file or media asset (images, video, documents)
REFERENCERepresents a business entity that other documents relate to (brands, campaigns)
COLLECTIONGroups related documents together (categories, playlists)
LAYOUTStructures content for presentation (toolkits, sections, blocks)
OTHERCustom or unclassified kind

Platform-provided default kinds:

KindKindTypeDescription
mediaASSETRepresents assets that originate from external channels (images, video, files). Linked to binary content, brands, campaigns, and source channel.
brandREFERENCEOrganizational brand entity. Links to a logo and splash image. Fields: name, description, fgColor, bgColor.
campaignREFERENCEMarketing campaign. Links to brands and splash images. Fields: title, description, brief, start, end.
categoryCOLLECTIONDynamically generated content groupings. Supports subcategory hierarchies. Fields: name, label, description, versionNumber, depth, isLatest, keywords.
toolkitLAYOUTGroups sections of content representing a brand identity. Links to sections and a parent brand.
sectionLAYOUTPage layout element holding multiple blocks. Links to a toolkit, parent section, and child blocks.
blockLAYOUTPage 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.

Operations

Document Schemas

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:

SchemaTypeDescription
ROOTTop-level schema attached directly to a Document Kind
SUBNested schema for structured sub-objects within a document
TRAITSchema associated with a behavioral trait (e.g., SUMMARY, TIMELINE)

Available field types:

Field TypeDescription
stringPlain text value
integerWhole number
numberFloating point number
boolBoolean true/false
dateISO 8601 date or datetime
arrayList of values — element type can be string, integer, number, bool, or date
objectNested JSON object (references a SUB schema)
linkEdge to another document; has a cardinality (ONE_TO_ONE, ONE_TO_MANY, MANY_TO_ONE, MANY_TO_MANY)
refRead-only reference to a field on a linked document
computedDerived field calculated from other field values

Schema operations:

  • create-schema — define a new schema and attach it to a kind
  • update-schema — revise field definitions; changes apply to subsequent document writes
  • retrieve-schema / list-schema — inspect field definitions for a given kind
  • delete-schema — remove a schema, returning the kind to free-form metadata mode
Operations

Document Rules

Document 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 TypeBehavior
MATCH_ALLAll conditions must be true (AND logic)
MATCH_ANYAt least one condition must be true (OR logic)
MATCH_NONENo conditions may be true (NOT logic)

Condition operators:

OperatorDescription
OP_EQField equals the specified value
OP_NEField does not equal the specified value
OP_MATCHESField matches a regular expression
OP_NOT_MATCHESField does not match a regular expression
OP_IS_EMPTYField is absent or null
OP_IS_NOT_EMPTYField is present and non-null

Condition sources — what the condition evaluates against:

SourceDescription
SOURCE_KINDThe document kind (type)
SOURCE_DOC_VALUEThe current value of a document field
SOURCE_PREV_DOC_VALUEThe previous value of a field (before the triggering update)

Available actions:

ActionDescription
setPropertyWrite a metadata field value on the document
setLinkCreate a link edge between the document and another document
setPolicyApply an access policy grant (READ or MODIFY) to the document

Rule lifecycle:

  • create / update — define or revise rule conditions and actions
  • enable / disable — activate or pause a rule without deleting it
  • test — evaluate a rule against a sample document payload before enabling in production
  • delete — permanently remove a rule
Operations

Content Storage

The 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:

EndpointDescription
registerRecord that a piece of content exists at a known storage location (used during channel sync)
retrieve-upload-urlGet a pre-signed URL to upload a new file directly to the configured storage adapter
stagePrepare content for CDN delivery by writing it to the CDN origin adapter
retrieve-urlGet a pre-signed download or streaming URL for a content item
retrieve-infoFetch content metadata: size, MIME type, checksums, dimensions (for images)
list-infoBatch retrieval of content metadata for multiple items
updateUpdate mutable content metadata (alt text, tags, etc.)
delete / undeleteSoft-delete a content record with restore capability
purgePermanently remove the content record (does not delete the underlying file from storage)
deregisterRemove the content reference without affecting the underlying stored file

Adapter management:

EndpointDescription
create-adapterConfigure a new storage backend for the organization
update-adapterModify adapter settings (credentials, priority, storage class)
retrieve-adapter / list-adaptersInspect configured adapters
delete-adapter / undelete-adapter / purge-adapterManage adapter lifecycle
Operations

Authentication

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 operations
  • assign-default-role — assign the platform default role to a user, typically called during user provisioning or invite acceptance flows

For 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.

Operations

User Groups

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:

  • Create / Update / Retrieve / List — manage group definitions
  • Add Member / Revoke Member — control who belongs to the group
  • Activate / Disable — enable or suspend a group without deleting it; disabled groups do not grant their members any access
  • Purge — permanently remove a group and its membership records

Groups integrate with the Roles and Access Control systems, and are a key building block for multi-tenant or brand-scoped permission models.

Operations

Roles

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:

  • Create / Update — define a role and specify which permissions it grants
  • Retrieve / List — inspect role definitions across the organization
  • Activate / Disable — toggle a role without deleting it; disabling a role immediately removes its permissions from all assigned users
  • Purge — permanently delete a role

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.

Operations

Users

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 membership
  • update-user — modify user profile attributes
  • assign-user-role — directly assign a Role to a specific user
  • disable-user — suspend access without deleting the account
  • delete-user — remove a user from the organization

User identity and authentication (login, SSO, MFA) are handled externally by Clerk. These endpoints manage the platform-side user record, role assignments, and access state.

Operations

Permissions

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 roles
  • create-permission — define a new named permission, typically used when extending the platform with custom action types or integration-specific access gates
Operations

Access Control

Access 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:

GrantDescription
READUser can view and retrieve the resource
MODIFYUser 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 operations
  • retrieve-resource-groups — list the logical resource groups a user has access to, used for scoping queries and UI navigation
  • grant-access — explicitly grant a user or group access to a specific resource
  • revoke-access — remove a previously granted resource-level access
Operations

API Keys

API 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 creation
  • list-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 immediately
Operations

Channels

Channels 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:

CategoryDescription
ORIGINExternal content source to pull from (Box, Google Drive, SharePoint, S3, DAMs, etc.)
OBSERVATIONExternal system to observe for engagement events (Instagram, Facebook, Website, etc.)
DELIVERYDestination to push content to

Currently available channel types:

Origin (content pull):

ChannelGroupAuth
BoxCloud File StorageOAuth
Google DriveCloud File StorageOAuth
AWS S3Object StoreService Credentials
Tenovos DAMDAMOAuth
Adobe AEMDAMService Credentials
SitecoreDAMOAuth
BynderDAMOAuth
Brand FolderDAMOAuth
Azure BlobObject StoreOAuth
Google Cloud StorageObject StoreOAuth
SharePointCloud File StorageOAuth

Observation (engagement events):

ChannelGroup
InstagramSocial
FacebookSocial
WebsiteContent Management and Sites

Authentication methods:

Auth TypeDescription
OAUTHUser-delegated OAuth 2.0 flow; use retrieve-oauth-url then update-auth
API_KEYStatic API key submitted during channel creation
BASIC_AUTHUsername and password credentials
SERVICE_CREDENTIALSService account JSON or IAM role credentials (used by Adobe AEM, AWS S3)

Channel status lifecycle:

StatusDescription
DRAFTChannel created but not yet authenticated
AUTHENTICATEDCredentials stored; not yet scanning
ENABLEDActively scanning and webhook-registered
DISABLEDPaused; configuration and credentials retained

Channel lifecycle endpoints:

  • list-channel-types / retrieve-channel-types — discover available integrations and their configuration requirements
  • create-channel — configure a new connection (name, settings, auth)
  • update-channel — modify an existing channel's settings
  • enable-channel — activate scanning and webhook registration; channel begins syncing content
  • disable-channel — pause sync without deleting configuration; webhooks are torn down
  • delete-channel / purge-channels — remove channel(s) and all associated webhooks and scan state
  • validate-channel-config — test credentials and connectivity before enabling; returns OK, AUTH_FAILURE, or CONFIG_FAILURE

Authentication flow endpoints:

  • retrieve-oauth-url — get the OAuth authorization URL to redirect a user through
  • update-auth — exchange an OAuth authorization code or service credentials for stored tokens

Content discovery endpoints:

  • retrieve-folders — browse the folder, site, or library tree of a connected source
  • get-config-description — fetch the dynamic field schema for configuring a channel type; field types are TREE, DROPDOWN, or TEXT
  • get-config-details — retrieve selectable items (sites, folders, document libraries) for a specific channel instance
  • scan-content — manually trigger or resume a paginated content scan
  • retrieve-content — generate pre-signed download URLs for specific content items from the source
  • retrieve-content-metadata — fetch metadata for a specific item directly from the external source
  • retrieve-content-data — stream raw file content from the external source
  • retrieve-channel-account — return the authenticated account info (user profile, tenant ID, etc.) for a connected channel

Sync 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 channel

Scan 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.

Operations

Workflows

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.

  • Create / Update — define a workflow, its steps, and step configuration
  • Retrieve / List — inspect workflow definitions; list-default-groups returns platform-provided workflow templates as a starting point
  • Enable / Disable — activate or pause a workflow without deleting it
  • Purge — permanently remove a workflow definition

Running instances of a workflow are tracked as Jobs. Use the Jobs API to monitor progress, handle failures, and restart or cancel executions.

Operations

Actions

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 step
  • retrieve — fetch the full definition of a specific action, including its input parameters, output shape, and configuration requirements

Use the Actions API to programmatically build or validate workflow definitions without relying on hardcoded action identifiers.

Operations

Jobs

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 reference
  • retrieve — fetch the full status, logs, and output of a specific job
  • restart — re-queue a failed job; useful for transient failures such as network timeouts or temporary service unavailability
  • cancel — terminate a running or queued job; the job will not be retried
Operations

Share Authentication

Share Authentication handles identity verification for external recipients — people outside the organization who have received a share link but do not have a platform account.

The platform uses a one-time passcode (OTP) flow for external share access:

  1. The recipient visits a share link and enters their email address
  2. generate-otp sends a time-limited OTP to that address
  3. The recipient submits the OTP via exchange-otp, which returns a short-lived access token scoped to the specific share

This token is then used to call the Shared Content endpoints. It grants access only to what was explicitly included in the share — no other platform data is accessible.

Operations

Sharing

The Sharing API lets platform users distribute content to external recipients — people without a platform account — in a controlled, auditable way. Shares are scoped to specific documents or collections and can be time-limited, password-protected, or restricted to specific recipient email addresses.

  • create — create a new share, specifying documents, recipients, expiry, and access level
  • update — modify share settings (expiry date, recipient list, permissions)
  • retrieve / list — inspect share details and enumerate active shares in the organization
  • update-access — adjust what a specific recipient can do (view-only, download, etc.)
  • revoke — immediately invalidate a share; recipients lose access on their next request

External recipients authenticate into a share using Share Authentication and then access content via Shared Content.

Operations

Shared Content

These endpoints are called by external share recipients after authenticating via Share Authentication. They provide a read-only, scoped view of the content included in a specific share — no other platform data is accessible.

  • retrieve-shared-documents — list the documents included in the share, with metadata
  • retrieve-content — get a pre-signed download URL for a specific shared content item
  • retrieve-branding-content — fetch branding assets (logo, colors, fonts) associated with the share, used to render the share portal with the sender's organization branding
Operations

Media Processing

The 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:

OperationExamples
Image processingResize, crop, format conversion (JPEG, PNG, WebP, AVIF), resolution scaling, thumbnail generation
Video transcodingFormat conversion, bitrate adjustment, preview clip generation
Document conversionOffice/PDF to image preview, page extraction
AI enrichmentImage 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 tracking
  • status — poll the current state of a job (queued, running, completed, failed) and retrieve the output content location when complete
  • cancel — remove a queued job before execution begins; jobs already running cannot be cancelled mid-execution
Operations