Create a page
const url = 'https://flow.work.optidata.cloud/api/categories/993/pages';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"title":"Onboarding checklist","emoji":"✅","title_color":"#336699"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://flow.work.optidata.cloud/api/categories/993/pages \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "title": "Onboarding checklist", "emoji": "✅", "title_color": "#336699" }'Creates a top-level page in the category, owned by the caller, with an
empty first draft whose id is returned in page_content_id. The caller
must own the category or be able to edit in it; anyone may add pages to
a public category.
To create a page under another page, use
POST /categories/{category}/pages/{page}.
Authorizations
Section titled “Authorizations”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters”Id of the category. Read it from GET /categories.
Request Bodyrequired
Section titled “Request Bodyrequired”object
Emoji shown before the title.
Title color as a hex code, #rgb or #rrggbb.
URL of the page’s cover image.
Examples
{ "title": "Onboarding checklist", "emoji": "✅", "title_color": "#336699"}Responses
Section titled “ Responses ”The page was created.
A page as returned right after it is created.
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.
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
{ "title": "Onboarding checklist", "user_id": 20, "category_id": 993, "identifier": "dDbBQQtcKr", "position": 1451, "updated_at": "2026-10-19T13:50:45.000000Z", "created_at": "2026-10-19T13:50:45.000000Z", "id": 2927, "page_content_id": 4508, "effective_visibility": "restricted", "display_visibility": "inherit", "is_public": false, "customization": { "id": 2431, "page_id": 2927, "emoji": "✅", "title_color": "#336699", "created_at": "2026-10-19T13:50:45.000000Z", "updated_at": "2026-10-19T13:50:45.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." ] }}