> ## Documentation Index
> Fetch the complete documentation index at: https://docs.topsort.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Digital Asset Management

> Connect Topsort with Digital Asset Management platforms for streamlined creative workflows

export const LastUpdated = ({date, lang = "en"}) => {
  const translations = {
    en: "Last updated:",
    es: "Última actualización:",
    pt: "Última atualização:",
    fr: "Dernière mise à jour:",
    de: "Zuletzt aktualisiert:"
  };
  const label = translations[lang] || translations.en;
  return <>
<style>{`
.last-updated-component {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 10px 16px;
border-radius: 8px;
margin-top: 12px;
margin-bottom: 16px;
font-size: 14px;
background-color: rgba(0, 0, 0, 0.05);
border: 1px solid rgba(0, 0, 0, 0.12);
color: rgba(0, 0, 0, 0.75);
line-height: 1;
}

        .last-updated-component svg {
          flex-shrink: 0;
          vertical-align: middle;
        }

        .last-updated-component span {
          display: inline-flex !important;
          align-items: center !important;
          line-height: 1 !important;
        }

        [data-theme="dark"] .last-updated-component {
          background-color: #3a3a3a;
          border: 2px solid #888888;
          color: #ffffff;
        }

        [data-theme="dark"] .last-updated-component svg {
          stroke: #ffffff;
        }
      `}</style>
      <div className="last-updated-component">
        <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
          <circle cx="12" cy="12" r="10" />
          <polyline points="12 6 12 12 16 14" />
        </svg>
        <span>
          <strong style={{
    fontWeight: 600
  }}>{label}</strong> 
          <time dateTime={date}>{date}</time>
        </span>
      </div>
    </>;
};

# Connecting Topsort with Digital Asset Management Systems

<div style={{ textAlign: "justify", marginBottom: "1.5rem" }}>
  **Digital Asset Management (DAM)** systems like Adobe Experience Manager
  Assets, Bynder, and others centralize creative assets and generate optimized
  URLs for campaign use. Unlike OMS connectivity, DAM connectivity is currently
  feasible with Topsort's existing APIs.
</div>

<div style={{ textAlign: "justify", marginBottom: "1.5rem" }}>
  This guide explains how to integrate Topsort's APIs with DAM systems for
  streamlined creative workflows and automated asset management.
</div>

<Frame>
  <img className="block dark:hidden" src="https://mintcdn.com/topsort/lJrVI0_31YmwNFmR/images/knowledge-base/dam-diagram-light.svg?fit=max&auto=format&n=lJrVI0_31YmwNFmR&q=85&s=03f87e0d2893edc94ba901eed3c8fc8c" alt="Diagram showing dam connectivity" width="1063" height="264" data-path="images/knowledge-base/dam-diagram-light.svg" />

  <img className="hidden dark:block" src="https://mintcdn.com/topsort/lJrVI0_31YmwNFmR/images/knowledge-base/dam-diagram-dark.svg?fit=max&auto=format&n=lJrVI0_31YmwNFmR&q=85&s=6914f4b495de9ac2d599ec1d7efc8060" alt="Diagram showing dam connectivity" width="1063" height="264" data-path="images/knowledge-base/dam-diagram-dark.svg" />
</Frame>

## How DAM Systems Work with Topsort

<div style={{ textAlign: "justify", marginBottom: "1.5rem" }}>
  DAM systems like Adobe Experience Manager Assets, Bynder, or Webdam:
</div>

1. **Centralize Assets**: Store all banners, product images, videos in one organized repository
2. **Generate CDN URLs**: Create optimized, publicly accessible URLs for each asset
3. **Manage Versions**: Track approved versions and prevent outdated assets from being used
4. **Control Brand Compliance**: Ensure only approved, on-brand assets reach campaigns

## Workflows

<div style={{ textAlign: "justify", marginBottom: "1.5rem" }}>
  DAM integration involves four distinct workflows for different roles and
  timing:
</div>

