Adobe Experience Manager Assets ships in three different deployment forms. The HTTP API surface is the same across all three, but the authentication flow is different for each — and that's the only thing you really configure here.
| Flavor | Hosted by | Authentication |
|---|---|---|
| On-Premise | You / your data center | HTTP Basic (username + password) |
| AMS (Adobe Managed Services) | Adobe (long-lived deployments) | HTTP Basic (same as On-Prem) |
| AEMaaCS (AEM as a Cloud Service) | Adobe (modern cloud-native) | IMS / JWT exchange via Service Credentials JSON |
When you add the AEM connector in Univaultport, the wizard asks you which deployment you're connecting to. Pick the matching section below for setup.
Track A — On-Premise AEM (6.x)
Step 1 — Identify the author URL
This is your AEM author tier URL — the same one your content team uses to log into AEM. Strip any trailing path:
✓ https://author.mysite.com
✓ https://author.mysite.com:4502
✗ https://author.mysite.com/aem/start.html (strip the path)Step 2 — Create or pick a service user
Personal accounts work but break the moment the human owner rotates passwords or leaves. The recommended pattern is a service user:
Log into AEM as administrator
Open/useradminin the author instance.Create a user
Click Create User. Use a descriptive ID likeasset-migrator-svc.Set a strong password
This is what Univaultport will use for Basic auth. Store it somewhere safe — you can rotate it later via the wizard's edit drawer.Grant permissions
Under Members, add the user to the dam-users group. For migrations that need to delete or modify metadata, add it to content-authors too.Test the permission
Open/content/damand confirm the new user can see it (/damwill 403 if permissions are wrong).
Step 3 — Paste credentials into Univaultport
In the connector wizard:
Deployment
On-Premise (self-hosted AEM 6.x)AEM Base URL
https://author.mysite.comUsername
asset-migrator-svc(from Step 2)Password
The service user's passwordDAM Root Path (optional)
/content/dam/marketingto scope; blank for the whole DAM
Click Save & test. Univaultport will fetch /api/assets/.json to validate.
Track B — AMS (Adobe Managed Services)
From the connector's point of view, AMS is almost identical to On-Prem — same HTTP API, same Basic auth header. Adobe just handles the infrastructure.
Step 1 — Find the author URL
AMS author URLs follow this pattern:
https://author-pXXXXX-eYYYYY.adobeaemcloud.com
↑ program ID ↑ environment IDYou can find the exact URL in Adobe Cloud Manager → your AMS program → environment → Author tile.
Step 2 — Create a service user
AMS doesn't restrict you from creating local AEM users — the user-admin works the same as on-prem.
- Log in to your AMS author instance with an admin account.
- Open
/useradminand create a service user (same pattern as On-Prem). - Grant the same
dam-users(orcontent-authors) membership.
Step 3 — Paste credentials into Univaultport
Deployment
AMS — Adobe Managed ServicesAEM Base URL
The fullhttps://author-pXX-eYY.adobeaemcloud.comURLUsername
The service user IDPassword
The service user passwordDAM Root Path (optional)
As On-Prem
Track C — AEM as a Cloud Service (AEMaaCS)
AEMaaCS is significantly more involved. It uses Adobe IMS (Identity Management Service) for auth. There are no usernames + passwords — instead, you create a Service Account in the Adobe IO Developer Console, download a Service Credentials JSON, and Univaultport uses that to mint short-lived bearer tokens.
Step 1 — Find your IMS Org ID + environment URL
In Adobe Admin Console (https://adminconsole.adobe.com):
- The IMS Org ID is shown under your Profile → Account Info — looks like
XXXXXXXXXXXXXXXXXXXXXXXX@AdobeOrg.
For the AEMaaCS author URL, open Cloud Manager for your program, pick the production environment, and copy the author tier URL. It looks like:
https://author-pXXXXX-eYYYYY.adobeaemcloud.comStep 2 — Create a project in Adobe IO Developer Console
Go to developer.adobe.com/console and sign in with the same Adobe account.
Create new project
Click Create new project. Name it something likeasset-migrator-aem.Add an API
Click Add API → AEM Assets Author (or AEM Assets, depending on your subscription).Choose authentication
Pick Service Account (JWT). This is the legacy but still-supported flow.Generate key pair
The console can generate the RSA keypair for you. Click Generate a key pair — your browser will download a ZIP withprivate.keyandcertificate_pub.crt. Save the private key safely — Adobe doesn't keep a copy.Select product profile
Choose the AEM environment's product profile. For most setups, AEM Administrators is the right one.Save configured API
Click Save configured API.
Step 3 — Download the Service Credentials JSON
Inside your IO project, click Service Account (JWT) in the left sidebar. Look for the Generate Service Credentials button on the right side of the page. Click it.
Adobe downloads a JSON file with this rough shape:
{
"integration": {
"imsOrgId": "...@AdobeOrg",
"technicalAccount": {
"id": "...",
"email": "..."
},
"metascopes": ["ent_aem_cloud_api"],
"imsEndpoint": "ims-na1.adobelogin.com"
},
"clientCredentials": {
"client_id": "...",
"client_secret": "..."
},
"privateKey": "-----BEGIN RSA PRIVATE KEY-----\n..."
}Step 4 — Assign the technical account in AEMaaCS
The Service Account's "technical account" needs explicit AEM permissions. Just creating the API isn't enough.
Open Adobe Admin Console
Find the technical account
Users → Browse Users. Search for the technical-account email from your Service Credentials JSON (looks likexxxxxxxx-aem-tech@techacct.adobe.com).Assign product profile
Click into the user → Products and user groups → Adobe Experience Manager as a Cloud Service → assign the AEM Administrators profile for your target environment. Or the AEM Users profile if you want least-privilege.
Step 5 — Paste into Univaultport
Deployment
AEM as a Cloud Service (AEMaaCS)AEM Base URL
The author URL from Step 1 (https://author-pXX-eYY.adobeaemcloud.com)Service Credentials JSON
Paste the entire JSON file contents from Step 3DAM Root Path (optional)
/content/dam/your-folderto scope
Click Save & test. Univaultport will:
- Parse the Service Credentials JSON
- Sign a JWT and exchange it at
https://ims-na1.adobelogin.com/ims/exchange/jwt/ - Use the returned bearer token to GET your DAM root
A green check means all three steps passed.
How uploads work (all three tracks)
Univaultport uses Adobe's Direct Binary Upload protocol for every flavor — it's the only path that AEMaaCS supports, and AEM 6.5+ on-prem supports it too. The protocol is:
POST /content/dam/parent.initiateUpload.json→ AEM returns one-or-more pre-signed S3 URLs- PUT each chunk directly to S3 (bypasses AEM's JVM)
POST /content/dam/parent.completeUpload.json→ AEM processes the asset
The upload is handled by Adobe's official @adobe/aem-upload library inside Univaultport, so retries, multipart, and progress callbacks are all built in.
Practical impact: there's no hard upload-size cap from AEM itself. Big videos (1+ GB) work as long as your network can sustain them.
Permissions cheatsheet
For each flavor, the principal needs the following on the DAM root path:
| Operation | Required permission |
|---|---|
| Read / list / download | read (jcr:read) |
| Upload | write (jcr:write) + addChild on the target folder |
| Delete | write + modify on the parent + removeNode on the asset |
For most setups, adding the user to dam-users + content-authors (on-prem/AMS) or assigning the AEM Administrators product profile (AEMaaCS) gives you all three.
Troubleshooting
| Error | Track | Fix |
|---|---|---|
Authentication failed (401) | On-Prem/AMS | Verify username + password by trying the AEM author web UI |
Authentication failed (401) with bearer token | AEMaaCS | Service Credentials JSON expired or the technical account lacks the AEM API metascope — re-generate from the IO Console |
Forbidden (403) | All | The principal can authenticate but lacks DAM access. On-Prem: add to dam-users. AAACS: assign AEM Administrators product profile in Admin Console |
Path not found (404) | All | damRootPath doesn't exist or isn't under /content/dam. Verify in AEM's /assets.html/content/dam UI |
IMS exchange invalid_token | AEMaaCS | The private key in your Service Credentials JSON doesn't match the public key registered with the API. Re-generate the keypair from the IO Console |
IP rejected | AMS | Your AMS Dispatcher has IP allowlist enabled. Add your worker's outbound IP via Cloud Manager → Network Infrastructure → IP Allowlist |
Next steps
With AEM connected, common migration patterns:
- AEM → S3 / GCS / Cloudinary: archive a legacy on-prem DAM to cheaper storage, or move to a delivery-optimized CDN
- AEM → AEM: cross-environment migrations (e.g. staging → prod, or AMS → AEMaaCS upgrade path)
- Cloudinary / Drive → AEM: bring an existing asset library into AEM for editorial workflows
Folder hierarchy is preserved on both source and destination since AEM has real folder nodes (sling:OrderedFolder JCR nodes) under /content/dam.



