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
Automation
Customer channels
Administration
    Users
    Roles
      List rolesgetCreate a rolepostGet a rolegetUpdate a rolepatchList role historyget
    Workspace settings
    Audit
    Storage
    Usage breakdown
    Media tag groups
    Media status flows
    Issued share links
    Social connections
    Social calendar
Schemas
GenuineAI API
GenuineAI API

Roles

Permission sets, who holds them, and every change made to one.


List roles

GET
https://api.genuineai.app/api/v1
/admin/roles

Returns the workspace's roles with the permissions each grants, plus role_users_count — how many active members currently hold it.

List roles › query Parameters

cursor
​string · maxLength: 512 · pattern: ^[A-Za-z0-9_-]+$
limit
​integer
offset
​integer · min: 0
role_active
​boolean
role_id
​string · uuid
role_managed_by
​string · uuid
role_name
​string
role_permissions
​array
sort
​string · minLength: 1 · maxLength: 64 · pattern: ^-?[a-z0-9_]+$

List roles › 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 roles › Responses

Success

​Role[] · required
has_more
​boolean · required

Whether more rows exist past this page.

next_cursor
​string | null · required

Pass back as cursor for the next page. Null on the last page.

GET/admin/roles
curl https://api.genuineai.app/api/v1/admin/roles \ --header 'X-Tenant-Id: <string>' \ --header 'X-Api-Key: <api-key>'
Example Responses
{ "data": [ { "role_id": "00000000-0000-0000-0000-000000000000", "role_name": "role_name", "role_description": "role_description", "role_icon": "role_icon", "role_permissions": "role_permissions", "role_managed_by": "role_managed_by", "role_active": true, "role_created": "2024-08-25T15:00:00Z", "role_users_count": 0 } ], "has_more": true, "next_cursor": "next_cursor" }
json
application/json

Create a role

POST
https://api.genuineai.app/api/v1
/admin/roles

A role is a set of permissions. What its holders can actually do is that set narrowed by the plan — granting a permission the plan does not include has no effect until the plan does.

Create a role › 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 role › Request Body

role_name
​string · minLength: 1 · required
role_active
​boolean · required
​array · required

Create a role › Responses

Created

A named set of permissions users can hold.
Role
role_id
​string · uuid
role_name
​string
role_description
​string
role_icon
​string
role_permissions
​string
role_managed_by
​string
role_active
​boolean
role_created
​string · date-time
role_users_count
​integer
POST/admin/roles
curl https://api.genuineai.app/api/v1/admin/roles \ --request POST \ --header 'Content-Type: application/json' \ --header 'X-Tenant-Id: <string>' \ --header 'X-Api-Key: <api-key>' \ --data '{ "role_name": "role_name", "role_active": true, "role_permissions": [ {} ] }'
Example Request Body
{ "role_name": "role_name", "role_active": true, "role_permissions": [ {} ] }
json
Example Responses
{ "role_id": "00000000-0000-0000-0000-000000000000", "role_name": "role_name", "role_description": "role_description", "role_icon": "role_icon", "role_permissions": "role_permissions", "role_managed_by": "role_managed_by", "role_active": true, "role_created": "2024-08-25T15:00:00Z", "role_users_count": 0 }
json
application/json

Get a role

GET
https://api.genuineai.app/api/v1
/admin/roles/{id}

Returns the role with the permissions it grants. What a member of it may actually do is that set narrowed by the workspace's plan.

Get a role › path Parameters

id
​string · uuid · required

Get a role › 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 role › Responses

Success

A named set of permissions users can hold.
Role
role_id
​string · uuid
role_name
​string
role_description
​string
role_icon
​string
role_permissions
​string
role_managed_by
​string
role_active
​boolean
role_created
​string · date-time
role_users_count
​integer
GET/admin/roles/{id}
curl https://api.genuineai.app/api/v1/admin/roles/:id \ --header 'X-Tenant-Id: <string>' \ --header 'X-Api-Key: <api-key>'
Example Responses
{ "role_id": "00000000-0000-0000-0000-000000000000", "role_name": "role_name", "role_description": "role_description", "role_icon": "role_icon", "role_permissions": "role_permissions", "role_managed_by": "role_managed_by", "role_active": true, "role_created": "2024-08-25T15:00:00Z", "role_users_count": 0 }
json
application/json

Update a role

PATCH
https://api.genuineai.app/api/v1
/admin/roles/{id}

Takes effect for everyone holding the role, on their next request.

Update a role › path Parameters

id
​string · uuid · required

Update a role › 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 role › Request Body optional

role_name
​string · minLength: 1
role_active
​boolean
​array

Update a role › Responses

Success

A named set of permissions users can hold.
Role
role_id
​string · uuid
role_name
​string
role_description
​string
role_icon
​string
role_permissions
​string
role_managed_by
​string
role_active
​boolean
role_created
​string · date-time
role_users_count
​integer
PATCH/admin/roles/{id}
curl https://api.genuineai.app/api/v1/admin/roles/:id \ --request PATCH \ --header 'Content-Type: application/json' \ --header 'X-Tenant-Id: <string>' \ --header 'X-Api-Key: <api-key>' \ --data '{ "role_name": "role_name", "role_active": true, "role_permissions": [ {} ] }'
Example Request Body
{ "role_name": "role_name", "role_active": true, "role_permissions": [ {} ] }
json
Example Responses
{ "role_id": "00000000-0000-0000-0000-000000000000", "role_name": "role_name", "role_description": "role_description", "role_icon": "role_icon", "role_permissions": "role_permissions", "role_managed_by": "role_managed_by", "role_active": true, "role_created": "2024-08-25T15:00:00Z", "role_users_count": 0 }
json
application/json

List role history

GET
https://api.genuineai.app/api/v1
/admin/roles/{id}/history

Every recorded change, newest first, each as a per-field {from, to} changeset.

List role history › path Parameters

id
​string · uuid · required

List role history › 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 role history › Responses

Success

​object[]
history_id
​string · uuid
history_timestamp
​string · date-time
history_user
​string | null · uuid
history_op
​string

The kind of change — insert, update or delete.

​object

One entry per field that changed, keyed by column name.

history_ref
​object

What the writer noted about the change rather than the columns: the action that made it, or the reason it was made.

GET/admin/roles/{id}/history
curl https://api.genuineai.app/api/v1/admin/roles/:id/history \ --header 'X-Tenant-Id: <string>' \ --header 'X-Api-Key: <api-key>'
Example Responses
[ { "history_id": "00000000-0000-0000-0000-000000000000", "history_timestamp": "2024-08-25T15:00:00Z", "history_user": "00000000-0000-0000-0000-000000000000", "history_op": "history_op", "history_changeset": { "key": { "from": {}, "to": {} } }, "history_ref": {} } ]
json
application/json

UsersWorkspace settings