| **Workflow**                                                    | **Who**                       | **When**        | **Purpose**                                               |
| --------------------------------------------------------------- | ----------------------------- | --------------- | --------------------------------------------------------- |
| [Implementation Guide](#implementation-guide)                   | DevOps/Integration Team       | One-time setup  | Establish automated DAM ↔ Topsort sync                    |
| [UI Workflow](#ui-workflow)                                     | Vendors/Marketplace Admins    | Per campaign    | Create banner campaigns via dashboard with DAM URLs       |
| [API Workflow](#api-workflow-complete-banner-campaign-creation) | Campaign Managers/Advertisers | Per campaign    | Create banner campaigns programmatically using DAM assets |
| [Auction & Display](#auction-response-with-dam-urls)            | Marketplace Developers        | Every page load | Show winning banners to users                             |

### Creating Banner Campaigns with DAM Assets

#### UI Workflow

<div style={{ textAlign: "justify", marginBottom: "1.5rem" }}>
  **Role:** Vendors/Marketplace Admins | **Frequency:** Per campaign setup
</div>

<div style={{ textAlign: "justify", marginBottom: "1.5rem" }}>
  \*\*

  <Frame>
    <img src="https://mintcdn.com/topsort/JfdWUceY7Se3NW-0/images/knowledge-base/banner-ad-url-image-example.webp?fit=max&auto=format&n=JfdWUceY7Se3NW-0&q=85&s=a2f769e27762a20d98031497acfff689" alt="Start of the sponsored brands template creation" width="2982" height="1859" data-path="images/knowledge-base/banner-ad-url-image-example.webp" />
  </Frame>

  \*\*
</div>

<Note>
  For creating banner campaigns with external DAM URLs through the **[Ad
  Platform](https://www.topsort.com/retail-media)**, refer to the comprehensive
  [Banner Ads Campaigns
  guide](/en/knowledge-base/ad-platform/banners/banner-ads-campaigns) which
  shows the step-by-step UI process including how to reference external URLs in
  campaign setup.
</Note>

#### API Workflow: Complete Banner Campaign Creation

<div style={{ textAlign: "justify", marginBottom: "1.5rem" }}>
  **Role:** Campaign Managers/Advertisers | **Frequency:** Per campaign setup
</div>

<Steps>
  <Step title="Create Asset with DAM URL">
    <div style={{textAlign: 'justify', marginBottom: '1.5rem'}}>
      First, create an asset in Topsort that references your DAM URL:
    </div>

    ```javascript theme={null}
    const assetResponse = await fetch("https://api.topsort.com/v2/assets", {
      method: "POST",
      headers: {
        Authorization: "Bearer YOUR_API_KEY",
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        name: "Holiday Banner 728x90 - Approved v2",
        url: "https://dam-cdn.retailer.com/campaigns/holiday/banner-728x90-v2.jpg",
        dimensions: {
          width: 728,
          height: 90,
        },
        metadata: {
          approved: true,
          brand_compliant: true,
          expiry_date: "2024-12-31",
          version: "v2",
        },
      }),
    });

    const asset = await assetResponse.json();
    ```
  </Step>

  <Step title="Create Banner Campaign Using the Asset">
    <div style={{textAlign: 'justify', marginBottom: '1.5rem'}}>
      Next, create a banner campaign that references the asset you just created:
    </div>

    ```javascript theme={null}
    const campaignResponse = await fetch("https://api.topsort.com/v2/campaigns", {
      method: "POST",
      headers: {
        Authorization: "Bearer YOUR_API_KEY",
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        name: "Holiday Banner Campaign",
        type: "banners",
        vendor_id: "vendor-123",
        bidding_strategy: "target_roas",
        target_roas: 4.5,
        budget: {
          amount: 5000,
          currency: "USD",
          period: "lifetime",
        },
        start_date: "2024-11-01",
        end_date: "2024-12-31",
        assets: [asset.id], // Reference the created asset
        slot_id: "homepage_banner_top",
      }),
    });

    const campaign = await campaignResponse.json();
    ```
  </Step>
</Steps>

#### Auction Response with DAM URLs

<div style={{ textAlign: "justify", marginBottom: "1.5rem" }}>
  **Role:** Marketplace Developers | **Frequency:** Every page load
</div>

<Steps>
  <Step title="Run Auction for Banner Slot">
    <div style={{textAlign: 'justify', marginBottom: '1.5rem'}}>
      Request an auction for the banner slot where your DAM-based campaign can compete:
    </div>

    ```javascript theme={null}
    const auctionResponse = await fetch("https://api.topsort.com/v2/auctions", {
      method: "POST",
      headers: {
        Authorization: "Bearer YOUR_API_KEY",
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        auctions: [
          {
            type: "banners",
            slots: 1,
            slotId: "homepage_banner_top",
            device: "desktop",
          },
        ],
      }),
    });

    const auctionResult = await auctionResponse.json();
    ```
  </Step>

  <Step title="Receive DAM URL in Response">
    <div style={{textAlign: 'justify', marginBottom: '1.5rem'}}>
      When your banner campaign wins, the auction response includes the original DAM URL:
    </div>

    ```json theme={null}
    {
      "results": [
        {
          "winners": [
            {
              "rank": 1,
              "type": "product",
              "id": "p_PJbnN",
              "resolvedBidId": "WyJlX1BKYm5OIiwiMTJhNTU4MjgtOGVhZC00Mjk5LTgzMjctY2ViYjAwMmEwZmE4IiwiYmFubmVyQWRzIiwiZGVmYXVsdCIsIiJd",
              "asset": [
                {
                  "url": "https://dam-cdn.retailer.com/campaigns/holiday/banner-728x90-v2.jpg"
                }
              ]
            }
          ],
          "error": false
        }
      ]
    }
    ```
  </Step>

  <Step title="Render Banner with DAM Asset">
    <div style={{textAlign: 'justify', marginBottom: '1.5rem'}}>
      Use the returned URL to display the banner and track performance:
    </div>

    ```javascript theme={null}
    // Extract the DAM URL from auction response
    const winner = auctionResult.results[0].winners[0];
    const damImageUrl = winner.asset[0].url;
    const resolvedBidId = winner.resolvedBidId;

    // Render banner in your UI
    const bannerElement = document.createElement("img");
    bannerElement.src = damImageUrl;
    bannerElement.addEventListener("click", () => {
      // Track click event for billing and attribution
      fetch("/api/topsort/events", {
        method: "POST",
        body: JSON.stringify({
          type: "click",
          resolvedBidId: resolvedBidId,
        }),
      });
    });
    ```
  </Step>
</Steps>

### Key Benefits of DAM Integration

<div style={{ textAlign: "justify", marginBottom: "1.5rem" }}>
  * **Brand Consistency**: Only approved, compliant assets reach ad campaigns -
    **Workflow Efficiency**: Creative teams work in familiar DAM tools, assets
    sync automatically - **Version Control**: When creatives update in DAM,
    campaign assets update automatically - **Rights Management**: Track usage
    licensing and prevent expired assets from being used - **Global Asset
    Distribution**: One asset repository serves multiple marketing channels
</div>

## Implementation Guide

<div style={{ textAlign: "justify", marginBottom: "1.5rem" }}>
  **Role:** DevOps/Integration Team | **Frequency:** One-time setup
</div>

<Steps>
  <Step title="DAM System Preparation">
    <div style={{textAlign: 'justify', marginBottom: '1.5rem'}}>
      Set up your DAM system for optimal connectivity with Topsort:
    </div>

    <ul>
      <li><strong>Asset Organization</strong>: Structure assets with campaign-specific folders and metadata</li>
      <li><strong>CDN Configuration</strong>: Ensure DAM generates publicly accessible, optimized URLs</li>
      <li><strong>Approval Workflows</strong>: Set up processes to mark assets as campaign-ready</li>
      <li><strong>Metadata Standards</strong>: Define consistent tagging for dimensions, versions, expiry dates</li>
    </ul>
  </Step>

  <Step title="Topsort Assets API Setup">
    <div style={{textAlign: 'justify', marginBottom: '1.5rem'}}>
      Configure the connectivity between your DAM and Topsort:
    </div>

    <ul>
      <li><strong>Authentication</strong>: Configure Topsort API credentials</li>
      <li><strong>URL Validation</strong>: Ensure DAM URLs are accessible to Topsort systems</li>
      <li><strong>Automated Sync</strong>: Set up webhooks or scheduled jobs to sync approved assets</li>
      <li><strong>Error Handling</strong>: Implement retry logic for failed asset references</li>
    </ul>
  </Step>

  <Step title="Workflow Automation">
    <div style={{textAlign: 'justify', marginBottom: '1.5rem'}}>
      Implement automated asset synchronization:
    </div>

    ```javascript theme={null}
    // Example automated asset sync from DAM to Topsort
    const syncApprovedAssets = async () => {
      const approvedAssets = await dam.getAssetsByStatus("approved");

      for (const asset of approvedAssets) {
        if (!asset.syncedToTopsort) {
          await topsortAssetsAPI.create({
            name: asset.name,
            url: asset.cdnUrl,
            dimensions: asset.dimensions,
            metadata: asset.metadata,
          });
          await dam.markAsSynced(asset.id);
        }
      }
    };
    ```
  </Step>
</Steps>

## API Reference

### Topsort APIs for DAM Integration

| API                                                        | Integration Use Case             | Status      | Documentation                      |
| ---------------------------------------------------------- | -------------------------------- | ----------- | ---------------------------------- |
| [Assets API](/en/ad-server/additional-apis/assets-api)     | Reference DAM URLs in campaigns  | ✅ Available | Asset management and collections   |
| [Campaign API](/en/ad-server/additional-apis/campaign-api) | Create campaigns with DAM assets | ✅ Available | Full campaign lifecycle management |

### Authentication

```http theme={null}
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
```

## Best Practices

### Asset Management

<div style={{ textAlign: "justify", marginBottom: "1.5rem" }}>
  * **Optimize URLs**: Ensure DAM generates fast-loading, CDN-optimized URLs -
    **Version Control**: Implement clear versioning to prevent outdated assets in
    campaigns - **Metadata Standards**: Use consistent tagging for dimensions,
    campaign types, approval status - **Access Control**: Ensure asset URLs are
    publicly accessible to Topsort systems
</div>

### Workflow Automation

<div style={{ textAlign: "justify", marginBottom: "1.5rem" }}>
  * **Approval Gates**: Only sync approved, brand-compliant assets to Topsort -
    **Automated Cleanup**: Remove expired or outdated assets from active campaigns
  * **Error Monitoring**: Track failed asset references and sync issues
</div>

## Troubleshooting

### Common DAM Integration Issues

<div style={{ textAlign: "justify", marginBottom: "1.5rem" }}>
  1. **Asset URL Problems**
</div>

<div style={{ textAlign: "justify", marginBottom: "1.5rem" }}>
  * Verify DAM URLs are publicly accessible (not behind authentication) - Check
    that URLs return proper HTTP status codes (200) - Ensure CDN URLs are
    optimized for fast loading - Validate asset dimensions match Topsort
    requirements
</div>

<div style={{ textAlign: "justify", marginBottom: "1.5rem" }}>
  2. **Sync Failures**
</div>

<div style={{ textAlign: "justify", marginBottom: "1.5rem" }}>
  * Check API authentication and permissions - Verify asset metadata format
    compatibility - Monitor webhook delivery success rates - Implement proper
    error logging for failed syncs
</div>

<div style={{ textAlign: "justify", marginBottom: "1.5rem" }}>
  3. **Version Control Issues** - Ensure updated assets trigger campaign asset
     updates - Verify expired assets are removed from active campaigns - Check that
     only approved asset versions sync to Topsort
</div>

### General API Issues

<div style={{ textAlign: "justify", marginBottom: "1.5rem" }}>
  1. **Authentication Failures**
</div>

<div style={{ textAlign: "justify", marginBottom: "1.5rem" }}>
  * Verify API key validity and scope permissions - Check authentication header
    format - Monitor for token expiration
</div>

<div style={{ textAlign: "justify", marginBottom: "1.5rem" }}>
  2. **Rate Limiting** - Implement proper rate limiting in connectivity code -
     Use bulk operations when available - Add retry logic with exponential backoff
</div>

## Getting Started

### Implementation Steps

1. **Assessment**: Review your current DAM system's URL generation and API capabilities
2. **API Credentials**: Obtain Topsort API keys and configure authentication
3. **Proof of Concept**: Start with a small set of assets to test the connectivity workflow
4. **Automation**: Implement automated sync processes for approved assets
5. **Monitoring**: Set up tracking for asset sync success and campaign performance

## Related Resources

<div style={{ textAlign: "justify", marginBottom: "1.5rem" }}>
  * [OMS Integration Guide](/en/knowledge-base/ad-server/oms-connectivity) -
    Order Management System connectivity - [Assets API
    Documentation](/en/ad-server/additional-apis/assets-api) - [Campaign API
    Documentation](/en/ad-server/additional-apis/campaign-api)
</div>

<div style={{ textAlign: "justify", marginBottom: "1.5rem" }}>
  *This documentation reflects current Topsort API capabilities. DAM
  connectivity is available now using existing APIs. For custom connectivity
  development, please contact your Topsort representative.*
</div>

***

<LastUpdated date="2025-11-18" />
