Move API
2026 has been a great year for additions to the public Notion API. In October we got the ability to apply and update templates via the API, and to close out the year it’s now possible to move pages into other pages and data sources via the API.
Note: if you just want the example code, check the “move-page” example folder in my Notion API examples repository.
Use-cases
So what can you do with this? In short, you can move a page into a different page if you have the ID of the page and the ID of the target. The target ID can either be the ID of a page or the ID of a data source.
Use-case wise, I’m seeing utilities like the following examples:
- You might move a series of pages that do not have a database parent into the data source in the database.
- Perhaps you captured content into the wrong database and want to “reparent” them into a different database.
- Maybe you want to archive a series of pages in a data source and move them into a backup data source that has the same schema.
- You might move pages into another page, organizing them in one location.
Moving a page into a page
First of all, we need the IDs of the page to move and the target page. Then we call the asychronous move function on the pages endpoint.
const page_id = '2af1c1cce3f3802985bdecfa26194f94';
const target_page_id = '2ae1c1cce3f3815a8140ce2cac1a27b8';
await notion.pages.move({
page_id: page_id,
parent: {
type: 'page_id',
page_id: target_page_id,
},
});
notion.pages.move returns a object representing the page that was moved.
Moving a page into a data source
Moving a page into a data source is a very similar operation, but we use data_source_id instead of page_id:
const page_id = '2af1c1cce3f3802985bdecfa26194f94';
const target_data_source_id = '2ae1c1cce3f3815a8140ce2cac1a27b8';
await notion.pages.move({
page_id: page_id,
parent: {
type: 'data_source_id',
data_source_id: target_data_source_id,
},
});
Can I use this with my automation platform?
So how can you use this with Make, Zapier etc.?
Much like the template application APIs, this is dependent on the platforms adding support for the move API. At the time of this writing, no platforms are supporting this endpoint directly. So you’ll have to use something different.
For example, when the endpoint had been added to Notion’s public API, but not to the JavaScript SDK yet, I used Axios to make a POST request instead like so:
const response = await notionAPI.post(`/pages/${page_id}/move`, {
parent: {
type: 'page_id',
page_id: target_page_id,
},
});
But how do I do this with Make or Zapier?
- Zapier – use the Webhooks by Zapier action to send a
POSTrequest to the Notion API. - Make – use the HTTP – Make a Request module or the Notion – Make an API Call module to send a
POSTrequest to the Notion API
In both cases, you’re sending a request to https://api.notion.com/v1/pages/{PAGE_TO_MOVE_ID}/move, where {PAGE_TO_MOVE_ID} is replaced by the ID of the page you are moving. You also need to send the parent in the body of the request as a JSON object.
Locally, again I used Axios to create my own simple wrapper to the Notion API in case the JavaScript SDK doesn’t support a specific endpoint (which you can see I used above imported as notionAPI).
const { default: axios } = require('axios');
const dotenv = require('dotenv');
dotenv.config();
const NOTION_VERSION = '2025-09-03';
const NOTION_HEADERS = {
Authorization: `Bearer ${process.env.NOTION_API_TOKEN}`,
'Notion-Version': NOTION_VERSION,
};
const JSON_HEADERS = {
...NOTION_HEADERS,
Accept: 'application/json',
'Content-Type': 'application/json',
};
const notionAPI = axios.create({
baseURL: 'https://api.notion.com/v1',
headers: NOTION_HEADERS,
});
module.exports = notionAPI;
That’s nice for me the hacker, but what if you don’t have all this code stuff set up and ready to use locally…
Moving pages with Make
In Make, I added a Notion module making sure the account I am using has access to the pages/data sources I need it to have access to.
I then select the Make an API Call action of the Notion module to be able to make a manual API call with the Notion API:
- We set the URL to
/v1/pages/{{var.input.page_id}}/move. You must definepage_idsomewhere. It could come from another module, for example. In my scenario I set the scenario to run On demand and addedpage_idas an input parameter supplied when the scenario is run. In my screenshot it shows aspage_idbut it is actually the value{{var.input.page_id}}behind that name (you can see these actual values if you copy and paste text to/from Make scenarios). - Set the Notion version to “2025-09-03”. This is the version of the Notion API—a date—not the version of the Notion client.
- Make sure the Method is set to “POST”.
- Finally we supply the Body of the request as a JSON object. See below for the value. Again, I am using
target_data_source_idfrom the scenario’s inputs.
{
"parent": {
"type": "data_source_id",
"data_source_id": "{{var.input.target_data_source_id}}"
}
}
When this scenario runs it’ll take my manually supplied page_id and target_data_source_id input parameters and inject them into the URL and Body parameters of the request and complete the POST request to Notion.
What are you building?
What does this addition to the API unlock for you? Feel free to let me know by replying to me on BlueSky. Give me a follow while you’re there!