GenuineAIGenuineAI
For usersFor developers
  • Overview
  • Guides
  • How-to
  • API reference
Documentation
  • Quickstart
  • Authentication
  • Errors
  • Rate limits
  • API reference
Platform
  • Platform overview
  • Solutions
  • Pricing
  • Sign in
Company
  • Status
  • Trust Center
  • Contact
  • Terms of Service
  • Privacy Policy

© 2026 GenuineAI Ventures LLC

support@genuinehq.com
Overview
Core
Media library
AI
Documents
Knowledge
Creative
Website & content
    Website content
    Content schemas
    Content approval flows
      List flowsgetCreate a flowpostGet a flowgetUpdate a flowputDelete a flowdelete
    CMS sync
    Social
Automation
Customer channels
Administration
Schemas
GenuineAI API
GenuineAI API

Content approval flows

The review a page goes through between being drafted and being fit to publish: the steps, what each move is called, and who may make it.


List flows

GET
https://api.genuineai.app/api/v1
/content-approval-flows

Returns the workspace's content approval flows, each with its steps. Which flow reviews a given site is the site's own setting — see PUT /sites/{id}/approval-flow — and sites that have not chosen take the flow marked sm_default.

List flows › query Parameters

cursor
​string · maxLength: 512 · pattern: ^[A-Za-z0-9_-]+$
limit
​integer
offset
​integer · min: 0
sm_active
​boolean
sort
​string · minLength: 1 · maxLength: 64 · pattern: ^-?[a-z0-9_]+$

List flows › Headers

X-Tenant-Id
​string · uuid · required

The workspace this request acts in. Every row the API returns is isolated to it at the database layer by row-level security.

List flows › Responses

Success

​ContentApprovalFlow[]
The review steps a website page moves through before it can be published — what each step is called, and who may move a page into it.
ContentApprovalFlow
sm_id
​string · uuid
sm_active
​boolean
sm_created
​string · date-time
sm_updated
​string · date-time
sm_name
​string
sm_default
​boolean

The flow governing every site that has not chosen one of its own. At most one flow is the default.

​object[]

Retired for content flows: pages move by selecting a step directly, gated by the step's own si_roles.enter. Old definitions may still carry authored moves here; nothing reads them.

sm_metadata
​object
​object[]

The flow's steps, in the order pages move through them.

GET/content-approval-flows
curl https://api.genuineai.app/api/v1/content-approval-flows \ --header 'X-Tenant-Id: <string>' \ --header 'X-Api-Key: <api-key>'
Example Responses
[ { "sm_id": "00000000-0000-0000-0000-000000000000", "sm_active": true, "sm_created": "2024-08-25T15:00:00Z", "sm_updated": "2024-08-25T15:00:00Z", "sm_name": "sm_name", "sm_default": true, "sm_transitions": [ { "from": "00000000-0000-0000-0000-000000000000", "to": "00000000-0000-0000-0000-000000000000", "roles": [ "00000000-0000-0000-0000-000000000000" ], "users": [ "00000000-0000-0000-0000-000000000000" ], "label": "label", "back": true, "notify": true, "actions": [ "string" ] } ], "sm_metadata": {}, "states": [ { "si_id": "00000000-0000-0000-0000-000000000000", "si_label": "si_label", "si_color": "si_color", "si_order": 0, "si_initial": true, "si_final": true, "si_note": true, "si_roles": {}, "si_active": true } ] } ]
json
application/json

Create a flow

POST
https://api.genuineai.app/api/v1
/content-approval-flows

Defines review steps pages can move through before publishing. Pages reaching draft enter at the initial step, and reaching the final step is what marks a page approved. The workspace's first flow becomes the default — governing every site that has not chosen its own — unless sm_default says otherwise; marking a later flow default takes the role from the previous holder.

Create a flow › Headers

X-Tenant-Id
​string · uuid · required

The workspace this request acts in. Every row the API returns is isolated to it at the database layer by row-level security.

