Using cURL with AEM using-curl-with-aem

Administrators often need to automate or simplify common tasks within any system. In AEM for example, managing users, installing packages, and managing OSGi bundles are tasks that must be commonly done.

Because of the RESTful nature of the Sling framework upon which AEM is built, most tasks can be done with a URL call. cURL can be used to execute such URL calls and can be a useful tool for AEM administrators.

What is cURL what-is-curl

cURL is an open-source command-line tool used to perform URL manipulations. It supports a wide range of internet protocols including HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, LDAP, DAP, DICT, TELNET, FILE, IMAP, POP3, SMTP, and RTSP.

cURL is a well-established and widely-used tool for getting or sending data using the URL syntax and was originally released in 1997. The name cURL originally meant “see URL.”

Because of the RESTful nature of the Sling framework upon which AEM is built, most tasks can be reduced to a URL call, which can be executed with cURL. Content manipulation tasks such as activating pages, and starting workflows and operational tasks such as package management and managing users can be automated using cURL. In addition you can create your own cURL commands for most tasks in AEM.

Any AEM command executed through cURL has to be authorized just as any user to AEM. All ACLs and access rights are respected when using cURL to execute an AEM command.

Downloading cURL downloading-curl

cURL is a standard part of macOS and some Linux distros. However it is avaialble for most every operating system. The latest downloads can be found at

cURL’s source repository can be found on GitHub as well.

Building a cURL-Ready AEM Command building-a-curl-ready-aem-command

cURL commands can be built for most operations in AEM such as triggering workflows, checking OSGi configurations, triggering JMX commands, creating replication agents, and much more.

To find the exact command you need for your particular operation, you need to use the developer tools in your browser to capture the POST call to the server when you execute the AEM command.

The following steps describe how to do this using the creation of a new page within the Chrome browser as an example.

  1. Prepare the action you wish to invoke within AEM. In this case, we have proceded to the end of the Create Page wizard, but have not yet clicked Create.


  2. Start the developer tools and select the Network tab. Click the Preserve log option before clearing the console.


  3. Click Create in the Create Page wizard to actually create the workflow.

  4. Right-click the resulting POST action and select Copy > Copy as cURL.


  5. Copy the cURL command to a text editor and remove all headers from the command, which start with -H (highligted in blue in the image below) and add the proper authentication parameter such as -u <user>:<password>.


  6. Execute the cURL command via the command line and view the response.


Common Operational AEM cURL Commands common-operational-aem-curl-commands

Here is a list of AEM cURL commands for common administrative and operational tasks.

The following examples assume that AEM is running on localhost on port 4502 and uses the user admin with password admin. Additional command placeholders are set in angle brackets.

Package Management package-management

List All Installed Packages

curl -u <user>:<password> http://<host>:<port>/crx/packmgr/service.jsp?cmd=ls

Create a Package create-a-package

curl -u <user>:<password> -X POST http://localhost:4502/crx/packmgr/service/.json/etc/packages/ -d packageName=<name> -d groupName=<name>

Preview a Package preview-a-package

curl -u <user>:<password> -X POST http://localhost:4502/crx/packmgr/service/.json/etc/packages/

List Package Content list-package-content

curl -u <user>:<password> -X POST http://localhost:4502/crx/packmgr/service/console.html/etc/packages/

Build a Package build-a-package

curl -X POST http://localhost:4502/crx/packmgr/service/.json/etc/packages/

Rewrap a Package rewrap-a-package

curl -u <user>:<password> -X POST http://localhost:4502/crx/packmgr/service/.json/etc/packages/

Rename a Package rename-a-package

curl -u <user>:<password> -X POST -Fname=<New Name> http://localhost:4502/etc/packages/<Group Name>/<Package Name>.zip/jcr:content/vlt:definition

Upload a Package upload-a-package

curl -u <user>:<password> -F cmd=upload -F force=true -F http://localhost:4502/crx/packmgr/service/.json

Install a Package install-a-package

curl -u <user>:<password> -F cmd=install http://localhost:4502/crx/packmgr/service/.json/etc/packages/my_packages/

Uninstall a Package uninstall-a-package

