
Delete an asset from the DAM. Use listfolders or searchassets to find asset IDs. Referenced assets are refused unless force is true. Long deletes run in the background: poll the returned job.jobid with getassetjobstatus.
Search DAM assets by text (full-text, hybrid, or natural language) and structured term, range, and exists filters, with sorting, field projection, and facets. Use this to find assets by content or metadata; use list_folders to browse by location.
Get the state of a background asset job (QUEUED, PROCESSING, COMPLETED, COMPLETEDWITHERRORS, FAILED). Use the job.jobid returned by deleteasset. For URL imports use getimportjob_status instead.
Get an asset's metadata: editable assetMetadata (dc:title, keywords, ...) and read-only repositoryMetadata (name, path, format, size), plus the etag updateassetmetadata needs. Use listfolders or searchassets to find asset IDs.
Edit an asset's assetMetadata with JSON Patch operations (add, replace, remove, copy, move, test). Call getassetmetadata first to see property names and get the etag; repositoryMetadata is read-only. Returns the updated metadata.
List an asset's relations to other assets, optionally filtered to some relation types. Use listassetrelationtypes to see which types exist. Use listfolders or search_assets to find asset IDs.
Relate an asset to other assets, each with a relation type such as 'sources' or 'derived'. Use searchassets or listfolders to find both asset IDs, and listassetrelation_types to reuse existing types.
List an asset's relations of one relation type. Use listassetrelationtypes to find the types, and listasset_relations to list several types at once.
Remove all of an asset's relations of one relation type. Use listassetrelationtypes to find the types. To remove a single relation use deleteasset_relation.
Remove one relation between two assets. Use listassetrelations to find the relationtype and relatedassetid. To clear a whole type use deleteassetrelationsby_type.
List the relation type names an asset has (e.g. sources, derived). Use the values with listassetrelations, listassetrelationsbytype, or deleteassetrelationsbytype. Use listfolders or searchassets to find asset IDs.
List an asset's static renditions with name, MIME type, size, and pixel dimensions. Use listfolders or searchassets to find asset IDs.
Import 1-300 files from URLs into a DAM folder as new assets, with optional metadata. Use listfolders to find the target folder ID or path. Runs in the background: poll jobid with getimportjobstatus, then getimportjobresult for the new asset IDs.
Get the state and progress counters of a URL import job. Use the jobid returned by importassetfromurl. Once state is COMPLETED or FAILED, call getimportjob_result for per-file outcomes.
List per-file outcomes of a URL import job, including the new asset ID of each imported file and the error for each failed one. Use the jobid from importassetfromurl; check getimportjob_status first.
List Dynamic Media asset collections (curated groups of assets and collections) with their titles. Paginate with cursor. Returns collection IDs for getcollection, listcollection_items and the collection write tools.
Create an asset collection with a title and initial assets/collections. Use searchassets for asset IDs. May run asynchronously: if 'job' is returned, poll getcollectionjobstatus. Returns the new collection ID when created immediately.
Get an asset collection's title, description, repository metadata and ETag. Use listcollectionitems for its contents. Use list_collections to find collection IDs.
Update an asset collection's title, description or custom metadata. Pass etag from getcollection, or null to fetch it. Use updatecollectionitems to change its contents. Use listcollections to find collection IDs.
Delete an asset collection; the assets in it are not deleted. Pass etag from getcollection, or null to fetch it. May run asynchronously: if 'job' is returned, poll getcollectionjobstatus. Use list_collections to find collection IDs.
List the assets and sub-collections in an asset collection, plus the ETag that updatecollectionitems needs. Paginate with cursor. Use list_collections to find collection IDs.
Add or remove assets/collections in an asset collection. Pass etag from listcollectionitems, or null to fetch it. Use searchassets for asset IDs. May run asynchronously: if 'job' is returned, poll getcollectionjobstatus.
Get the state (PROCESSING, COMPLETED, FAILED) of an asynchronous collection job started by createcollection, deletecollection or updatecollectionitems. Use the job_id from their 'job' output.
List the Dynamic Media smart crops (named crop regions with aspect ratios) defined for an image or video asset. Paginate with cursor. Use search_assets to find asset IDs.
List the Dynamic Media image presets (named output size/format settings) configured for image delivery. Paginate with cursor.
Request a zip archive of one or more assets and chosen renditions for download. Runs asynchronously: poll getarchivestatus with the returned id for the download URLs. Use search_assets to find asset IDs.
Get the state of an asset archive started by createassetarchive. When COMPLETED, downloadurls lists the archive file URLs; warnings name assets that could not be included. Use the id returned by createasset_archive.
List every Content AI content source (AEM author/publish, acquisition crawls, custom indexes) with its searchable spaces and fields. Filter by type. Use the names with searchcontentsources and generatesearchanswer; use listacquisitionsources for full crawl configs.
Create a Content AI acquisition content source that crawls a website into a searchable index. Returns its slug 'name'. Crawls start on the schedule, or call triggeracquisitionrun. Use listacquisitionsources to check an existing name first.
List Content AI acquisition (website crawl) content sources with their full crawl configuration. Filter by status (ACTIVE or ARCHIVED). Use listcontentsources to see all source types.
Get one Content AI acquisition content source by name: crawl config, status, searchable spaces, and its ETag for update/patch. Use listacquisitionsources to find names. Only acquisition sources can be fetched individually.
Fully replace an acquisition source's description and crawl config; omitted optional parts are cleared. Prefer patchacquisitionsource to change a few fields or archive. Use listacquisitionsources for names, getacquisitionsource for the ETag.
Change selected fields of an acquisition source (merge patch). Set status ARCHIVED to delete it: crawls stop and content is removed after a grace period. Use listacquisitionsources for names and getacquisitionsource for the ETag.
Start an on-demand crawl of an acquisition content source now. Fails with a conflict if a run is already in progress. Poll getlatestacquisitionrun for progress. Use listacquisition_sources to find names.
Get the state and metrics of the most recent crawl run of an acquisition content source. Use after triggeracquisitionrun; AEM answers not-found until the run starts (about 10 seconds), so retry before concluding the source is missing. Use listacquisitionsources to find names.
Search documents in one Content AI content source with fulltext, semantic (vector), filter, or hybrid queries, plus sorting and aggregates. Use generatesearchanswer for an AI-written answer instead. Use listcontentsources for source names, types, and searchable fields.
Ask a natural-language question and get an AI-generated answer grounded in one Content AI content source, with the source documents it used. Use searchcontentsources to retrieve raw matching documents instead. Use listcontentsources to find source names.
List Content Fragments as delivered by the publish (default), preview or author tier, optionally under a folder path. Use this for live/published content; use listfragments for authoring. Paginate with cursor. Returns fragment IDs for getpublished_fragment.
Get a delivered Content Fragment by ID from the publish (default), preview or author tier, optionally embedding its references. Use listpublishedfragments to find fragment IDs, or getpublishedfragmentbypath when you know the path.
Get a delivered Content Fragment by its exact repository path (e.g. /content/dam/site/en/article) from the publish (default), preview or author tier. Use getpublishedfragment when you have the ID. Returns the fragment ID.
List the resources (fragments, assets, pages, tags) a delivered Content Fragment references, direct or all levels. Use listpublishedfragmentreferencedby for the reverse. Use listpublishedfragments to find fragment IDs.
Get the Content Fragment Model a delivered fragment is based on, from the publish (default), preview or author tier. Use listpublishedfragments to find fragment IDs.
List the variations of a delivered Content Fragment with their field values. Paginate with cursor. Use listpublishedfragments to find fragment IDs; returns variation names for getpublishedfragment_variation.
Get one variation of a delivered Content Fragment, optionally embedding its references. Use listpublishedfragments for fragment IDs and listpublishedfragment_variations for variation names.
List the resources a delivered fragment variation references, direct or all levels. Use listpublishedfragments for fragment IDs and listpublishedfragment_variations for variation names.
List the pages and fragments that reference a delivered Content Fragment (where it is used). Paginate with cursor. Use listpublishedfragmentreferences for what it points to. Use listpublished_fragments to find fragment IDs.
List Content Fragment Models available on the publish (default), preview or author delivery tier. Paginate with cursor. Returns model IDs for getpublishedmodel, getmodeljsonschema and listpublishedmodelfragments.
Get a Content Fragment Model's title, path and tags from the publish (default), preview or author delivery tier. Use getmodeljsonschema for its field definitions. Use listpublished_models to find model IDs.
Get the JSON Schema (2020-12) describing a Content Fragment Model's fields: names, types and descriptions. Use it to interpret a published fragment's 'fields'. Use listpublishedmodels to find model IDs.
List the delivered Content Fragments based on one Content Fragment Model. Paginate with cursor. Use listpublishedmodels to find model IDs; returns fragment IDs for getpublishedfragment.
Browse the DAM by path: returns the folder itself plus its children. This is the main way to find folder and asset IDs; set types to ['FOLDER', 'ASSET'] to include assets. Start at /content/dam. Use get_folder when you already have a folder ID.
Get a folder by ID with its children (folders by default; add 'ASSET' to types for assets). Use list_folders to find folder IDs or to browse by path.
Create up to 10 DAM folders by full path; missing parent folders are created too. Returns the new folder IDs, and per-folder failures (an existing path is reported in failed, not as an error). Slow batches run in the background: poll job.jobid with getfolderjobstatus.
Delete up to 10 DAM folders by path. Use listfolders to find paths; use deletefolder when you have an ID. Non-empty folders need recursive=true. Per-folder failures are returned, not raised. Slow deletes run in the background: poll job.jobid with getfolderjobstatus.
Delete one DAM folder by ID. Use listfolders to find folder IDs; use deletefolders to delete by path. Non-empty folders need recursive=true. Slow deletes run in the background: poll job.jobid with getfolderjobstatus.
Get the state of a background folder job (PROCESSING, COMPLETED, COMPLETEDWITHERRORS, FAILED). Use the job.jobid returned by createfolders, deletefolders, or deletefolder; a not-found in the first seconds means the job is not visible yet, so retry. Deletes take about a minute. When done, call getfolderjob_result for per-folder outcomes.
Get the per-folder results of a finished background folder job (created, deleted, or failed folders). Use the job.jobid from createfolders, deletefolders, or deletefolder; check getfolderjob_status first.
List Core Components Adaptive Forms available to the user, with IDs and repository paths. Older Foundation-based forms are not listed and cannot be read or submitted through this API. Use the IDs with getformdefinition, getformdata, and submit_form.
Get an Adaptive Form's definition: its field model, data schema, and accepted submission types, optionally localized. Call before submitform to learn the expected data. Use listforms to find form IDs.
Get prefill or previously saved data for an Adaptive Form, optionally a specific submission by dataref (the submissionid from submitform). Use listforms to find form IDs.
Submit data to an Adaptive Form as JSON, running its server-side validation and submit action. Returns the submissionid. Call getformdefinition first for the data schema; use listforms to find form IDs.
Register a callback URL that AEM Forms calls when an Adaptive Form is submitted (Workfront Fusion). Returns the callback ID for getformcallback, updateformcallback, and deleteformcallback.
Get a registered AEM Forms callback by ID. Callback IDs come from createformcallback; there is no list endpoint.
Replace a registered AEM Forms callback (URL, status, trigger, target service). All required fields must be sent again; optional ones left null are cleared. Use getformcallback to read current values; IDs come from createformcallback.
Delete a registered AEM Forms callback so AEM stops calling its URL. Callback IDs come from createformcallback.
List the assets, fragments, pages and experience fragments a Content Fragment directly references. Use getfragmentreferencestree for the full nested tree, and listfragmentreferencedby for what references it. Use list_fragments to find IDs.
Get every reference of a Content Fragment, recursively, as a tree of pointers plus a map of hydrated references. Use listfragmentreferences for direct references only. Use listfragments or searchfragments to find fragment IDs.
List the pages, experience fragments and Content Fragments that reference one fragment, with pagination. Use listreferencedby to check many fragment paths at once. Use listfragments or searchfragments to find fragment IDs.
For several Content Fragment paths at once, list the pages, experience fragments and fragments that reference each. Use listfragmentreferencedby for one fragment ID with pagination. Use listfragments or search_fragments to find paths.
Get a Content Fragment's locale and its language copies (path, locale, status). Use listlanguagecopies for several paths at once. Use listfragments or searchfragments to find fragment IDs.
For several Content Fragment or folder paths at once, get each one's locale and language copies. Use listfragmenttranslations for a single fragment ID. Use listfragments or searchfragments to find paths.
List the languages a Content Fragment can get language copies in (its site's language roots). Use before startworkflow with create-translation-structure. Use listfragments or search_fragments to find fragment paths.
List Content Fragment workflows (publish, unpublish, move, rename, translation structure), newest first, optionally for one fragment ID, with pagination. Use getworkflow for one workflow instance. Use listfragments to find fragment IDs.
Start a Content Fragment workflow: publish-folder, unpublish-fragments, unpublish-models, move-fragments, rename-fragments or create-translation-structure. Track it with getworkflow. Use listfragments, listmodels or listlanguages for the IDs it needs.
Get a Content Fragment workflow's state (RUNNING, COMPLETED, ABORTED...), payload and any invalid fragments. Get the ID from publishfragments, startworkflow, deleteandunpublishfragment or listworkflows.
List the tags applied to a Content Fragment, plus the etag that replacefragmenttags and removefragmenttags take. For a variation's tags use listvariationtags. Use listfragments or searchfragments to find fragment IDs.
Add existing AEM tags to a Content Fragment, keeping the tags it already has. Use replacefragmenttags to set the exact tag list instead. Use listfragments or searchfragments to find fragment IDs.
Replace all tags on a Content Fragment with the given tag IDs. Use addfragmenttags to keep existing tags. The etag from listfragmenttags is fetched automatically when null. Use listfragments or searchfragments to find fragment IDs.
Remove every tag from a Content Fragment. To drop only some tags, use replacefragmenttags with the tags to keep. The etag from listfragmenttags is fetched automatically when null. Use listfragments or searchfragments to find fragment IDs.
List the tags applied to one variation of a Content Fragment, plus the etag that replacevariationtags and removevariationtags take. Use listfragmentvariations for variation names and listfragments or searchfragments for fragment IDs.
Add existing AEM tags to a Content Fragment variation, keeping the tags it already has. Use replacevariationtags to set the exact list. Use listfragmentvariations for variation names and listfragments or searchfragments for fragment IDs.
Replace all tags on a Content Fragment variation with the given tag IDs. The etag from listvariationtags is fetched automatically when null. Use listfragmentvariations for variation names and listfragments or searchfragments for fragment IDs.
Remove every tag from a Content Fragment variation. To drop only some, use replacevariationtags. The etag from listvariationtags is fetched automatically when null. Use listfragmentvariations for variation names and listfragments or searchfragments for fragment IDs.
List Content Fragments, optionally under a folder path, with pagination. Use searchfragments instead to filter by status, model, tags, text or dates. Each item carries its id and etag for getfragment and the write tools.
Search Content Fragments by path, status, model IDs, tags, locale, metadata, full text, and created/modified/published dates or users, with sorting and pagination. Use listmodels to find model IDs. Use listfragments to simply browse a folder.
Get a Content Fragment with its fields, variations, tags and references, plus its etag for updatefragment, patchfragment and deletefragment. Pass locale to read a language copy. Use listfragments or search_fragments to find fragment IDs.
Create a Content Fragment from a model in a folder and return it with its new id and etag. Use listmodels to find model IDs, getfragmentmodel or getmodel for the fields, and listfolders for parentpath.
Replace a Content Fragment's title, description and field values in full; anything not sent is cleared. Use patchfragment to change only some values. Get the fragment ID and etag from getfragment.
Edit parts of a Content Fragment with JSON Patch operations (e.g. replace /title) and return the updated fragment and etag. Use updatefragment to replace everything. Get the fragment ID and etag from getfragment.
Permanently delete a Content Fragment. Fails for PUBLISHED or MODIFIED fragments; use deleteandunpublishfragment for those. Use listfragments or search_fragments to find fragment IDs.
Delete a Content Fragment and unpublish it from the publish tier in a background workflow; track it with getworkflow. Use deletefragment for never-published fragments. Use listfragments or searchfragments to find fragment IDs.
Check out a Content Fragment (lock it for the current user) or check it in (release the lock). Fails with a conflict if another user holds it. Use listfragments or searchfragments to find fragment IDs.
Get the preview URL of each variation of a Content Fragment, as configured on its model. Use listfragments or searchfragments to find fragment IDs.
Publish up to 50 Content Fragments by ID or path, now or at a scheduled time, optionally with references in chosen statuses. Starts a workflow; track it with getworkflow. Use listfragments or search_fragments to find IDs.
Get the scheduled publish or unpublish operation pending for one Content Fragment. Use getfragmentspublicationstatus to check many at once. Use listfragments or search_fragments to find fragment IDs.
Get scheduled publication status for up to 50 Content Fragments in one call, instead of calling getfragmentpublicationstatus per fragment. Unknown IDs are left out. Use listfragments or search_fragments to find fragment IDs.
Copy a single Content Fragment into an existing folder and return the copy with its new id. Use copyfragmenttree to also copy the fragments it references. Use listfragments for fragment IDs and listfolders for folders.
Copy a Content Fragment together with the fragments it references, in the background. Returns a job; poll its jobid with getbatch. Use copyfragment for a single fragment. Use listfragments for fragment IDs and list_folders for folders.
Find and replace text in the text and long-text fields of up to 20 Content Fragments. Set dryrun to preview results without saving. Use searchfragments to find fragment paths.
Get the Content Fragment Model a fragment is based on, including its field definitions and etag. Use getmodel when you already have the model ID. Use listfragments or search_fragments to find fragment IDs.
Switch a Content Fragment to a different Content Fragment Model. Fields that do not fit the new model can leave it invalid; fix them with patchfragment. Use listmodels for model IDs and list_fragments for fragment IDs.
Get the editor UI schema and static field schema of the model behind a Content Fragment. Use getmodeluischema when you have the model ID. Use listfragments or search_fragments to find fragment IDs.
Get a Content Fragment's metadata properties, its metadata form ID, and the etag for updatefragmentmetadata. Use listfragments or searchfragments to find fragment IDs.
Update a Content Fragment's metadata properties with JSON Patch operations. Only properties in its metadata schema can change; call getfragmentmetadata first for names and etag. Use listfragments or searchfragments to find fragment IDs.
List the actions (READ, EDIT, DELETE, PUBLISH, CHECKOUT, ...) the current user may take on one Content Fragment. Use checkpermissions for many paths at once. Use listfragments or search_fragments to find fragment IDs.
List content fragment launches with pagination. Filter server-side by created, modified, published, promoted, or live-date time ranges and by creator/modifier, and sort by title, created, modified, promoted, or liveDate. Launch IDs feed get_launch and the other launch tools.
Create a launch (a working copy of content fragments for future changes). Runs as a background job: poll getlaunchjobstatus with the returned jobid, then getlaunchjobresult for the new launch ID. Use listfragments or search_fragments to find source fragment IDs.
Get a launch's details and its ETag (needed by updatelaunch, deletelaunch, updatelaunchsources, and rebaselaunch). Use listlaunches to find launch IDs.
Replace a launch's properties (title, description, depth, production readiness, live date, publish agent). Full replace: omitted description or livedate is erased, so read them with getlaunch first. Use updatelaunchsources to change its fragments. Use list_launches for IDs.
Delete a launch. Runs as a background job: poll getlaunchjobstatus with the returned jobid. Use list_launches to find launch IDs.
List the content fragment IDs that are sources of a launch, with pagination. Use getlaunchcontent for the launch's own copies instead. Use list_launches to find launch IDs.
Add or remove content fragment sources of a launch. Runs as a background job: poll getlaunchjobstatus with the returned jobid. Use listlaunchsources for current sources and listfragments or searchfragments for fragment IDs to add.
Rebase a launch onto production (or another launch), pulling in source changes. Background job: poll getlaunchjobstatus. Run getlaunchdiff first to spot conflicts. Use listlaunches for IDs.
Promote a launch's changes into production (or another launch), overwriting the target fragments. Background job: poll getlaunchjobstatus. Run getlaunchdiff first to review changes. Use listlaunches for launch IDs.
Start computing field-level differences between a launch and production (or another launch). Background job: poll getlaunchjobstatus, then read the differences with getlaunchjobresult. Use list_launches for launch IDs.
List the content fragment copies inside a launch, with their source IDs and last promote/rebase info. Page with cursor, or look up specific content IDs (not both). Use listlaunchsources for source IDs instead. Use list_launches for launch IDs.
List the background jobs of a launch (create, edit, promote, rebase, diff, delete) with status, progress, and timestamps, with pagination. Use listlaunches to find launch IDs; pass a jobid to getlaunchjobstatus or getlaunchjobresult.
Check whether a launch background job is still running. When completed is true, call getlaunchjobresult. The jobid comes from createlaunch, deletelaunch, updatelaunchsources, rebaselaunch, promotelaunch, getlaunchdiff, or listlaunchjobs.
Get the outcome of a finished launch job: final state, errors, the launch details (e.g. the new launch ID for create), and field differences for diff jobs. Check getlaunchjobstatus first. Job IDs come from the launch write tools or listlaunch_jobs.
List Content Fragment Models with pagination (cursor from pageinfo). Use searchmodels instead to filter by name, folder, status, tags, or dates. Model IDs feed get_model and fragment creation.
Search Content Fragment Models server-side by name, technical name, configuration folder, status, replication status, lock, allowed DAM folder, IDs, tags, or created/modified/published dates, with sorting and pagination. Use list_models to browse without filters.
Get a Content Fragment Model by ID, including its field definitions and its ETag for updatemodel or deletemodel. Use listmodels or searchmodels to find model IDs.
Create a Content Fragment Model with field definitions in a configuration folder. Set dryrun to validate the payload only. Returns the new model ID. Use updatemodel to change an existing model.
Edit a Content Fragment Model with JSON Patch operations (rename, add/remove/replace fields). Pass the etag from getmodel to reject the edit if the model changed since; with a null etag the latest version is edited. Use getmodel to read the current model and listmodels or searchmodels to find model IDs.
Permanently delete a Content Fragment Model. Fails with a conflict if fragments still use it. Use listmodels or searchmodels to find model IDs.
Copy a Content Fragment Model into another existing configuration folder, optionally renaming it. Returns the new model with its ID. Use listmodels or searchmodels to find model IDs.
Publish up to 50 Content Fragment Models, now or at a scheduled time, by starting an AEM workflow. Returns the workflow instance ID and a per-model outcome; track it with getworkflow. Use getmodelspublicationstatus to check scheduled publications. Model IDs come from listmodels or searchmodels.
Get the scheduled publish/unpublish status for up to 50 Content Fragment Models. Use after publishmodels with a scheduled time. Use listmodels or search_models to find model IDs.
Get the editor UI schema (tabs, groups, conditional fields) of a Content Fragment Model and its ETag for updatemodeluischema. Use getmodel for the field definitions instead. Use listmodels or searchmodels to find model IDs.
Replace the editor UI schema and constraints of a Content Fragment Model. Read the current one with getmodeluischema first. Use listmodels or search_models to find model IDs.
List the tags applied to a Content Fragment Model, with the ETag that replacemodeltags and removemodeltags need. Use listmodels or searchmodels to find model IDs.
Add existing tags to a Content Fragment Model, keeping its current tags. Use replacemodeltags to overwrite the set. Use listmodels or searchmodels to find model IDs.
Replace all tags on a Content Fragment Model with the given tags. Use addmodeltags to keep existing tags, listmodeltags to read them. Use listmodels or searchmodels to find model IDs.
Remove every tag from a Content Fragment Model. To drop only some tags, use replacemodeltags with the ones to keep. Use listmodels or searchmodels to find model IDs.
Get the metadata schema bound to a content fragment or DAM folder (resolved up the folder tree) and all its metadata properties with values. Use bindmetadataschema to change the binding. Use listfragments or searchfragments to find fragment paths.
Bind a metadata schema to a content fragment or DAM folder (children inherit it), or pass a null schemaid to unbind it. Use getmetadata_schema to see the current binding.
Get the base domain URL of each AEM tier (author, publish, preview) for this environment.
Check which actions (read, edit, delete, publish, create fragment/model, ...) the current user may perform on fragments, folders, or models, by path. Use before a write to avoid a 403.
Run a GraphQL query against the Content Fragment GraphQL endpoint, for reading fragments across models in one call with custom fields. Errors in the query come back in 'errors'. Use list_models to learn model and field names.
Run several Sites API write calls (POST/PUT/PATCH/DELETE) together in the background. Returns a jobid; poll it with getbatch for each sub-request's result. Sub-requests can overwrite or delete content.
List batch requests created with createbatch, filtered by state, with pagination (cursor from pageinfo). Use get_batch for one batch's sub-request results.
Get a batch request's status and each sub-request's status code and body. Use the jobid from createbatch or an ID from list_batches.
Create a translation project with one job per target language, optionally adding content and starting translation. Runs asynchronously: poll gettranslationasyncstatus with asyncjobid; its resultitems carry the new project ID. There is no list tool for projects, so keep that ID.
Get a translation project with its settings, status, and jobs (job IDs for the translation job tools). No list endpoint exists: the project ID comes from createtranslationproject via gettranslationasyncstatus resultitems.
Replace a translation project's properties, including adding or dropping target languages and changing the TIF config. Full update: read current values with gettranslationproject first. Project IDs come from createtranslationproject.
Delete a translation project and its jobs. Project IDs come from createtranslationproject.
Add content to (or remove it from) the DRAFT jobs of every target language in a translation project, optionally masked to some languages. Use updatetranslationjobcontent for one job. Async: poll gettranslationasyncstatus. Project IDs come from createtranslationproject.
Run START, COMPLETE, CANCEL, or ARCHIVE on all jobs of a translation project, optionally masked to some target languages. Use runtranslationjobcommand for one job. Async: poll gettranslationasyncstatus. Project IDs come from createtranslationproject.
Get a translation job (one target language) with its status and content items, including source paths for accept/reject. Job IDs come from gettranslationproject (translationjobs); project IDs from createtranslation_project.
Delete one translation job from a project. Job IDs come from gettranslationproject (translationjobs); project IDs from createtranslation_project.
Run START, COMPLETE, CANCEL, or ARCHIVE on one translation job. Use runtranslationjobscommand for all jobs of a project. Async: poll gettranslationasyncstatus. Job IDs come from gettranslationproject.
Add content to or remove content from one DRAFT translation job. Use addtranslationprojectcontent for all jobs of a project. Async: poll gettranslationasyncstatus. Job IDs come from gettranslationproject.
Accept translated content that is READYFORREVIEW in a translation job. Use gettranslationjob to find the source paths; rejecttranslationjobcontent sends it back instead. Async: poll gettranslationasyncstatus.
Reject translated content that is READYFORREVIEW in a translation job, with an optional comment. Use gettranslationjob to find the source paths; accepttranslationjobcontent approves instead. Async: poll gettranslationasyncstatus.
Start syncing language copies of a site or asset path from its source, overwriting their content. Returns the sync process; track it with getlanguagecopysync and suspend or abort it with updatelanguagecopysync.
Get the status of a language copy sync process. The sync ID comes from startlanguagecopy_sync.
Suspend or abort a RUNNING language copy sync process. The sync ID comes from startlanguagecopysync; check its status with getlanguagecopysync.
Get the status of an asynchronous translation operation and the resources it affected (new project and job IDs). The ID is asyncjobid from createtranslationproject or the other translation write tools, or from gettranslationproject / gettranslationjob.
Validate the AEM bucket and credentials by listing one folder under /content/dam, or one content fragment model when only the Sites API is granted. Use this to confirm setup before calling other tools.
List a Content Fragment's variations (name, title, field values). Use searchfragmentvariations to filter by status or dates instead. Paginated: pass pageinfo.cursor for the next page. Use listfragments or search_fragments to find fragment IDs.
Create a new variation of a Content Fragment with a title and optional description. Returns the variation, including its generated name used by the other variation tools. Set field values afterwards with updatefragmentvariation. Use listfragments or searchfragments to find fragment IDs.
Search a Content Fragment's variations by status (NOTPUBLISHED, PUBLISHED, MODIFIED) and by created/modified/published time or user. Use listfragmentvariations to browse all instead. Paginated via pageinfo.cursor. Use listfragments or searchfragments to find fragment IDs.
Get one variation of a Content Fragment with its field values, tags, and references, plus the etag that updatefragmentvariation and deletefragmentvariation take. Use listfragmentvariations for variation names and listfragments or searchfragments for fragment IDs.
Edit a Content Fragment variation's title, description, or field values with JSON Patch operations. Call getfragmentvariation first to see the field layout and its etag (fetched automatically when etag is null). Use listfragmentvariations for variation names and list_fragments for fragment IDs.
Permanently delete a variation from a Content Fragment, optionally unlinking references to it. The etag from getfragmentvariation is fetched automatically when null. Use listfragmentvariations for variation names and listfragments or searchfragments for fragment IDs.
Get the tree of assets, fragments, and pages referenced by one Content Fragment variation. Use listfragmentvariations for variation names and listfragments or searchfragments for fragment IDs.
List the saved versions of a Content Fragment (ID, title, label, comment, creator, date). Version IDs feed getfragmentversion, restorefragmentversion, and deletefragmentversion. Paginated via pageinfo.cursor. Use listfragments or search_fragments to find fragment IDs.
Save the current state of a Content Fragment as a new version, with an optional label and comment, so it can be restored later with restorefragmentversion. Returns the new version ID. Use listfragments or searchfragments to find fragment IDs.
Get the full contents of one saved version of a Content Fragment (fields, variations, tags, references) plus the etag deletefragmentversion takes. Use listfragmentversions for version IDs and listfragments or searchfragments for fragment IDs.
Permanently delete one saved version of a Content Fragment; the fragment itself is unchanged. The etag from getfragmentversion is fetched automatically when null. Use listfragmentversions for version IDs and listfragments or searchfragments for fragment IDs.
Replace a Content Fragment's current content with a saved version. Unsaved current content is lost, so call createfragmentversion first to keep it. Use listfragmentversions for version IDs and listfragments or searchfragments for fragment IDs.

In an mcp.json file, add the configuration below, and restart Cursor.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "url": "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
5 "headers": {
6 "Authorization": "Bearer yMt*****"
7 }
8 }
9 }
10}
11Open your Claude Desktop configuration file and add the server configuration below. You'll also need to restart the application for the changes to take effect.
Make sure Claude is using the Node v20+.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "yMt*****"
14 }
15 }
16 }
17}Open your Windsurf MCP configuration file and add the server configuration below.
Click on the refresh button in the top right of the Manage MCP server page or in the top right of the chat box in the box icon.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api.merge.dev/api/v1/tool-packs/<tool-pack-id>/registered-users/<registered-user-id>/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "<ah-production-access-key>"
14 }
15 }
16 }
17 }In Command Palette (Cmd+Shift+P on macOS, Ctrl+Shift+P on Windows), run "MCP: Open User Configuration".
You can then add the configuration below and press "start" right under servers. Enter the auth token when prompted.
Learn more in the official documentation ↗
1{
2 "inputs": [
3 {
4 "type": "promptString",
5 "id": "agent-handler-auth",
6 "description": "Agent Handler AUTH_TOKEN", // "yMt*****" when prompt
7 "password": true
8 }
9 ],
10 "servers": {
11 "agent-handler": {
12 "type": "stdio",
13 "command": "npx",
14 "args": [
15 "-y",
16 "mcp-remote@latest",
17 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
18 "--header",
19 "Authorization: Bearer ${input:agent-handler-auth}"
20 ]
21 }
22 }
23}Whether you're an engineer experimenting with agents or a product manager looking to add tools, you can get started for free now