Create a flow › Request Body

​object[] · required
​array
sm_name
​string
sm_default
​boolean

Create a flow › Responses

Created

The review steps a website page moves through before it can be published — what each step is called, and who may move a page into it.
ContentApprovalFlow
sm_id
​string · uuid
sm_active
​boolean
sm_created
​string · date-time
sm_updated
​string · date-time
sm_name
​string
sm_default
​boolean

The flow governing every site that has not chosen one of its own. At most one flow is the default.

​object[]

Retired for content flows: pages move by selecting a step directly, gated by the step's own si_roles.enter. Old definitions may still carry authored moves here; nothing reads them.

sm_metadata
​object
​object[]

The flow's steps, in the order pages move through them.

POST/content-approval-flows
curl https://api.genuineai.app/api/v1/content-approval-flows \ --request POST \ --header 'Content-Type: application/json' \ --header 'X-Tenant-Id: <string>' \ --header 'X-Api-Key: <api-key>' \ --data '{ "states": [ { "si_label": "si_label" } ], "transitions": [ {} ], "sm_name": "sm_name", "sm_default": true }'
Example Request Body
{ "states": [ { "si_label": "si_label" } ], "transitions": [ {} ], "sm_name": "sm_name", "sm_default": true }
json
Example Responses
{ "sm_id": "00000000-0000-0000-0000-000000000000", "sm_active": true, "sm_created": "2024-08-25T15:00:00Z", "sm_updated": "2024-08-25T15:00:00Z", "sm_name": "sm_name", "sm_default": true, "sm_transitions": [ { "from": "00000000-0000-0000-0000-000000000000", "to": "00000000-0000-0000-0000-000000000000", "roles": [ "00000000-0000-0000-0000-000000000000" ], "users": [ "00000000-0000-0000-0000-000000000000" ], "label": "label", "back": true, "notify": true, "actions": [ "string" ] } ], "sm_metadata": {}, "states": [ { "si_id": "00000000-0000-0000-0000-000000000000", "si_label": "si_label", "si_color": "si_color", "si_order": 0, "si_initial": true, "si_final": true, "si_note": true, "si_roles": {}, "si_active": true } ] }
json
application/json

Get a flow

GET
https://api.genuineai.app/api/v1
/content-approval-flows/{id}

Returns the flow with its steps, each carrying who may move a page into it and whether doing so asks for a note.

Get a flow › path Parameters

id
​string · uuid · required

Get a flow › Headers

X-Tenant-Id
​string · uuid · required

The workspace this request acts in. Every row the API returns is isolated to it at the database layer by row-level security.

Get a flow › Responses

Success

The review steps a website page moves through before it can be published — what each step is called, and who may move a page into it.
ContentApprovalFlow
sm_id
​string · uuid
sm_active
​boolean
sm_created
​string · date-time
sm_updated
​string · date-time
sm_name
​string
sm_default
​boolean

The flow governing every site that has not chosen one of its own. At most one flow is the default.

​object[]

Retired for content flows: pages move by selecting a step directly, gated by the step's own si_roles.enter. Old definitions may still carry authored moves here; nothing reads them.

sm_metadata
​object
​object[]

The flow's steps, in the order pages move through them.

GET/content-approval-flows/{id}
curl https://api.genuineai.app/api/v1/content-approval-flows/:id \ --header 'X-Tenant-Id: <string>' \ --header 'X-Api-Key: <api-key>'
Example Responses
{ "sm_id": "00000000-0000-0000-0000-000000000000", "sm_active": true, "sm_created": "2024-08-25T15:00:00Z", "sm_updated": "2024-08-25T15:00:00Z", "sm_name": "sm_name", "sm_default": true, "sm_transitions": [ { "from": "00000000-0000-0000-0000-000000000000", "to": "00000000-0000-0000-0000-000000000000", "roles": [ "00000000-0000-0000-0000-000000000000" ], "users": [ "00000000-0000-0000-0000-000000000000" ], "label": "label", "back": true, "notify": true, "actions": [ "string" ] } ], "sm_metadata": {}, "states": [ { "si_id": "00000000-0000-0000-0000-000000000000", "si_label": "si_label", "si_color": "si_color", "si_order": 0, "si_initial": true, "si_final": true, "si_note": true, "si_roles": {}, "si_active": true } ] }
json
application/json