curl -u <user>:<password> -F cmd=uninstall http://localhost:4502/crx/packmgr/service/.json/etc/packages/my_packages/

Delete a Package delete-a-package

curl -u <user>:<password> -F cmd=delete http://localhost:4502/crx/packmgr/service/.json/etc/packages/my_packages/

Download a Package download-a-package

curl -u <user>:<password> http://localhost:4502/etc/packages/my_packages/

Replicate a Package replicate-a-package

curl -u <user>:<password> -X POST http://localhost:4502/crx/packmgr/service/.json/etc/packages/my_packages/

User Management user-management

Create a New User create-a-new-user

curl -u <user>:<password> -FcreateUser= -FauthorizableId=hashim -Frep:password=hashim http://localhost:4502/libs/granite/security/post/authorizables

Create a New Group create-a-new-group

curl -u <user>:<password> -FcreateGroup=group1 -FauthorizableId=testGroup1 http://localhost:4502/libs/granite/security/post/authorizables

Add a Property to an Existing User add-a-property-to-an-existing-user

curl -u <user>:<password> -Fprofile/age=25 http://localhost:4502/home/users/h/

Create a User with a Profile create-a-user-with-a-profile

curl -u <user>:<password> -FcreateUser=testuser -FauthorizableId=hashimkhan -Frep:password=hashimkhan -Fprofile/gender=male http://localhost:4502/libs/granite/security/post/authorizables

Create a New User as a Member of a Group create-a-new-user-as-a-member-of-a-group

curl -u <user>:<password> -FcreateUser=testuser -FauthorizableId=testuser -Frep:password=abc123 -Fmembership=contributor http://localhost:4502/libs/granite/security/post/authorizables

Add a User to a Group add-a-user-to-a-group

curl -u <user>:<password> -FaddMembers=testuser1 http://localhost:4502/home/groups/t/

Remove a User from a Group remove-a-user-from-a-group

curl -u <user>:<password> -FremoveMembers=testuser1 http://localhost:4502/home/groups/t/

Set a User’s Group Membership set-a-user-s-group-membership

curl -u <user>:<password> -Fmembership=contributor -Fmembership=testgroup http://localhost:4502/home/users/t/

Delete a User delete-a-user

curl -u <user>:<password> -FdeleteAuthorizable= http://localhost:4502/home/users/t/testuser

Delete a Group delete-a-group

curl -u <user>:<password> -FdeleteAuthorizable= http://localhost:4502/home/groups/t/testGroup

Backup backup

See Backup and Restore for details.

OSGi osgi

Starting a Bundle starting-a-bundle

curl -u <user>:<password> -Faction=start http://localhost:4502/system/console/bundles/<bundle-name>

Stopping a Bundle stopping-a-bundle

curl -u <user>:<password> -Faction=stop http://localhost:4502/system/console/bundles/<bundle-name>

Dispatcher dispatcher

Invalidate the Cache invalidate-the-cache

curl -H "CQ-Action: Activate" -H "CQ-Handle: /content/test-site/" -H "CQ-Path: /content/test-site/" -H "Content-Length: 0" -H "Content-Type: application/octet-stream" http://localhost:4502/dispatcher/invalidate.cache

Evict the Cache evict-the-cache

curl -H "CQ-Action: Deactivate" -H "CQ-Handle: /content/test-site/" -H "CQ-Path: /content/test-site/" -H "Content-Length: 0" -H "Content-Type: application/octet-stream" http://localhost:4502/dispatcher/invalidate.cache

Replication Agent replication-agent

Check the Status of an Agent check-the-status-of-an-agent

curl -u <user>:<password> "http://localhost:4502/etc/replication/"

Delete an Agent delete-an-agent

curl -X DELETE http://localhost:4502/etc/replication/ -u <user>:<password>

Create an Agent create-an-agent

curl -u <user>:<password> -F "jcr:primaryType=cq:Page" -F "jcr:content/jcr:title=new-replication" -F "jcr:content/sling:resourceType=/libs/cq/replication/components/agent" -F "jcr:content/template=/libs/cq/replication/templates/agent" -F "jcr:content/transportUri=http://localhost:4503/bin/receive?sling:authRequestLogin=1" -F "jcr:content/transportUser=admin" -F "jcr:content/transportPassword={DES}8aadb625ced91ac483390ebc10640cdf"http://localhost:4502/etc/replication/

