# XMP Metadata Access Completely Broken in Photoshop 27 - Critical Regression for UXP Plugin Developers

**URL:** <https://forums.creativeclouddeveloper.com/t/xmp-metadata-access-completely-broken-in-photoshop-27-critical-regression-for-uxp-plugin-developers/11544>\
**Category:** UXP Developer Tool\
**Tags:** uxp, javascript, api-feedback\
**Created:** [November 14, 2025, 5:49am UTC](https://forums.creativeclouddeveloper.com/t/xmp-metadata-access-completely-broken-in-photoshop-27-critical-regression-for-uxp-plugin-developers/11544 "2025-11-14T05:49:28Z")\
**Posts on this page:** 16\
**Page:** 1

<div class="post-metadata">

**Author:** ![Rob](https://sea1.discourse-cdn.com/flex015/user_avatar/forums.creativeclouddeveloper.com/rob/32/4674_2.png) [@Rob](https://forums.creativeclouddeveloper.com/u/Rob)\
**Post date:** [November 14, 2025, 5:49am UTC](https://forums.creativeclouddeveloper.com/t/xmp-metadata-access-completely-broken-in-photoshop-27-critical-regression-for-uxp-plugin-developers/11544/1 "2025-11-14T05:49:28Z")

</div>

Summary

After upgrading from Photoshop 26 to 27, all XMP metadata read/write  
operations in UXP plugins have stopped working. This appears to be an  
undocumented breaking change that affects any plugin using XMP metadata  
functionality.

Background

I maintain several UXP plugins that rely heavily on XMP metadata for  
storing application data within Photoshop documents. These plugins worked  
flawlessly in PS 26 and earlier versions. I also recently published “The  
Definitive Guide to UXP XMP Integration” documenting best practices for  
XMP operations in UXP.

What Worked in PS 26

The following standard XMP operations worked reliably:

// Direct XMP access (PS 26)  
const doc = app.activeDocument;  
const rawXMP = doc.xmpMetadata.rawData;  
const xmp = new XMPMeta(rawXMP);  
const value = xmp.getProperty(XMPConst.NS\_DC, “description”);

// XMP writing (PS 26)  
xmp.setProperty(XMPConst.NS\_DC, “description”, “test data”);  
doc.xmpMetadata.rawData = xmp.serialize();

// BatchPlay XMP access (PS 26)  
const result = await action.batchPlay([{  
“\_obj”: “get”,  
“\_target”: [{ “\_ref”: “property”, “\_property”: “xmpMetadata” }]  
}], {});

What’s Broken in PS 27

Complete XMP metadata access failure:

1. Direct API Access:  
console.log(app.activeDocument.xmpMetadata); // → undefined/false
2. ExecuteAsModal Context:  
await core.executeAsModal(async () =\> {  
const doc = app.activeDocument;  
console.log(!!doc.xmpMetadata); // → false  
console.log(!!doc.xmpMetadata?.rawData); // → false  
});
3. BatchPlay Commands:  
// Returns error -25920: “The command ‘Get’ is not currently available”  
const result = await action.batchPlay([{  
“\_obj”: “get”,  
“\_target”: [{ “\_ref”: “property”, “\_property”: “xmpMetadata” }]  
}], {});

Test Case & Reproduction

I created a comprehensive test plugin to isolate this issue. The test  
consistently shows:

- ✓ Document exists: “Untitled-1”
- ✗ Direct xmpMetadata: false
- ✗ Modal xmpMetadata: false
- ✗ BatchPlay fails: error -25920

Console Output:  
[XMP-EXISTS] Document exists: “Untitled-1”  
[XMP-EXISTS] Direct xmpMetadata: false  
[XMP-EXISTS] Modal xmpMetadata: false  
[XMP-EXISTS] BatchPlay failed: XMP Write Test: The command “Get” is not  
currently available.

Impact on Plugin Ecosystem

This regression affects:

- Document-specific data storage via XMP
- Custom metadata workflows
- Integration with File \> File Info dialog
- Cross-application metadata compatibility
- Any plugin following Adobe’s documented XMP patterns

My production plugin “Noteli” (a note-taking tool that stores notes in  
XMP) completely stopped functioning after users upgraded to PS 27.

Questions for Adobe

1. Is this an intentional security restriction or an unintended  
regression?
  - No release notes mention removing XMP access
  - This breaks fundamental plugin functionality without warning

2. What is the official PS 27 method for XMP operations?
  - Current UXP documentation still shows the broken methods
  - Plugin developers need updated guidance

3. Will XMP access be restored in a future update?
  - Many plugins depend on this core functionality
  - Need clarity for plugin maintenance planning

4. Was this change made to restrict developer access to XMP metadata?
  - If intentional, what’s the reasoning behind removing this capability?
  - How should plugins handle document-specific metadata storage now?

Workaround Attempts

I’ve tested various approaches based on community suggestions:

- PS 27 compatible write pattern using executeAsModal() + save()
- Alternative XMP module imports (require(‘photoshop’).xmp vs  
require(‘uxp’).xmp)
- Permission escalation to fullAccess
- Different timing approaches with delays

None restore basic XMP read access.

Technical Environment

- Platform: macOS (Darwin 24.6.0)
- Photoshop: Version 27.x
- UXP Version: 6.2
- Plugin Type: Panel with fullAccess permissions
- Manifest Version: 5

Request for Action

This appears to be a critical regression that breaks existing plugin  
functionality. Could Adobe engineering please:

1. Confirm whether this is intentional or a bug
2. Provide official guidance for PS 27 XMP operations
3. Update UXP documentation to reflect current capabilities
4. Restore XMP access if this was unintended

The plugin developer community needs clarity on this fundamental  
capability that many plugins depend on.

* * *

Has anyone else experienced this XMP access regression in PS 27? Any  
insights or workarounds would be greatly appreciated.

---

<div class="post-metadata">

**Author:** ![Karmalakas](https://sea1.discourse-cdn.com/flex015/user_avatar/forums.creativeclouddeveloper.com/karmalakas/32/1048_2.png) [@Karmalakas](https://forums.creativeclouddeveloper.com/u/Karmalakas)\
**Post date:** [November 14, 2025, 8:26am UTC](https://forums.creativeclouddeveloper.com/t/xmp-metadata-access-completely-broken-in-photoshop-27-critical-regression-for-uxp-plugin-developers/11544/2 "2025-11-14T08:26:52Z")

</div>

Did you try this BP descriptor?

> [@Document XMP metadata](https://forums.creativeclouddeveloper.com/t/document-xmp-metadata/3486):
>
> Hi, I’m trying to get, set and delete a namespaced key, value pair on the XMP at the document’s level. I’ve borrowed @simonhenke code from [this post](http://forums.creativeclouddeveloper.com/t/photoshop-uxp-plugin-xmpmetadata/2166) on Layer XMP, and edited a bit to transform it on Document XMP. I’m using xmldom, and I’ve got this: const bp = require("photoshop").action.batchPlay const { DOMParser, XMLSerializer, DOMImplementation } = require('xmldom'); // Get all the Doc XMP const getDocumentXMP = () =\> { return bp([{ \_obj: "get", \_target: { \_ref: [ …

Also check the solution post about the library. I wonder if this still works. At least I didn’t get any complaints and I use this approach in one of my plugins 🤔

---

<div class="post-metadata">

**Author:** ![Rob](https://sea1.discourse-cdn.com/flex015/user_avatar/forums.creativeclouddeveloper.com/rob/32/4674_2.png) [@Rob](https://forums.creativeclouddeveloper.com/u/Rob)\
**Post date:** [November 14, 2025, 8:44am UTC](https://forums.creativeclouddeveloper.com/t/xmp-metadata-access-completely-broken-in-photoshop-27-critical-regression-for-uxp-plugin-developers/11544/3 "2025-11-14T08:44:00Z")

</div>

I will check it out, thanks. Which library post do you refer to?

---

<div class="post-metadata">

**Author:** ![Karmalakas](https://sea1.discourse-cdn.com/flex015/user_avatar/forums.creativeclouddeveloper.com/karmalakas/32/1048_2.png) [@Karmalakas](https://forums.creativeclouddeveloper.com/u/Karmalakas)\
**Post date:** [November 14, 2025, 8:59am UTC](https://forums.creativeclouddeveloper.com/t/xmp-metadata-access-completely-broken-in-photoshop-27-critical-regression-for-uxp-plugin-developers/11544/4 "2025-11-14T08:59:30Z")

</div>

The one marked as a solution 🙂

> [@Document XMP metadata](https://forums.creativeclouddeveloper.com/t/document-xmp-metadata/3486/3):
>
> Solved wine_glass I had to use a different XML library called xmlbuilder2. const { convert } = require('xmlbuilder2'); // GETTER // ------------------------------------------------- // \<rdf:Description xmlns:undavide="http://davidebarranca.com/notes/" etc...\> // \<undavide:Notes\>someValue\</undavide:Notes\> // ------------------------------------------------- // key: Notes // prefix: undavide // namespace: http://davidebarranca.com/notes/ export const getDocumentMetadata = ({ key, prefix = 'u…

---

<div class="post-metadata">

**Author:** ![Rob](https://sea1.discourse-cdn.com/flex015/user_avatar/forums.creativeclouddeveloper.com/rob/32/4674_2.png) [@Rob](https://forums.creativeclouddeveloper.com/u/Rob)\
**Post date:** [November 14, 2025, 9:12am UTC](https://forums.creativeclouddeveloper.com/t/xmp-metadata-access-completely-broken-in-photoshop-27-critical-regression-for-uxp-plugin-developers/11544/5 "2025-11-14T09:12:49Z")

</div>

Ah, sorry I looked at that. I will consider, but looking at a different option at the moment that won’t get broken in UXP or PS updates.

---

<div class="post-metadata">

**Author:** ![Rob](https://sea1.discourse-cdn.com/flex015/user_avatar/forums.creativeclouddeveloper.com/rob/32/4674_2.png) [@Rob](https://forums.creativeclouddeveloper.com/u/Rob)\
**Post date:** [November 14, 2025, 3:35pm UTC](https://forums.creativeclouddeveloper.com/t/xmp-metadata-access-completely-broken-in-photoshop-27-critical-regression-for-uxp-plugin-developers/11544/6 "2025-11-14T15:35:10Z")

</div>

OK, so after a really hard day I managed to use the info from above to write to the dc:description field, but I cannot make it register a namespace, even if using the same method @DavideBarranca used in his example and solution.  
Has PS 27 stopped this access?  
**Key points:**

- dc:description with setLocalizedText/getLocalizedText works perfectly ✅

- dc:custom\_property with setProperty/getProperty fails silently ❌

- Same namespace, same XMP methods, different results

- batchPlay claims success but data vanishes

- All namespaces properly registered at startup

- Multiple PS versions tested

---

<div class="post-metadata">

**Author:** ![Rob](https://sea1.discourse-cdn.com/flex015/user_avatar/forums.creativeclouddeveloper.com/rob/32/4674_2.png) [@Rob](https://forums.creativeclouddeveloper.com/u/Rob)\
**Post date:** [November 15, 2025, 9:45am UTC](https://forums.creativeclouddeveloper.com/t/xmp-metadata-access-completely-broken-in-photoshop-27-critical-regression-for-uxp-plugin-developers/11544/7 "2025-11-15T09:45:04Z")

</div>

Just to add an end note. I played more with the solution mentioned above and can confirm I now have custom namespaces with data in XMP in PS 27! 😀

---

<div class="post-metadata">

**Author:** ![Rob](https://sea1.discourse-cdn.com/flex015/user_avatar/forums.creativeclouddeveloper.com/rob/32/4674_2.png) [@Rob](https://forums.creativeclouddeveloper.com/u/Rob)\
**Post date:** [November 15, 2025, 2:12pm UTC](https://forums.creativeclouddeveloper.com/t/xmp-metadata-access-completely-broken-in-photoshop-27-critical-regression-for-uxp-plugin-developers/11544/8 "2025-11-15T14:12:31Z")

</div>

I was looking into injecting IRB data, but that got blown out for UXP security reasons.

---

<div class="post-metadata">

**Author:** ![joshy](https://avatars.discourse-cdn.com/v4/letter/j/7993a0/32.png) [@joshy](https://forums.creativeclouddeveloper.com/u/joshy)\
**Post date:** [November 21, 2025, 3:08am UTC](https://forums.creativeclouddeveloper.com/t/xmp-metadata-access-completely-broken-in-photoshop-27-critical-regression-for-uxp-plugin-developers/11544/9 "2025-11-21T03:08:38Z")

</div>

Still interested to know if this breaking change was a bug and if Adobe will still support direct XMP access via the documented methods. We especially rely on XMP for data storage in InDesign documents.

---

<div class="post-metadata">

**Author:** ![Rob](https://sea1.discourse-cdn.com/flex015/user_avatar/forums.creativeclouddeveloper.com/rob/32/4674_2.png) [@Rob](https://forums.creativeclouddeveloper.com/u/Rob)\
**Post date:** [November 21, 2025, 4:39am UTC](https://forums.creativeclouddeveloper.com/t/xmp-metadata-access-completely-broken-in-photoshop-27-critical-regression-for-uxp-plugin-developers/11544/10 "2025-11-21T04:39:47Z")

</div>

Indeed [@Adobe](https://forums.creativeclouddeveloper.com/groups/adobe) Everything was working fine and now your documented method is broke. I was told it has something to do with Content Credential pipeline and security boosts in that area. Especially the matchplay method throws wobblies even in my new method using the above techniques stated by **[DavideBarranca](https://forums.creativeclouddeveloper.com/u/davidebarranca)**

---

<div class="post-metadata">

**Author:** ![Erin\_Finnegan](https://sea1.discourse-cdn.com/flex015/user_avatar/forums.creativeclouddeveloper.com/erin_finnegan/32/100_2.png) [@Erin\_Finnegan](https://forums.creativeclouddeveloper.com/u/Erin_Finnegan)\
**Post date:** [November 21, 2025, 5:53pm UTC](https://forums.creativeclouddeveloper.com/t/xmp-metadata-access-completely-broken-in-photoshop-27-critical-regression-for-uxp-plugin-developers/11544/11 "2025-11-21T17:53:31Z")

</div>

@samgannaway Can you take a look at this one?

---

<div class="post-metadata">

**Author:** ![Dirk](https://avatars.discourse-cdn.com/v4/letter/d/87869e/32.png) [@Dirk](https://forums.creativeclouddeveloper.com/u/Dirk)\
**Post date:** [November 21, 2025, 6:48pm UTC](https://forums.creativeclouddeveloper.com/t/xmp-metadata-access-completely-broken-in-photoshop-27-critical-regression-for-uxp-plugin-developers/11544/12 "2025-11-21T18:48:26Z")

</div>

@samgannaway If you come along Jira, please consider a cross-reference to ID-4267520 for related issues with an InDesign POV and general XMP.

---

<div class="post-metadata">

**Author:** ![samgannaway](https://avatars.discourse-cdn.com/v4/letter/s/898d66/32.png) [@samgannaway](https://forums.creativeclouddeveloper.com/u/samgannaway)\
**Post date:** [December 7, 2025, 12:44am UTC](https://forums.creativeclouddeveloper.com/t/xmp-metadata-access-completely-broken-in-photoshop-27-critical-regression-for-uxp-plugin-developers/11544/13 "2025-12-07T00:44:40Z")

</div>

I’m a little confused. `app.activeDocument.xmpMetadata` is ExtendScript.  
XMP is provided under the `uxp` module: require(‘uxp’).xmp

I would [link to the documentation](https://developer.adobe.com/photoshop/uxp/2022/uxp-api/reference-js/Modules/uxp/XMP/getting-started/xmp.md) here, but it appears to be broken. Sigh…

I’ll take a look at the descriptors when I get a chance. @DavideBarranca, have you used the XMP support under ‘uxp’?

---

<div class="post-metadata">

**Author:** ![Roland\_Dreger](https://sea1.discourse-cdn.com/flex015/user_avatar/forums.creativeclouddeveloper.com/roland_dreger/32/3702_2.png) [@Roland\_Dreger](https://forums.creativeclouddeveloper.com/u/Roland_Dreger)\
**Post date:** [December 7, 2025, 5:11pm UTC](https://forums.creativeclouddeveloper.com/t/xmp-metadata-access-completely-broken-in-photoshop-27-critical-regression-for-uxp-plugin-developers/11544/14 "2025-12-07T17:11:09Z")

</div>

I don’t know if this helps with troubleshooting, but in InDesign 2026, it works in UXP both with document property and via module (`const { XMPMeta, XMPConst, XMPFile } = require(“uxp”).xmp;`).

[https://developer.adobe.com/indesign/uxp/reference/uxp-api/reference-js/Modules/uxp/XMP/getting-started/](https://developer.adobe.com/indesign/uxp/reference/uxp-api/reference-js/Modules/uxp/XMP/getting-started/)

---

<div class="post-metadata">

**Author:** ![Dirk](https://avatars.discourse-cdn.com/v4/letter/d/87869e/32.png) [@Dirk](https://forums.creativeclouddeveloper.com/u/Dirk)\
**Post date:** [December 7, 2025, 8:13pm UTC](https://forums.creativeclouddeveloper.com/t/xmp-metadata-access-completely-broken-in-photoshop-27-critical-regression-for-uxp-plugin-developers/11544/15 "2025-12-07T20:13:14Z")

</div>

That broken link is for a .md – I think those are only present in the github doc sources.

[https://developer.adobe.com/photoshop/uxp/2022/uxp-api/reference-js/Modules/uxp/XMP/getting-started/](https://developer.adobe.com/photoshop/uxp/2022/uxp-api/reference-js/Modules/uxp/XMP/getting-started/)

Rob’s example may be missing a bunch of require(), or could it be .psjs ?

My mentioned InDesign case is more about documentation problems common to all uxp.xmp hosts, where Rob’s issues are far deeper into the PS DOM. Interesting to learn that PS also has / had separate XMP support. I may need that soon.

@samgannaway is uxp.xmp file access (as in the linked doc, batch example) supposed to work on PS documents while they are open in PS?

---

<div class="post-metadata">

**Author:** ![Rob](https://sea1.discourse-cdn.com/flex015/user_avatar/forums.creativeclouddeveloper.com/rob/32/4674_2.png) [@Rob](https://forums.creativeclouddeveloper.com/u/Rob)\
**Post date:** [December 8, 2025, 3:45am UTC](https://forums.creativeclouddeveloper.com/t/xmp-metadata-access-completely-broken-in-photoshop-27-critical-regression-for-uxp-plugin-developers/11544/16 "2025-12-08T03:45:09Z")

</div>

The script snippet isn’t complete. It’s the bare elements to show here. I did write a full report of the process taken to get XMP working, but as soon as I wrote and aired it the system broke. This coincided with PS 27 release. I then took 2 days to implement @DavideBarranca method and it works fine now. I believe this method will also survive PS upgrades too.