Update a flow

PUT
https://api.genuineai.app/api/v1
/content-approval-flows/{id}

Replaces the flow's steps, their gates included. Pages sitting in a step the new definition drops keep it until something moves them, so their history still reads correctly.

Update a flow › path Parameters

id
​string · uuid · required

Update a flow › Headers

X-Tenant-Id
​string · uuid · required

The workspace this request acts in. Every row the API returns is isolated to it at the database layer by row-level security.

Update a flow › Request Body

​object[] · required
​array
sm_name
​string
sm_default
​boolean

Update a flow › Responses

Success

The review steps a website page moves through before it can be published — what each step is called, and who may move a page into it.
ContentApprovalFlow
sm_id
​string · uuid
sm_active
​boolean
sm_created
​string · date-time
sm_updated
​string · date-time
sm_name
​string
sm_default
​boolean

The flow governing every site that has not chosen one of its own. At most one flow is the default.

​object[]

Retired for content flows: pages move by selecting a step directly, gated by the step's own si_roles.enter. Old definitions may still carry authored moves here; nothing reads them.

sm_metadata
​object
​object[]

The flow's steps, in the order pages move through them.

PUT/content-approval-flows/{id}
curl https://api.genuineai.app/api/v1/content-approval-flows/:id \ --request PUT \ --header 'Content-Type: application/json' \ --header 'X-Tenant-Id: <string>' \ --header 'X-Api-Key: <api-key>' \ --data '{ "states": [ { "si_label": "si_label" } ], "transitions": [ {} ], "sm_name": "sm_name", "sm_default": true }'
Example Request Body
{ "states": [ { "si_label": "si_label" } ], "transitions": [ {} ], "sm_name": "sm_name", "sm_default": true }
json
Example Responses
{ "sm_id": "00000000-0000-0000-0000-000000000000", "sm_active": true, "sm_created": "2024-08-25T15:00:00Z", "sm_updated": "2024-08-25T15:00:00Z", "sm_name": "sm_name", "sm_default": true, "sm_transitions": [ { "from": "00000000-0000-0000-0000-000000000000", "to": "00000000-0000-0000-0000-000000000000", "roles": [ "00000000-0000-0000-0000-000000000000" ], "users": [ "00000000-0000-0000-0000-000000000000" ], "label": "label", "back": true, "notify": true, "actions": [ "string" ] } ], "sm_metadata": {}, "states": [ { "si_id": "00000000-0000-0000-0000-000000000000", "si_label": "si_label", "si_color": "si_color", "si_order": 0, "si_initial": true, "si_final": true, "si_note": true, "si_roles": {}, "si_active": true } ] }
json
application/json

Delete a flow

DELETE
https://api.genuineai.app/api/v1
/content-approval-flows/{id}

Sites that chose this flow go back to the workspace default; sites governed by it as the default lose review, and approving a page there goes back to being a single step. Pages keep the step they are in.

Delete a flow › path Parameters

id
​string · uuid · required

Delete a flow › Headers

X-Tenant-Id
​string · uuid · required

The workspace this request acts in. Every row the API returns is isolated to it at the database layer by row-level security.

Delete a flow › Responses

Success. No content.

No data returned
DELETE/content-approval-flows/{id}
curl https://api.genuineai.app/api/v1/content-approval-flows/:id \ --request DELETE \ --header 'X-Tenant-Id: <string>' \ --header 'X-Api-Key: <api-key>'
Example Responses
No example specified for this content type

Content schemasCMS sync