Pause an Agent pause-an-agent

curl -u <user>:<password> -F "cmd=pause" -F "name=publish"  http://localhost:4502/etc/replication/

Clear an Agent Queue clear-an-agent-queue

curl -u <user>:<password> -F "cmd=clear" -F "name=publish"  http://localhost:4502/etc/replication/

Communities communities

Assign and Revoke Badges assign-and-revoke-badges

See Communities Scoring and Badges for details.

See Scoring and Badges Essentials for details.

MSRP Reindexing msrp-reindexing

See MSRP - MongoDB Storage Resource Provider for details.

Security security

Enabling and Disabling CRX DE Lite enabling-and-disabling-crx-de-lite

See Enabling CRXDE Lite in AEM for details.

Data Store Garbage Collection data-store-garbage-collection

See Data Store Garbage Collection for details.

Analytics and Target Integration analytics-and-target-integration

See Opting Into Adobe Analytics and Adobe Target for details.

Single Sign On single-sign-on

Send Test Header send-test-header

See Single Sign On for details.

Common Content Manipulation AEM cURL Commands common-content-manipulation-aem-curl-commands

Here is a list of AEM cURL commands for content manipulation.

The following examples assume that AEM is running on localhost on port 4502 and uses the user admin with password admin. Additional command placeholders are set in angle brackets.

Page Management page-management

Page Activation page-activation

curl -u <user>:<password> -X POST -F path="/content/path/to/page" -F cmd="activate" http://localhost:4502/bin/replicate.json

Page Deactivation page-deactivation

curl -u <user>:<password> -X POST -F path="/content/path/to/page" -F cmd="deactivate" http://localhost:4502/bin/replicate.json

Tree Activation tree-activation

curl -u <user>:<password> -F cmd=activate -F ignoredeactivated=true -F onlymodified=true -F path=/content/geometrixx http://localhost:4502/etc/replication/treeactivation.html

Lock Page lock-page

curl -u <user>:<password> -X POST -F cmd="lockPage" -F path="/content/path/to/page" -F "_charset_"="utf-8" http://localhost:4502/bin/wcmcommand

Unlock Page unlock-page

curl -u <user>:<password> -X POST -F cmd="unlockPage" -F path="/content/path/to/page" -F "_charset_"="utf-8" http://localhost:4502/bin/wcmcommand

Copy Page copy-page

curl -u <user>:<password> -F cmd=copyPage -F destParentPath=/path/to/destination/parent -F srcPath=/path/to/source/location http://localhost:4502/bin/wcmcommand

Workflows workflows

See Interacting with Workflows Programmatically for details.

Sling Content sling-content

Create a Folder create-a-folder

curl -u <user>:<password> -F jcr:primaryType=sling:Folder http://localhost:4502/etc/test

Delete a Node delete-a-node

curl -u <user>:<password> -F :operation=delete http://localhost:4502/etc/test/

Move a Node move-a-node

curl -u <user>:<password> -F":operation=move" -F":applyTo=/sourceurl"  -F":dest=/target/parenturl/" https://localhost:4502/content

Copy a Node copy-a-node

curl -u <user>:<password> -F":operation=copy" -F":applyTo=/sourceurl"  -F":dest=/target/parenturl/" https://localhost:4502/content

Upload Files Using Sling PostServlet upload-files-using-sling-postservlet

curl -u <user>:<password> -F"*"  http://localhost:4502/etc/test

Upload Files Using Sling PostServlet and Specifying Node Name upload-files-using-sling-postservlet-and-specifying-node-name

curl -u <user>:<password> -F""  http://localhost:4502/etc/test

Upload Files Specifying a Content Type upload-files-specifying-a-content-type

curl -u <user>:<password> -F "*;type=text/plain" http://localhost:4502/etc/test

Asset Manipulation asset-manipulation

See Assets HTTP API for details.