Moving Notion pages with the API

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 POST request to the Notion API.
  • Make – use the HTTP – Make a Request module or the Notion – Make an API Call module to send a POST request 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:

Make Notion module with Make an API call selected
  1. We set the URL to /v1/pages/{{var.input.page_id}}/move. You must define page_id somewhere. It could come from another module, for example. In my scenario I set the scenario to run On demand and added page_id as an input parameter supplied when the scenario is run. In my screenshot it shows as page_id but 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).
  2. 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.
  3. Make sure the Method is set to “POST”.
  4. Finally we supply the Body of the request as a JSON object. See below for the value. Again, I am using target_data_source_id from 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!

Share This Post

Email
LinkedIn

Get 🔥 Notion tips in your inbox

When you sign up, you’ll get tips, perspectives, and opinions on how you can better use Notion. Plus you’ll get a steady drip of Notion updates, videos, interviews, and resources from the Notion Mastery team.

Master your life and business workflows with Notion.