Skip to content

Update a page

PATCH
/categories/{category}/pages/{page}
curl --request PATCH \
--url https://flow.work.optidata.cloud/api/categories/993/pages/2927 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "title": "Onboarding checklist (v2)", "title_color": "#0a7" }'

Changes a page’s title, look or visibility. Only the fields you send change. The caller must own the page or its category, or be able to edit it; anyone may edit pages of a public category.

Set visibility to public to share this one page with anyone who has its link, or back to inherit to follow the category again.

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

Send only the fields to change.

object
title
string
<= 255 characters
emoji
string | null
<= 255 characters
title_color
string | null
/#([a-fA-F0-9]{3}){1,2}\b/
cover_image_url
string | null
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
Examples
Examplerename
{
"title": "Onboarding checklist (v2)",
"title_color": "#0a7"
}

The updated page.

Media typeapplication/json

A page as returned after an update, with its link and breadcrumb.

object
id
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

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
url
required

Opens the page in Papers.

string format: uri
path
required

Breadcrumb of the page and its ancestors, separated by >.

string
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
Exampleupdated
{
"id": 2927,
"category_id": 993,
"user_id": 20,
"title": "Onboarding checklist (v2)",
"type": "text",
"meta": null,
"created_at": "2026-10-19T13:50:45.000000Z",
"updated_at": "2026-10-19T13:50:55.000000Z",
"deleted_at": null,
"parent_id": null,
"position": 1451,
"page_content_id": 4508,
"status": "draft",
"published_at": null,
"identifier": "dDbBQQtcKr",
"is_cover": false,
"visibility": null,
"last_content_published_at": null,
"path": "✅ Onboarding checklist (v2)",
"url": "https://flow.work.optidata.cloud/urn/owt1/v1-9-eyJjYXRlZ29yeV9pZCI6OTkzLCJwYWdlX2lkIjoyOTI3fQ==",
"effective_visibility": "restricted",
"display_visibility": "inherit",
"is_public": false,
"customization": {
"id": 2431,
"page_id": 2927,
"emoji": "✅",
"title_color": "#0a7",
"created_at": "2026-10-19T13:50:45.000000Z",
"updated_at": "2026-10-19T13:50:55.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 lacks the access this operation needs.

Media typeapplication/json

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

object
message
required
string
Examples
Exampledenied
{
"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."
]
}
}