Skip to content

Create a page under a page

POST
/categories/{category}/pages/{page}
curl --request POST \
--url https://flow.work.optidata.cloud/api/categories/993/pages/2927 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "title": "First week" }'

Same as POST /categories/{category}/pages, but the new page is nested under {page}, which becomes its parent_id. The category’s Overview page cannot have children.

category
required
integer

Id of the category. Read it from GET /categories.

page
required
integer

Id of a page of that category.

Media typeapplication/json
object
title
required
string
<= 255 characters
emoji

Emoji shown before the title.

string | null
<= 255 characters
title_color

Title color as a hex code, #rgb or #rrggbb.

string | null
/#([a-fA-F0-9]{3}){1,2}\b/
cover_image_url

URL of the page’s cover image.

string | null
Examples
Examplechild
{
"title": "First week"
}

The page was created.

Media typeapplication/json

A page as returned right after it is created.

object
id
required
integer
category_id
integer
parent_id

Id of the page this one is nested under, or null for a top-level page.

integer | null
user_id

Id of the page’s author.

integer
title
string
identifier

Short public identifier of the page.

string
page_content_id
required

The page’s current version — its published version once it has one.

integer | null
status

published once a version has been published.

string
Allowed values: draft published
last_content_published_at

When a version was last published.

string | null format: date-time
is_cover

true for the category’s Overview page.

boolean
position

Sort position among its siblings.

integer
visibility

The page’s own visibility as stored — null when it inherits the category’s.

string | null
Allowed values: public
display_visibility

A page’s own visibility. inherit follows the category; public shares the page with anyone who has its link, whatever the category’s visibility.

string
Allowed values: inherit public
effective_visibility

Who can see a category. restricted: only the people and groups it is shared with. internal: everyone in the company. public: anyone with the link, including people who are not signed in.

string
Allowed values: restricted internal public
is_public

Whether the page is reachable by anyone with its link.

boolean
type
string
meta

Reserved. Always null for pages created through the API.

object | null
published_at

Not used — read last_content_published_at.

string | null format: date-time
created_at
string format: date-time
updated_at
string format: date-time
deleted_at

Set when the page is in the trash.

string | null format: date-time
customization
required

How a page looks in the Papers app.

object
id
integer
page_id
integer
emoji
string | null
title_color
string | null
cover_image_url
string | null
created_at
string format: date-time
updated_at
string format: date-time
category
required
object
id
required
integer
name
required
string
slug
required

URL-friendly form of the name.

string
description
string | null
visibility
required

Who can see a category. restricted: only the people and groups it is shared with. internal: everyone in the company. public: anyone with the link, including people who are not signed in.

string
Allowed values: restricted internal public
is_public
required

Shortcut for visibility == public.

boolean
identifier

Short public identifier of the category.

string | null
user_id

Id of the user who owns the category, when it has one.

integer | null
group_id

Set when the category mirrors a group: it is shared with the group’s members, and its name and description follow the group’s.

integer | null
cuid

Identifier of the company the category belongs to.

string
created_at
string format: date-time
updated_at
string format: date-time
deleted_at

Set when the category is in the trash.

string | null format: date-time
Examples
Examplecreated
{
"meta": null,
"title": "First week",
"user_id": 20,
"category_id": 993,
"parent_id": 2927,
"identifier": "TfWRpMvhMN",
"position": 0,
"updated_at": "2026-10-19T13:50:46.000000Z",
"created_at": "2026-10-19T13:50:46.000000Z",
"id": 2928,
"page_content_id": 4509,
"effective_visibility": "restricted",
"display_visibility": "inherit",
"is_public": false,
"customization": {
"id": 2432,
"page_id": 2928,
"emoji": null,
"title_color": null,
"created_at": "2026-10-19T13:50:46.000000Z",
"updated_at": "2026-10-19T13:50:46.000000Z",
"cover_image_url": null
},
"category": {
"id": 993,
"cuid": "7f3c2a10-5b8e-4d21-9c6a-0e4f1b2d3c4a",
"name": "Onboarding",
"slug": "onboarding",
"description": "Everything a new hire needs in the first month.",
"created_at": "2026-10-19T13:50:38.000000Z",
"updated_at": "2026-10-19T13:50:38.000000Z",
"deleted_at": null,
"visibility": "restricted",
"user_id": 20,
"identifier": "jYpV3A",
"group_id": null,
"is_public": false
}
}

No authentication key was sent.

Media typeapplication/json

Authentication failures use an error key rather than message.

object
error
required
string
Examples
Examplemissing

No bearer token sent

{
"error": "JWT passport exception: Missing bearer token in request"
}

The caller may not create pages in this category, or {page} is the category’s Overview page.

Media typeapplication/json
One of:

Generic error envelope used by permission, lookup and framework failures.

object
message
required
string
Examples
{
"message": "This action is unauthorized."
}

No such resource — or it does not belong to the category or page in the path.

Media typeapplication/json

Generic error envelope used by permission, lookup and framework failures.

object
message
required
string
Examples
Examplemissing
{
"message": "No query results for model [App\\Models\\Page] 999999"
}

The authentication key is expired or not recognised. Get a fresh one and retry.

Media typeapplication/json

Authentication failures use an error key rather than message.

object
error
required
string
Examples
Exampleexpired
{
"error": "JWT passport expired: Passport expired"
}

The request failed validation.

Media typeapplication/json
object
message
required

The first validation message.

string
errors
required

Validation messages keyed by field name.

object
key
additional properties
Array<string>
Examples
ExampletitleMissing
{
"message": "The title field is required.",
"errors": {
"title": [
"The title field is required."
]
}
}