# Content

### About this export

| Field | Value |
| --- | --- |
| **content_type** | lesson |
| **platform** | contentstack-academy |
| **source_url** | https://www.contentstack.com/academy/courses/lytics-implementation/content |
| **course_slug** | lytics-implementation |
| **lesson_slug** | content |
| **markdown_file_url** | /academy/md/courses/lytics-implementation/content.md |
| **generated_at** | 2026-08-07T05:57:40.104Z |

> Part of **[Lytics Implementation](https://www.contentstack.com/academy/courses/lytics-implementation)** on Contentstack Academy. **Academy MD v3** — structured for retrieval; no quiz or assessment keys.

<!-- ai_metadata: {"lesson_id":"10","type":"text","duration_minutes":14,"topics":["Content"]} -->

#### Lesson text

Lytics includes a built-in content intelligence engine that classifies your web content into topics and uses those classifications to compute content affinity scores on every profile. This section covers how to configure content ingestion, review and correct classification results, enrich the content corpus with custom metadata via context layers, curate content into collections for recommendations, and read content affinity signals from profiles for segmentation and personalization. By the end, you will be able to stand up and operate the full content pipeline — from raw page view events through to recommendation delivery.

## Content Configuration

### Learning Objectives

By the end of this section, you will be able to:  
\- Set up content ingestion in Lytics so that web pages, articles, and other content are automatically collected  
\- Configure content ingestion inputs including event-driven URL discovery, manual classification, and corpus API ingestion  
\- Verify that content is being collected by checking the content library for expected entries

### Setting Up Content Ingestion

Lytics treats each content item as a **document** and the full set of documents as a **corpus** — the `content` table that stores classified content records used by affinities, collections, and recommendations. For web implementations, new content is usually discovered from incoming events that contain a `url` field.

When Lytics receives an event containing a new URL, it writes a content-enrichment event to `lytics_content_enrich` and maps output into the `content` table via the `lytics_content` query.

To configure content ingestion reliably, focus on four controls first:  
\- **Account content allowlists**: include every production domain/subdomain where content should be crawled.  
\- **Crawler access**: ensure `lyticsbot` can fetch your pages via `robots.txt` and network policy.  
\- **Tag/event coverage**: ensure page and content interaction events include URLs.  
\- **Manual ingest options**: use Content Classification or Content Corpus API for controlled onboarding and backfills.

#### Key Concepts

*   **Domain allowlist controls collection scope**: if a domain is missing, content from that domain will not classify correctly.
*   **Crawlability is required**: `robots.txt` and server allowlists can block enrichment.
*   **Discovery is event-driven**: Lytics observes URLs in stream events; it is not a generic web crawler that continuously indexes your entire site by default.
*   **Non-web content is supported**: add documents by sending URL/text directly to the corpus API.

#### Step-by-Step

1.  Go to **Account > Settings > Content** and populate **Content domains allowlist** with all production domains/subdomains.
2.  Confirm your site permits `lyticsbot` and exposes valid metadata for title, image, and topic extraction.
3.  Validate that your tag/event pipeline is sending URL-bearing events (for example, page views).
4.  Open **Content > Classification** and run a manual classification on representative URLs.
5.  Open **Content > Documents** and verify new documents appear with expected metadata.
6.  If you need to ingest controlled records (non-web, staged, or backfill), send documents with the Content Corpus API.

#### Examples

```bash
curl -s -XPOST "https://api.lytics.io/api/content/corpus" \
  -H "Authorization: $LIOKEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.example.com/blog/launch-post",
    "topics": "Product Launch,CDP"
  }'
```

```text
Quick validation pattern:
- Add domain to content allowlist
- Manually classify 3-5 representative URLs
- Confirm each has title + primary image + topics
```

#### Diagrams & Screenshots

![Content ingestion flow from URL events through enrichment into the content table.](https://images.contentstack.io/v3/assets/bltebc53cfaf0dd6403/amf8c7aa00b681aecf/b1c1cdaa0468c6fa0bd3fe9e/content_ingestion_flow_url_events.png)

### Summary

Content ingestion in Lytics is event-driven: the platform discovers new URLs from incoming stream events and enriches them into the document corpus automatically. To get this working, you need the domain allowlist configured, crawler access confirmed, and URL-bearing events flowing from the tag. For backfills or non-web content, use the Content Corpus API to push documents directly. Validate by checking the Content Documents view for expected entries with title, image, and topic metadata.

### Documentation Links

*   [Content Configuration](https://docs.lytics.com/docs/content-configuration)
*   [Content Corpus API](https://docs.lytics.com/docs/content-corpus-api)

## Classification

### Learning Objectives

By the end of this section, you will be able to:  
\- Understand how Lytics uses AI-powered content classification to automatically categorize and tag content  
\- Review and adjust classification results to correct misclassifications and improve accuracy  
\- Manage the content taxonomy including topics, categories, and custom labels

### AI-Powered Content Classification

The **Classification** page provides operational visibility into content processing and a manual classifier for testing and correction.

From the product documentation and UI behavior, the page is split into:  
\- **Classification Dashboard**: activity and flow-state visibility.  
\- **Manual Content Classification**: URL-level preview and topic override before corpus commit.

By default, classification runs continuously in background workflows and reprocesses content over time (subject to account limits).

#### Key Concepts

*   **Classification activity quota**: default docs guidance references up to 20,000 documents per month (new + reclassifications) unless contract settings differ.
*   **Flow-state diagnostics**: distinguish allowlist issues, robots blocking, non-200 fetches, and enrichment failures.
*   **Manual classify supports curation**: review topics, adjust as needed, then complete classification.
*   **URL normalization**: Lytics applies URL sanitation logic (`urlmain`) to reduce duplicate URL variants.

#### Step-by-Step

1.  Open **Content > Classification**.
2.  Review activity and flow states to detect blocked domains, path restrictions, or HTTP failures.
3.  In **Manual Content Classification**, classify a target URL.
4.  Validate extracted `title`, `primary_image`, and `topics`.
5.  Add/remove topics when needed, then click **Complete Classification** to write the document into corpus.
6.  Re-run classification checks after metadata/template updates on your site.

#### Examples

```html
<!-- Optional publisher-supplied topics -->
<meta name="lytics:topics" content="Customer Data Platform, Identity Resolution" />
```

```bash
# Preview classification only (debug)
curl -s -XGET "https://api.lytics.io/api/content/doc/classify?url=https://www.example.com/blog/post" \
  -H "Authorization: $LIOKEY"
```

```bash
# Classify and add to corpus
curl -s -XPOST "https://api.lytics.io/api/content/doc/classify?url=https://www.example.com/blog/post" \
  -H "Authorization: $LIOKEY"
```

#### Diagrams & Screenshots

![Classification dashboard showing activity, content flow states, and manual classify panel.](https://images.contentstack.io/v3/assets/bltebc53cfaf0dd6403/am73bc3e943df8481f/d27a146ceac1ae66ed53d938/classification_dashboard_activity_content_flow.png)

### Summary

Classification runs automatically in the background, but the Classification page gives you the operational controls to diagnose failures and correct results manually. Use the dashboard flow states to identify blocked domains or crawl failures, and use the manual classifier to preview and override topic assignments before committing documents to the corpus. After any significant site metadata changes, re-run classification checks to ensure the corpus stays accurate.

### Documentation Links

*   [Content Classification](https://docs.lytics.com/docs/content-classification)
*   [Content Taxonomy Management](https://docs.lytics.com/docs/content-taxonomy)

## Context Layers

### Learning Objectives

By the end of this section, you will be able to:  
\- Add context layers to content to enrich classification with custom metadata dimensions  
\- Use metadata from context layers for enhanced audience targeting and personalization  
\- Configure context layer sources, including CMS metadata, manual tags, and external data feeds

### Enriching Content with Context Layers

Lytics supports three context-layer patterns:  
\- **Standard Context Layer**: default NLP-based topic extraction on web content.  
\- **Custom Context Layers**: map custom content fields to user-level affinity fields.  
\- **Collaborative Filters**: model user-item similarity for "users also viewed/bought" recommendations.

In current navigation, these are managed at **Content > Context Layers**.

#### Key Concepts

*   **Standard field mappings**:
*   `content.hashedurl` identifies documents.
*   `content.global` stores topic/features.
*   `user.hashedurls` captures viewed item IDs.
*   `user.lytics_content` stores inferred topic-level interests.
*   **Custom layers are schema-driven**: you select inventory ID + feature field on `content`, then map user inventory field.
*   **Collaborative filters require behavior links**: a set/map on user profiles that references content IDs.
*   **Output fields become audience-usable**: context-layer outputs can be used directly in Audience Builder rules.

#### Step-by-Step

1.  Open **Content > Context Layers**.
2.  Choose **New Context Layer** and select one type:  
    \- Custom Context Layer  
    \- Collaborative Filter  
    \- Shopify-specific guided option (if applicable)
3.  For custom layers:
4.  Select content identifier field (inventory ID).
5.  Select one or more feature/topic fields to project.
6.  Map the related user field that contains inventory interactions.
7.  Set output field name and save.
8.  For collaborative filters:
9.  Define name and description.
10.  Select inventory ID on content.
11.  Select user inventory-history field (set/map).
12.  Save and wait for model training.
13.  Validate outputs on sample user profiles and in audience rule selectors.

#### Examples

```text
Custom context layer (commerce):
- content id field: shopify_product_id
- content feature field: shopify_product_tags
- user inventory field: shopify_product_ids
- output user field: shopify_affinities_tag_
```

```bash
# Explore topic graph used by context-layer workflows
curl -s -XGET "https://api.lytics.io/api/content/taxonomy?limit=150" \
  -H "Authorization: $LIOKEY"
```

#### Diagrams & Screenshots

![Context layer creation wizard showing inventory mapping and output field configuration.](https://images.contentstack.io/v3/assets/bltebc53cfaf0dd6403/amdc6605baf3a80c4a/228e9fb477051fb2996a01ce/context_layer_creation_wizard_inventory.png)

### Summary

Context layers extend the platform's default NLP classification with custom metadata dimensions. Custom context layers map content-side feature fields (like product tags or CMS categories) to user-level affinity fields, creating audience-usable signals beyond standard topic scores. Collaborative filters take this further by modeling user-item similarity from interaction history. In both cases, validate the output fields on real profiles and confirm they appear as selectable criteria in the Audience Builder before activating downstream.

### Documentation Links

*   [Context Layers](https://docs.lytics.com/docs/context-layers)
*   [Collaborative Filtering](https://docs.lytics.com/docs/collaborative-filtering)

## Content Collections

### Learning Objectives

By the end of this section, you will be able to:  
\- Create content collections to group related content items for specific use cases or campaigns  
\- Organize content into curated groups using manual selection, filters, or dynamic rules  
\- Use content collections as the basis for recommendation widgets and personalized content delivery

### Curating Content with Collections

Content Collections are content-side segmentation objects. Where audiences segment users, collections segment documents.

Lytics supports both:  
\- **Dynamic collections**: rule-driven and continuously updating.  
\- **Locked collections**: static, hand-selected documents.

Lytics also auto-creates foundational collections (for example, all documents and recommendation-ready defaults) to accelerate setup.

#### Key Concepts

*   **Collections are recommendation boundaries**: they constrain what can be returned by recommendation APIs and experiences.
*   **Builder filters are composable**: title/description/URL, content type, publish date, features, author, affinities, topics.
*   **Advanced editor unlocks full expression power**: combine collection inclusion and content-field logic beyond basic filters.
*   **Lifecycle operations matter**: duplicate, edit, delete, and re-enrich with dependency checks.

#### Step-by-Step

1.  Go to **Content > Collections** and click **New Collection**.
2.  Decide **Dynamic** or **Locked**.
3.  Add filters that match campaign intent (for example, path + topics + recency).
4.  Save collection and open its summary page.
5.  Validate:  
    \- **Documents tab** for content quality.  
    \- **Recommendations tab** for user-level recommendation testing.
6.  If needed, open **Advanced Editor** to add custom rule logic.
7.  Use **Re-Enrich** after major metadata/template updates.

#### Examples

```text
Collection pattern: recent_blog_growth_marketing
- dynamic collection
- URL contains /blog/
- topic includes "Growth Marketing"
- published in last 30 days
- has primary image + description
```

```text
Locked collection pattern: q4_hero_assets
- static curated set of high-priority launch pages
- manually selected to avoid churn during campaign period
```

#### Diagrams & Screenshots

![Content collection builder showing dynamic filters and advanced editor options.](https://images.contentstack.io/v3/assets/bltebc53cfaf0dd6403/amb5f59cec271f9d2c/4ce3515fe60a0ea62b737cbe/content_collection_builder_dynamic_filters.png)

### Summary

Collections are the scoping layer for content recommendations — they define what the recommendation engine is allowed to return. Dynamic collections update continuously as new content is classified and filtered; locked collections are static and useful for campaigns where content stability matters. Validate every collection using the Documents and Recommendations tabs before attaching it to a delivery channel, and use Re-Enrich after any significant site metadata updates to keep collection membership accurate.

### Documentation Links

*   [Content Collections](https://docs.lytics.com/docs/content-collections)
*   [Content Recommendations](https://docs.lytics.com/docs/content-recommendations)

## Content on Profile

### Learning Objectives

By the end of this section, you will be able to:  
\- Understand how content affinity appears on user profiles as topic scores and content engagement data  
\- Use content affinity fields for segmentation to build audiences based on what users read and engage with  
\- Interpret content engagement scores to distinguish between casual browsers and deeply engaged readers

### Understanding Content Affinity on Profiles

Content processing produces user-level fields that power segmentation and recommendations. Topic and affinity scores are relative ranking signals across users and topics — treat them as comparative indicators, not absolute truth. The most important profile fields are:  
\- `lytics_content` (map\[string\]number): topic-level interests.  
\- `lytics_rollup` (map\[string\]number): affinity rollups/groups.  
\- `lytics_content_inferred` (map\[string\]number): inferred-only interests.  
\- `hashedurls` (map): hashed content IDs the user engaged with.

#### Key Concepts

*   **Behavior drives affinity**: topic signals rise/fall based on observed interactions and model updates.
*   **Rollups simplify activation**: use affinity rollups when you need broad categories instead of atomic topics.
*   **Inferred-only field caution**: docs recommend avoiding `lytics_content_inferred` as a sole targeting field.
*   **Profile verification is mandatory**: always inspect real profiles before activating content-based audiences.

#### Step-by-Step

1.  Open a known profile in **Profile Explorer**.
2.  Inspect `lytics_content`, `lytics_rollup`, and supporting behavioral fields.
3.  Confirm that recent content behavior matches expected topic signals.
4.  Build a test audience using one topic/affinity rule.
5.  Validate audience sample users for false positives/negatives.
6.  Iterate thresholds/conditions before production activation.

#### Examples

```bash
# Fetch a user profile and inspect content-affinity fields
curl -s -XGET "https://api.lytics.io/api/entity/user/email/jane@example.com" \
  -H "Authorization: $LIOKEY"
```

```text
Audience logic pattern:
- Include users where lytics_rollup["B2B Marketing"] >= medium
- Exclude users where lifecycle_stage = customer
```

### Summary

Content affinity data lives on the profile as a set of map fields — `lytics_content` for atomic topic scores, `lytics_rollup` for grouped categories, and `hashedurls` for the specific content items a user engaged with. Scores are relative signals, not absolute values, so validate them against real profiles before building production audiences. Prefer rollup fields when you want broad category targeting; use atomic topic fields when you need precise interest matching.

### Documentation Links

*   [Content Affinity on Profiles](https://docs.lytics.com/docs/content-affinity)
*   [Profile Explorer](https://docs.lytics.com/docs/profile-explorer)

## Recommendations

### Learning Objectives

By the end of this section, you will be able to:  
\- Configure the Lytics content recommendation engine, including selecting collections and setting recommendation strategies  
\- Tune recommendation parameters such as ranking mode, visited filtering, and collection constraints  
\- Deliver recommendations to end users via Pathfora widgets, the Personalize API, or custom integrations

### Configuring and Delivering Content Recommendations

Lytics recommendations can be implemented through:  
\- **Lytics UI** (Interest Engine and Collection recommendation tabs)  
\- **Pathfora** recommendation modules  
\- **Recommendation APIs** for custom web/email/app delivery

The API path most teams start with is:  
\- `GET /api/content/recommend/user/{fieldname}/{fieldval}`

For campaign-wide defaults, use segment-scoped recommendations:  
\- `GET /api/content/recommend/segment/{segId}`

#### Key Concepts

*   **Collection-first recommendation strategy**: use `contentsegment` to constrain recommendation scope and avoid irrelevant pages.
*   **Ranking modes**: `affinity`, `popular`, `recent`.
*   **Visit filtering**: `visited=false` suppresses already-viewed content.
*   **Fallback handling**: Pathfora supports default content blocks when recommendation calls return no result.

#### Step-by-Step

1.  Build or select a recommendation-ready content collection.
2.  Validate collection quality:  
    \- documents return HTTP 200,  
    \- documents are enriched,  
    \- documents have topics.
3.  Test recommendations from the collection summary **Recommendations** tab using a known identity.
4.  Implement API call in your delivery channel (site/email/service).
5.  Tune parameters (`rank`, `limit`, `visited`, `shuffle`, topic constraints).
6.  Add fallback behavior for sparse profiles.
7.  Monitor engagement and iterate collection filters plus rank strategy.

#### Examples

```bash
curl -s -XGET "https://api.lytics.io/api/content/recommend/user/email/alex@example.com?contentsegment=recent_blog_growth_marketing&limit=5&rank=affinity&visited=false" \
  -H "Authorization: $LIOKEY"
```

```javascript
// Pathfora recommendation module excerpt
const widget = {
  type: "message",
  layout: "modal",
  recommend: {
    collection: "recent_blog_growth_marketing",
    rank: "affinity",
    visited: false,
    shuffle: true
  },
  content: [
    {
      default: true,
      title: "Explore our latest resources",
      url: "https://www.example.com/resources"
    }
  ]
};
```

#### Diagrams & Screenshots

![Recommendation workflow from collection definition to API delivery and performance optimization.](https://images.contentstack.io/v3/assets/bltebc53cfaf0dd6403/amb9ea60d6f11ac644/85d48ee6e5b356ea1abb70b0/recommendation_workflow_collection_definition_api.gif)

### Summary

Recommendations tie together the content corpus, affinity scores, and collections into a delivery mechanism. Start by validating your collection's document quality, then test recommendations against known user identities before wiring up your delivery channel. Constrain scope with a `contentsegment` parameter, tune ranking mode and visit filtering to match your intent, and always implement fallback content for profiles with sparse affinity data. Monitor engagement after launch and iterate on collection filters and rank strategy based on performance.

### Documentation Links

*   [Content Recommendations](https://docs.lytics.com/docs/content-recommendations)
*   [Recommendation API](https://docs.lytics.com/docs/recommendation-api)
*   [Pathfora Recommendations](https://docs.lytics.com/docs/pathfora-recommendations)

## What You've Learned

You now understand how Lytics builds and maintains a classified content corpus from your web pages and other content assets — from the domain allowlist and crawler configuration that govern ingestion, through the AI-powered classification pipeline, to the context layers that extend the corpus with custom metadata. You've seen how that corpus feeds into user profiles as content affinity scores, how those scores become audience criteria in the builder, and how collections scope the recommendation engine to return only the right content to the right person. Together, these capabilities make content a first-class signal in your segmentation and personalization strategy, not just a reporting artifact.

### Key Terms

> 📘 **Document** — A single classified content record in Lytics, representing a web page, article, or other content asset stored in the corpus.
> 
> 📘 **Corpus** — The `content` table in Lytics that stores all classified document records, used by affinity computation, collections, and recommendations.
> 
> 📘 **Content Affinity** — A platform-computed score measuring how strongly a user profile is associated with a content topic, based on observed content interactions. Stored as a map of topic-to-score values in `lytics_content`.
> 
> 📘 **Context Layer** — A configuration that maps custom content-side metadata (such as product tags or CMS categories) to user-level affinity fields, extending classification beyond standard NLP topics.
> 
> 📘 **Collaborative Filter** — A context-layer type that models user-item similarity from interaction history, enabling "users also viewed" recommendation patterns.
> 
> 📘 **Content Collection** — A content-side segmentation object that groups documents for use in recommendations. Collections can be dynamic (rule-driven) or locked (static/hand-curated).
> 
> 📘 **Affinity Rollup** — A grouped aggregation of atomic topic scores stored in `lytics_rollup`, used when broad-category targeting is preferable to individual topic precision.
> 
> 📘 **lyticsbot** — The Lytics crawler that fetches and enriches web pages after URL discovery. Must be permitted in `robots.txt` and server network policies for content ingestion to work correctly.

#### Key takeaways

- Connect **Content** back to your stack configuration before moving to the next module.
- Capture one concrete artifact (screenshot, Postman call, or code snippet) that proves the step works in your environment.
- Re-read the delivery versus management boundary for anything you changed in the entry model.

## Supplement for indexing

### Content summary

Content. Lytics includes a built-in content intelligence engine that classifies your web content into topics and uses those classifications to compute content affinity scores on every profile. This section covers how to configure content ingestion, review and correct classification results, enrich the content corpus with custom metadata via context layers, curate content into collections for recommendations, and read content affinity signals from profiles for segmentation and personalization. By the end, you will be able to stand up and operate the full content pipeline — from raw page view events through to recommendation delivery. Content Configuration Learning Objectives By the end of this section

### Retrieval tags

- Content
- lytics-implementation
- lesson 10
- lytics-implementation lesson

### Indexing notes

Index this lesson as a primary chunk tagged with lesson_id "10" and topics: [Content].
Parent course slug: lytics-implementation. Use asset_references URLs as thumbnail hints in search results when present.
Never surface LMS quiz content or assessment answers from this file.

### Asset references

| Label | URL |
| --- | --- |
| Content ingestion flow from URL events through enrichment into the content table. | `https://images.contentstack.io/v3/assets/bltebc53cfaf0dd6403/amf8c7aa00b681aecf/b1c1cdaa0468c6fa0bd3fe9e/content_ingestion_flow_url_events.png` |
| Classification dashboard showing activity, content flow states, and manual classify panel. | `https://images.contentstack.io/v3/assets/bltebc53cfaf0dd6403/am73bc3e943df8481f/d27a146ceac1ae66ed53d938/classification_dashboard_activity_content_flow.png` |
| Context layer creation wizard showing inventory mapping and output field configuration. | `https://images.contentstack.io/v3/assets/bltebc53cfaf0dd6403/amdc6605baf3a80c4a/228e9fb477051fb2996a01ce/context_layer_creation_wizard_inventory.png` |
| Content collection builder showing dynamic filters and advanced editor options. | `https://images.contentstack.io/v3/assets/bltebc53cfaf0dd6403/amb5f59cec271f9d2c/4ce3515fe60a0ea62b737cbe/content_collection_builder_dynamic_filters.png` |
| Recommendation workflow from collection definition to API delivery and performance optimization. | `https://images.contentstack.io/v3/assets/bltebc53cfaf0dd6403/amb9ea60d6f11ac644/85d48ee6e5b356ea1abb70b0/recommendation_workflow_collection_definition_api.gif` |

### External links

| Label | URL |
| --- | --- |
| Contentstack Academy home | `https://www.contentstack.com/academy/` |
| Training instance setup | `https://www.contentstack.com/academy/training-instance` |
| Academy playground (GitHub) | `https://github.com/contentstack/contentstack-academy-playground` |
| Contentstack documentation | `https://www.contentstack.com/docs/` |
| Content ingestion flow from URL events through enrichment into the content table. | `https://images.contentstack.io/v3/assets/bltebc53cfaf0dd6403/amf8c7aa00b681aecf/b1c1cdaa0468c6fa0bd3fe9e/content_ingestion_flow_url_events.png` |
| Content Configuration | `https://docs.lytics.com/docs/content-configuration` |
| Content Corpus API | `https://docs.lytics.com/docs/content-corpus-api` |
| Classification dashboard showing activity, content flow states, and manual classify panel. | `https://images.contentstack.io/v3/assets/bltebc53cfaf0dd6403/am73bc3e943df8481f/d27a146ceac1ae66ed53d938/classification_dashboard_activity_content_flow.png` |
| Content Classification | `https://docs.lytics.com/docs/content-classification` |
| Content Taxonomy Management | `https://docs.lytics.com/docs/content-taxonomy` |
| Context layer creation wizard showing inventory mapping and output field configuration. | `https://images.contentstack.io/v3/assets/bltebc53cfaf0dd6403/amdc6605baf3a80c4a/228e9fb477051fb2996a01ce/context_layer_creation_wizard_inventory.png` |
| Context Layers | `https://docs.lytics.com/docs/context-layers` |
| Collaborative Filtering | `https://docs.lytics.com/docs/collaborative-filtering` |
| Content collection builder showing dynamic filters and advanced editor options. | `https://images.contentstack.io/v3/assets/bltebc53cfaf0dd6403/amb5f59cec271f9d2c/4ce3515fe60a0ea62b737cbe/content_collection_builder_dynamic_filters.png` |
| Content Collections | `https://docs.lytics.com/docs/content-collections` |
| Content Recommendations | `https://docs.lytics.com/docs/content-recommendations` |
| Content Affinity on Profiles | `https://docs.lytics.com/docs/content-affinity` |
| Profile Explorer | `https://docs.lytics.com/docs/profile-explorer` |
| Recommendation workflow from collection definition to API delivery and performance optimization. | `https://images.contentstack.io/v3/assets/bltebc53cfaf0dd6403/amb9ea60d6f11ac644/85d48ee6e5b356ea1abb70b0/recommendation_workflow_collection_definition_api.gif` |
| Recommendation API | `https://docs.lytics.com/docs/recommendation-api` |
