Update a page
const url = 'https://flow.work.optidata.cloud/api/categories/993/pages/2927';const options = { method: 'PATCH', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"title":"Onboarding checklist (v2)","title_color":"#0a7"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}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.
Authorizations
Section titled “Authorizations”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters”Id of the category. Read it from GET /categories.
Id of a page of that category.
Request Bodyrequired
Section titled “Request Bodyrequired”Send only the fields to change.
object
A page’s own visibility. inherit follows the category; public shares
the page with anyone who has its link, whatever the category’s visibility.
Examples
{ "title": "Onboarding checklist (v2)", "title_color": "#0a7"}Responses
Section titled “ Responses ”The updated page.
A page as returned after an update, with its link and breadcrumb.
object
Id of the page this one is nested under, or null for a top-level page.
Id of the page’s author.
Short public identifier of the page.
The page’s current version — its published version once it has one.
published once a version has been published.
When a version was last published.
true for the category’s Overview page.
Sort position among its siblings.
The page’s own visibility as stored — null when it inherits the category’s.
A page’s own visibility. inherit follows the category; public shares
the page with anyone who has its link, whatever the category’s 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.
Whether the page is reachable by anyone with its link.
Reserved. Always null for pages created through the API.
Not used — read last_content_published_at.
Set when the page is in the trash.
Opens the page in Papers.
Breadcrumb of the page and its ancestors, separated by >.
How a page looks in the Papers app.
object
object
URL-friendly form of the name.
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.
Shortcut for visibility == public.
Short public identifier of the category.
Id of the user who owns the category, when it has one.
Set when the category mirrors a group: it is shared with the group’s members, and its name and description follow the group’s.
Identifier of the company the category belongs to.
Set when the category is in the trash.
Examples
{ "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.
Authentication failures use an error key rather than message.
object
Examples
No bearer token sent
{ "error": "JWT passport exception: Missing bearer token in request"}The caller lacks the access this operation needs.
Generic error envelope used by permission, lookup and framework failures.
object
Examples
{ "message": "This action is unauthorized."}No such resource — or it does not belong to the category or page in the path.
Generic error envelope used by permission, lookup and framework failures.
object
Examples
{ "message": "No query results for model [App\\Models\\Page] 999999"}The authentication key is expired or not recognised. Get a fresh one and retry.
Authentication failures use an error key rather than message.
object
Examples
{ "error": "JWT passport expired: Passport expired"}The request failed validation.
object
The first validation message.
Validation messages keyed by field name.
object
Examples
{ "message": "The title field is required.", "errors": { "title": [ "The title field is required." ] }}