Skip to content

Delete a page

DELETE
/categories/{category}/pages/{page}
curl --request DELETE \
--url https://flow.work.optidata.cloud/api/categories/993/pages/2927 \
--header 'Authorization: Bearer <token>'

Moves a page to the trash and returns it. The caller must own the page or its category, or have manage access to it. The category’s Overview page cannot be deleted.

category
required
integer

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

page
required
integer

Id of a page of that category.

The page, now in the trash.

Media typeapplication/json

A page moved to the trash.

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
category
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
Exampletrashed
{
"id": 2928,
"category_id": 993,
"user_id": 20,
"title": "First week",
"type": "text",
"meta": null,
"created_at": "2026-10-19T13:50:46.000000Z",
"updated_at": "2026-10-19T13:53:03.000000Z",
"deleted_at": "2026-10-19T13:53:03.000000Z",
"parent_id": 2927,
"position": 0,
"page_content_id": 4509,
"status": "draft",
"published_at": null,
"identifier": "TfWRpMvhMN",
"is_cover": false,
"visibility": null,
"last_content_published_at": null,
"effective_visibility": "restricted",
"display_visibility": "inherit",
"is_public": false,
"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 delete this page, or it 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"
}