Is there a reference to documentation which detail how to convert a legacy (v1) page to a modern (v2) page using the REST API?
The Confluence v2 API does not appear to note anything specific and could not find any new information on the Confluence Development Community home. There used to be some level of support changing editors with the `metadata.properties.editor.value` property:
metadata.properties.editor.value = 'v2'
However, setting/providing this value does not change anything anymore (i.e. pages flagged to be using v2 have the property set but remain as a legacy page).
Woof, ok, what I wrote before feels like way too much work. It's probably STILL super-useful to dig into Collaborative Editing to see if there's a way to see if somebody already is working on a page, and IF SO, to NOT do the conversion.
But I wanted a shortcut, and thanks to Google and the fine folks at Bob Swift Appfire, I found one:
Via this comment in CONFCLOUD-70955 - Bulk convert pages to the new editor I found that much like the Simpsons, Bob Swift, or well, Appfire, already did it:
As @Kinnera _Appfire_ wrote, you can use the Marketplace app Confluence CLI's renderRequest action to do this:
To convert a single page into a new editor please use the below action:
--action renderRequest --request "/rest/api/content/506527918/convert?hash=13" --type "JSON" --requestType PUT
This is also in their official documentation:
HOWEVER, since they are using renderRequest, I'm going to point out that what they've basically done is give you the clues to do this YOURSELF with scripting / coding language of your choice.
As an example, I successfully converted a page using this curl command:
curl --user MYUSER@MYEMAIL \
-X PUT -H 'Content-Type: application/json' \
'https://MYSITE.atlassian.net/wiki/rest/api/content/931144538/convert?hash=13'
SO, to decode that:
--user: use my email address as the user, and curl prompts me for a password. Instead I enter a token which is part the Basic Auth flow described here.
-X: means use the PUT method which is usually used for updating a page with some data (in this case, the data we're sending is the mysterious "hash=13"
-H 'Content-Type: application/json': send the data in the JSON format.
DISCLAIMER:
I have no idea where the fine folks at Appfire found this endpoint. Google only finds the aforementioned Community article and Appfire documentation when searching for hash=13 confluence.
As Appfire themselves write at the end of their docs:
It is recommended to test the commands in a non-production environment or run the action with the --simulate parameter to verify the behavior before deploying.
PARTING WORDS OF WARNING:
You will definitely want to test this before doing anything in bulk.
You almost positively should find a way to see if a page already has a draft open before doing this, lest you run the risk of prematurely publishing somebody's incomplete draft.*
* On the other hand, it's unclear if Atlassian themselves will be this careful. Neither their FAQ nor their recent post from Dec 17, 2025 address the question of how their automatic conversion process will deal with a page that has an existing Shared Draft with changes.
I should probably ask about that, but if I put myself in their shoes, I would say "Enh, any changes in existing Shared Drafts will be published, so you should probably tell all your users to make sure they save their drafts before Phase 2 - auto-conversion upon viewing/editing legacy pages, currently scheduled to roll out from January 21 - February 18, 2026"
Yikes, that's next month. I wonder if this will be delayed for folks on Release Tracks. Ooof, another question to ask.
BTW, I just tested this, adding "OH GOD DON'T PUBLISH THIS YET" to the top of a draft on a legacy page (BUT NOT PUBLISHING IT). I then converted said page using the curl command above, and welp:
So please please consider yourself warned. :-D
Oof, so yeah, I didn't have much look finding an official endpoint to see if there is an existing draft. But I found something unofficial that is better:
curl --user MYEMAIL@MYSITE \
-H 'content-type: application/json' \
--data-raw '{"dataType":"json","contentId":"PAGEID","draftType":"page","collabService":"synchrony","editorVersion":"v1"}' \
'https://roku.atlassian.net/wiki/api/v2/editor/heartbeat/start'
Ok, so --user and -H are same as before.
In this case, because we are using --data-raw, curl already knows this is using the POST method to send the data.
You'll need your PAGEID, and you'll note that editorVersion is v1, so I've only tested this with Legacy pages.
Anyways, here's what makes this endpoint great - it returns data like this:
{
"atlToken": "xxxxx1231234123",
"labelsHash": "xxx1231231231231",
"restrictionsHash": "",
"hasViewRestrictions": false,
"contributors": [],
"editorSessionId": "xxxx213123123123"
}
You'll see that the contributors array is empty. That's GREAT NEWS because it means NOBODY is working on a draft for this page.
Alternately, you may get something like this:
{
"atlToken": "xxxxx1231234123",
"labelsHash": "xxx1231231231231",
"restrictionsHash": "",
"hasViewRestrictions": false,
"contributors": [
{
"accountId": "6098s7adf89a7sdf",
"lastModification": "1766378446448",
"formattedLastModification": "about an hour ago"
},
{
"accountId": "609asd879a8dsfa",
"lastModification": "1766381670992",
"formattedLastModification": "31 minutes ago"
}
],
"editorSessionId": "xxxx213123123123"
}
And that is OK because it tells you that 1) there is an existing draft for this page, 2) the accountIds of the user(s) who are working on the draft, and 3) when their last changes were.
AND SO, you could choose to skip that page with your conversion script.
BETTER STILL, using the one of the user API endpoints you could get those users emails and give them a heads-up about the impending conversion, asking them to review the draft, save changes, etc.
Once again, same disclaimers apply. Unofficial endpoint, use at your own risk, test thorougly, etc etc.
I found this endpoint by using Chrome Dev Tools to watch what Confluence did when I edited a draft that had multiple contributors.
As to whether they might change this endpoint, I'm thinking, probably not, because it's NOT used in the New Editor, and Atlassian is loathe to update anything that isn't new.
(Because I couldn't help myself, I wondered what the equivalent in the New Editor was to see who is working on a draft, and it appears to be this:
So... I guess this is "documented" here: Find source entities related to a target entity. But nothing there talks about the "collaborator" relation so yay, another easter egg. :-P
Anywho, in my tests with a New Editor page, that call returns results that will contain draft collaborators for the page in the results[] array. Not sure what use this might be to anyone, but hey, at least it's now documented somewhere. :-}
Oh, and I just confirmed that if there is not an active draft, the above endpoint (again it is for NEW EDITOR pages) returns:
{
"results": [],
"start": 0,
"limit": 25,
"size": 0,
"_links": {
"base": "https://YOURSITE.atlassian.net/wiki",
"context": "/wiki"
}
}
OH ALSO...
Even though "hash=13" endpoint above lets you convert a page that is currently being collaboratively edited, I just noticed that the User Interface prevents this:
So they are probably doing a similar check to see if there's > 1 contributor and popping that message up.
It'll be interesting to see how automatic conversion will deal with this.
SOAPBOX
Oh, while I was testing all this, I'm reminded of something thing that bugs me about both the Legacy and New Editor both (ok many things bug me about the New Editor, but just talking about the topic of drafts), is that in their quest to be Google Docs (when they introduced Collaborative Editing back ~2015, it was clear that's who they were trying to emulate), they are STILL lacking the ability to see which collaborators made each edit. It's infuriating.
Furthermore, sometimes you will see "Unpublished Changes" for a page. Apparently that's only if they're YOUR unpublished changes.
This has been a problem for some of my users who inadvertently published someone else's incomplete edits on a different part of a page, because there was no HIGHLIGHT indicating what those changes were. (At least now they give you some warning that somebody changed SOMETHING, but how are you supposed to find that since you cannot see changes until AFTER you publish?)