Appearance
Endpoint reference
This reference is rendered from the project's OpenAPI 3.1 specification. It covers the currently implemented routes, including configuration-only query and field APIs. It is a development contract, not a promise that all roadmap features exist.
Use authentication and CSRF before sending requests from an API client. These pages intentionally have no live execution console.
Check session and initialize CSRF
GET /v1/auth/me
Returns user (null when anonymous), csrfToken, and current account capabilities/workspace. An initial request establishes the anonymous session.
Access: Anonymous or authenticated session
Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Sign in
POST /v1/auth/login
Normalizes email, checks the password, and rotates the session/CSRF token. Login is rate limited.
Access: Anonymous session with CSRF
CSRF: Send the session's X-CSRF-Token header.
Request body
Send the supported fields for the selected action. This is an initial contract; route-specific validation still applies.
{
"application/json": {
"schema": {
"type": "object",
"properties": {
"email": {
"type": "string",
"format": "email"
},
"password": {
"type": "string",
"maxLength": 1024
}
},
"required": [
"email",
"password"
],
"additionalProperties": false
}
}
}Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Register an account
POST /v1/auth/register
Creates a Member account with an unverified email and signs it in. Password must be at least 12 characters; no organization capability is automatically granted.
Access: Anonymous session with CSRF
CSRF: Send the session's X-CSRF-Token header.
Request body
Send the supported fields for the selected action. This is an initial contract; route-specific validation still applies.
{
"application/json": {
"schema": {
"type": "object",
"properties": {
"email": {
"type": "string",
"format": "email"
},
"password": {
"type": "string",
"minLength": 12,
"maxLength": 1024
},
"passwordConfirmation": {
"type": "string"
}
},
"required": [
"email",
"password",
"passwordConfirmation"
],
"additionalProperties": false
}
}
}Responses
- 200: Successful response.
- 201: Resource created.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Sign out
POST /v1/auth/logout
Destroys the server session and expires its cookie.
Access: Session with CSRF
CSRF: Send the session's X-CSRF-Token header.
Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Update account
POST /v1/account
Saves profile/theme. Email changes require currentPassword, clear verification, and rotate session/CSRF.
Access: Authenticated account
CSRF: Send the session's X-CSRF-Token header.
Request body
Send the supported fields for the selected action. This is an initial contract; route-specific validation still applies.
{
"application/json": {
"schema": {
"type": "object",
"properties": {
"displayName": {
"type": "string",
"maxLength": 100
},
"email": {
"type": "string",
"format": "email"
},
"theme": {
"type": "string",
"enum": [
"obsidian-lime",
"cobalt-coral",
"digital-teal",
"electric-indigo",
"main",
"main-dark",
"midnight-graphite"
]
},
"currentPassword": {
"type": "string"
}
},
"required": [
"displayName",
"email"
],
"additionalProperties": false
}
}
}Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Select account workspace
POST /v1/account/workspace
Changes navigation context; does not grant or impersonate privileges. Returns landingPage.
Access: Authenticated account with requested capability
CSRF: Send the session's X-CSRF-Token header.
Request body
Send the supported fields for the selected action. This is an initial contract; route-specific validation still applies.
{
"application/json": {
"schema": {
"type": "object",
"properties": {
"workspace": {
"type": "string",
"enum": [
"member",
"organization",
"platform"
]
}
},
"required": [
"workspace"
],
"additionalProperties": false
}
}
}Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Request Organization Admin upgrade
POST /v1/account/organization-access
Submits an account-type upgrade request. Approval grants creation access and the account-level organization workspace.
Access: Authenticated Member account
CSRF: Send the session's X-CSRF-Token header.
Request body
Send the supported fields for the selected action. This is an initial contract; route-specific validation still applies.
{
"application/json": {
"schema": {
"type": "object",
"properties": {
"action": {
"const": "request"
}
},
"required": [
"action"
],
"additionalProperties": false
}
}
}Responses
- 200: Successful response.
- 201: Resource created.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
List available organizations
GET /v1/organizations
Lists active unexpired organization memberships. Owned/joined filters remain account-scoped.
Access: Authenticated account
| Parameter | Location | Description |
|---|---|---|
page | query | Page number starting at 1; up to 50 items per page. |
scope | query | all: all memberships; owned: owned organizations; joined: other joined organizations. |
Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Create organization
POST /v1/organizations
Creates an organization owned by the signed-in account, active owner membership, and protected Admin UserType.
Access: Approved Organization Admin account type
CSRF: Send the session's X-CSRF-Token header.
Request body
Send the supported fields for the selected action. This is an initial contract; route-specific validation still applies.
{
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100
}
},
"required": [
"name"
],
"additionalProperties": false
}
}
}Responses
- 200: Successful response.
- 201: Resource created.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Read organization workspace
GET /v1/organizations/{organizationId}
Returns organization branding availability, assigned/active roles, adminPanel, effective management permissions, and accessPending. Pending members can read this shell only.
Access: Active, unexpired organization member
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Rename organization
POST /v1/organizations/{organizationId}
Changes the organization name; does not change ownership.
Access: Owner mode or Admin with settings.manage
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
Request body
Send the supported fields for the selected action. This is an initial contract; route-specific validation still applies.
{
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100
}
},
"required": [
"name"
],
"additionalProperties": false
}
}
}Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Read logo
GET /v1/organizations/{organizationId}/logo
Returns image bytes or 404 if no logo is configured.
Access: Active, unexpired member with an assigned role
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
Responses
- 200: Organization logo bytes.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Upload logo
POST /v1/organizations/{organizationId}/logo
Accepts PNG/JPEG/WebP, at most 2 MB and 4096 × 4096 pixels.
Access: Owner mode or Admin with settings.manage
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
Request body
Multipart image upload. Do not send application/json.
{
"multipart/form-data": {
"schema": {
"type": "object",
"properties": {
"logo": {
"type": "string",
"format": "binary"
}
},
"required": [
"logo"
]
}
}
}Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Read mobile-logo
GET /v1/organizations/{organizationId}/mobile-logo
Returns image bytes or 404 if no logo is configured.
Access: Active, unexpired member with an assigned role
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
Responses
- 200: Organization logo bytes.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Upload mobile-logo
POST /v1/organizations/{organizationId}/mobile-logo
Accepts PNG/JPEG/WebP, at most 2 MB and 4096 × 4096 pixels.
Access: Owner mode or Admin with settings.manage
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
Request body
Multipart image upload. Do not send application/json.
{
"multipart/form-data": {
"schema": {
"type": "object",
"properties": {
"logo": {
"type": "string",
"format": "binary"
}
},
"required": [
"logo"
]
}
}
}Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Select organization role
POST /v1/organizations/{organizationId}/active-role
Chooses Owner, Admin, or an assigned UserType by its actual ID. Only Owner is a literal system role value.
Access: Active, unexpired member assigned the requested role
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
Request body
Send the supported fields for the selected action. This is an initial contract; route-specific validation still applies.
{
"application/json": {
"schema": {
"type": "object",
"properties": {
"role": {
"type": "string"
}
},
"required": [
"role"
],
"additionalProperties": false
}
}
}Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
List organization people
GET /v1/organizations/{organizationId}/people
Includes access state, expiry date, expiry revision, and protected-owner metadata.
Access: Owner mode or Admin with people.manage
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
page | query | Page number starting at 1; up to 100 items per page. |
Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Add existing account
POST /v1/organizations/{organizationId}/people
Adds a registered account without verifying its email. Readdition of removed membership clears old role/grant assignments; it does not clear access expiry.
Access: Owner mode or Admin with people.manage
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
Request body
Send the supported fields for the selected action. This is an initial contract; route-specific validation still applies.
{
"application/json": {
"schema": {
"type": "object",
"properties": {
"email": {
"type": "string",
"format": "email"
}
},
"required": [
"email"
],
"additionalProperties": false
}
}
}Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
List invitations
GET /v1/organizations/{organizationId}/invitations
Returns invitation status/delivery metadata without tokens. Tokens are retrieved only by the explicit Copy action.
Access: Owner mode or Admin with people.manage
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
page | query | Page number starting at 1; up to 100 items per page. |
Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Manage invitations
POST /v1/organizations/{organizationId}/invitations
Create uses email. Other actions use id. Links expire after 72 hours; Renew rotates the token; Send uses configured shared Brevo delivery.
Access: Owner mode or Admin with people.manage
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
Request body
Send the supported fields for the selected action. This is an initial contract; route-specific validation still applies.
{
"application/json": {
"schema": {
"type": "object",
"properties": {
"email": {
"type": "string",
"format": "email"
},
"action": {
"type": "string",
"enum": [
"create",
"copy",
"send",
"renew",
"revoke"
]
},
"id": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
}
},
"required": [],
"additionalProperties": false
}
}
}Responses
- 200: Successful response.
- 201: Resource created.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Inspect invitation
POST /v1/invitations/inspect
Reads a token supplied in JSON. Acceptance creates membership without automatically assigning UserTypes; the token is never a query-string parameter.
Access: Anonymous session with CSRF
CSRF: Send the session's X-CSRF-Token header.
Request body
Send the supported fields for the selected action. This is an initial contract; route-specific validation still applies.
{
"application/json": {
"schema": {
"type": "object",
"properties": {
"token": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
"required": [
"token"
],
"additionalProperties": false
}
}
}Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Accept invitation
POST /v1/invitations/accept
Reads a token supplied in JSON. Acceptance creates membership without automatically assigning UserTypes; the token is never a query-string parameter.
Access: Authenticated account matching invited email
CSRF: Send the session's X-CSRF-Token header.
Request body
Send the supported fields for the selected action. This is an initial contract; route-specific validation still applies.
{
"application/json": {
"schema": {
"type": "object",
"properties": {
"token": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
"required": [
"token"
],
"additionalProperties": false
}
}
}Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
List role assignments
GET /v1/organizations/{organizationId}/memberships
Returns active memberships with assigned UserType IDs and privilege-management metadata.
Access: Owner mode or Admin with roles.manage
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
page | query | Page number starting at 1; up to 100 items per page. |
Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Assign UserTypes or remove membership
POST /v1/organizations/{organizationId}/memberships
Assignment replaces userTypeIds for an existing active member. Remove uses action and membershipId. Only owners change privileged memberships or assign Admin/permission-bearing groups.
Access: Owner mode; roles.manage permits ordinary memberships only
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
Request body
Send the supported fields for the selected action. This is an initial contract; route-specific validation still applies.
{
"application/json": {
"schema": {
"type": "object",
"properties": {
"email": {
"type": "string",
"format": "email"
},
"userTypeIds": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"uniqueItems": true
},
"action": {
"const": "remove"
},
"membershipId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
}
},
"required": [],
"additionalProperties": false
}
}
}Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Set membership access expiry
POST /v1/organizations/{organizationId}/membership-access
expiresAt null means Never; an explicit timezone is required otherwise. Owner is protected. Retains content/roles and blocks expired organization requests.
Access: Owner mode
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
Request body
Send the supported fields for the selected action. This is an initial contract; route-specific validation still applies.
{
"application/json": {
"schema": {
"type": "object",
"properties": {
"membershipId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"expiresAt": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"revision": {
"type": "integer",
"minimum": 0
}
},
"required": [
"membershipId",
"expiresAt",
"revision"
],
"additionalProperties": false
}
}
}Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Read administration permissions
GET /v1/organizations/{organizationId}/permissions
Returns permission catalog, UserType policies, and paginated member grants/revisions.
Access: Owner mode
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
page | query | Page number starting at 1; up to 100 items per page. |
Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Set group or individual grants
POST /v1/organizations/{organizationId}/permissions
Replaces a UserType permission list or member additional grants using revision checks. Owner full access cannot be modified.
Access: Owner mode
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
Request body
Send the supported fields for the selected action. This is an initial contract; route-specific validation still applies.
{
"application/json": {
"schema": {
"type": "object",
"properties": {
"target": {
"type": "string",
"enum": [
"userType",
"member"
]
},
"id": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"permissions": {
"type": "array",
"items": {
"type": "string",
"enum": [
"people.manage",
"roles.manage",
"user-types.manage",
"object-types.manage",
"relationships.manage",
"queries.manage",
"settings.manage"
]
}
},
"revision": {
"type": "integer",
"minimum": 0
}
},
"required": [
"target",
"id",
"permissions",
"revision"
],
"additionalProperties": false
}
}
}Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
List UserType definitions
GET /v1/organizations/{organizationId}/user-types
Returns active UserTypes, protected Admin metadata, assignment eligibility, and optional profile ObjectType links.
Access: Owner mode or authorized Admin needing definition/role choices
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Manage UserType definitions
POST /v1/organizations/{organizationId}/user-types
Name/key define ordinary types. Edit uses id; delete uses action remove and id. Admin definition is protected. Creating a linked ObjectType also requires object-types.manage.
Access: Owner mode or Admin with user-types.manage
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
Request body
Send the supported fields for the selected action. This is an initial contract; route-specific validation still applies.
{
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"key": {
"type": "string"
},
"id": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"action": {
"const": "remove"
},
"profileObjectTypeId": {
"type": [
"string",
"null"
]
},
"createProfileObjectType": {
"type": "boolean"
}
},
"required": [],
"additionalProperties": false
}
}
}Responses
- 200: Successful response.
- 201: Resource created.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
List ObjectType definitions
GET /v1/organizations/{organizationId}/object-types
Returns active ObjectType names, keys, and versions.
Access: Owner mode or authorized Admin needing ObjectType choices
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Manage ObjectTypes
POST /v1/organizations/{organizationId}/object-types
Create/rename definitions or retire unused types. Fields, records, UserType links, relationships, and queries protect deletion.
Access: Owner mode or Admin with object-types.manage
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
Request body
Send the supported fields for the selected action. This is an initial contract; route-specific validation still applies.
{
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"key": {
"type": "string"
},
"id": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"action": {
"const": "remove"
}
},
"required": [],
"additionalProperties": false
}
}
}Responses
- 200: Successful response.
- 201: Resource created.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Read Fields & Schema
GET /v1/organizations/{organizationId}/object-types/{objectTypeId}/fields
Returns active typed fields, supported kinds, derived field IDs, and minimal query-backed option mapping choices.
Access: Owner mode or Admin with object-types.manage
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
objectTypeId | path | ObjectType ID. |
Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Manage DynamicFields
POST /v1/organizations/{organizationId}/object-types/{objectTypeId}/fields
Create/update field definitions with version checks; retire uses action remove. Keys/types are fixed; existing records block structural edits. Query option references are configuration only.
Access: Owner mode or Admin with object-types.manage
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
objectTypeId | path | ObjectType ID. |
Request body
Send the supported fields for the selected action. This is an initial contract; route-specific validation still applies.
{
"application/json": {
"schema": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"version": {
"type": "integer",
"minimum": 0
},
"action": {
"type": "string",
"enum": [
"save",
"remove"
]
},
"key": {
"type": "string"
},
"label": {
"type": "string"
},
"helpText": {
"type": "string"
},
"kind": {
"type": "string",
"enum": [
"text",
"textarea",
"number",
"boolean",
"date",
"datetime",
"select",
"multiselect"
]
},
"required": {
"type": "boolean"
},
"defaultValue": {},
"options": {
"type": "array",
"items": {
"type": "object",
"properties": {
"value": {
"type": "string"
},
"label": {
"type": "string"
}
},
"required": [
"value",
"label"
],
"additionalProperties": false
}
},
"validation": {
"type": "object",
"properties": {
"min": {
"type": "number"
},
"max": {
"type": "number"
},
"maxLength": {
"type": "integer",
"minimum": 1,
"maximum": 10000
}
},
"additionalProperties": false
},
"optionsSource": {
"type": "string",
"enum": [
"static",
"query"
]
},
"optionsQuery": {
"type": [
"object",
"null"
],
"properties": {
"queryId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"labelFieldId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"valueFieldId": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": false
}
},
"required": [],
"additionalProperties": false
}
}
}Responses
- 200: Successful response.
- 201: Resource created.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
List DynamicQuery configurations
GET /v1/organizations/{organizationId}/queries
Returns query definitions and typed source/projection/filter metadata. executable is false; no result records are returned. Saved queries now support authorized execution; executable is derived capability, not an input grant.
Access: Owner mode or Admin with queries.manage
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Manage DynamicQuery configurations
POST /v1/organizations/{organizationId}/queries
Saves an allowlisted AST with stable source field IDs and typed values. Filters are bounded to five nested levels and 50 nodes; no raw MongoDB operators/code. References protect mapped outputs/deletion. Execution remains unavailable. Saved queries now support authorized execution; executable is derived capability, not an input grant.
Access: Owner mode or Admin with queries.manage
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
Request body
Send the supported fields for the selected action. This is an initial contract; route-specific validation still applies.
{
"application/json": {
"schema": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"version": {
"type": "integer",
"minimum": 0
},
"action": {
"type": "string",
"enum": [
"save",
"remove"
]
},
"name": {
"type": "string"
},
"key": {
"type": "string"
},
"objectTypeId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"projectionFieldIds": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"uniqueItems": true
},
"filterTree": {
"type": "object",
"additionalProperties": true
}
},
"required": [],
"additionalProperties": false
}
}
}Responses
- 200: Successful response.
- 201: Resource created.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
List object relationships
GET /v1/organizations/{organizationId}/object-relationships
Returns organization-scoped relationship definitions; record edges/traversal remain planned.
Access: Owner mode or Admin with relationships.manage
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Manage object relationships
POST /v1/organizations/{organizationId}/object-relationships
Create/edit/retire typed relationship definitions. Existing edges protect structural changes/deletion.
Access: Owner mode or Admin with relationships.manage
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
Request body
Send the supported fields for the selected action. This is an initial contract; route-specific validation still applies.
{
"application/json": {
"schema": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"action": {
"const": "remove"
},
"name": {
"type": "string"
},
"key": {
"type": "string"
},
"sourceTypeId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"targetTypeId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"sourceCardinality": {
"enum": [
"one",
"many"
]
},
"targetCardinality": {
"enum": [
"one",
"many"
]
},
"onDelete": {
"enum": [
"restrict",
"detach"
]
}
},
"required": [],
"additionalProperties": false
}
}
}Responses
- 200: Successful response.
- 201: Resource created.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Inspect legacy UserType inheritance
GET /v1/organizations/{organizationId}/inheritance
Compatibility configuration only. Inheritance data is preserved; inherited permissions are not executed.
Access: Owner mode
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Configure legacy UserType inheritance
POST /v1/organizations/{organizationId}/inheritance
Compatibility endpoint. Validates same-organization references and acyclic hierarchy; no inherited policy execution.
Access: Owner mode
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
Request body
Send the supported fields for the selected action. This is an initial contract; route-specific validation still applies.
{
"application/json": {
"schema": {
"type": "object",
"properties": {
"parentIds": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"uniqueItems": true
},
"id": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"action": {
"type": "string",
"enum": [
"remove"
]
}
},
"required": [
"id"
],
"additionalProperties": false
}
}
}Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Platform organization directory
GET /v1/platform/organizations
Read-only names/IDs/status. Does not grant tenant membership or data access.
Access: Active explicit Platform Admin
| Parameter | Location | Description |
|---|---|---|
page | query | Page number starting at 1; up to 100 items per page. |
Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
List account upgrade requests
GET /v1/platform/organization-requests
Account metadata and Organization Admin request status; no credentials.
Access: Active explicit Platform Admin
| Parameter | Location | Description |
|---|---|---|
page | query | Page number starting at 1; up to 50 items per page. |
Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Review account upgrade
POST /v1/platform/organization-requests
Approve/reject a matching pending request or revoke matching approved access. Stale request identity/status returns 409.
Access: Active explicit Platform Admin
CSRF: Send the session's X-CSRF-Token header.
Request body
Send the supported fields for the selected action. This is an initial contract; route-specific validation still applies.
{
"application/json": {
"schema": {
"type": "object",
"properties": {
"action": {
"enum": [
"approve",
"reject",
"revoke"
]
},
"userId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"requestId": {
"type": "string",
"pattern": "^[a-f0-9]{32}$"
}
},
"required": [
"action",
"userId",
"requestId"
],
"additionalProperties": false
}
}
}Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Read email delivery configuration
GET /v1/platform/email-settings
Returns sender/delivery settings, revision, credential-configured boolean, and audit history. Never returns API keys.
Access: Active explicit Platform Admin
Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Update email delivery configuration
POST /v1/platform/email-settings
Saves encrypted shared settings with revision/audit. Blank key preserves; clearApiKey removes. Does not send a test email.
Access: Active explicit Platform Admin with password confirmation
CSRF: Send the session's X-CSRF-Token header.
Request body
Send the supported fields for the selected action. This is an initial contract; route-specific validation still applies.
{
"application/json": {
"schema": {
"type": "object",
"properties": {
"enabled": {
"type": "boolean"
},
"senderName": {
"type": "string"
},
"senderEmail": {
"type": "string",
"format": "email"
},
"apiKey": {
"type": "string",
"writeOnly": true
},
"clearApiKey": {
"type": "boolean"
},
"password": {
"type": "string",
"writeOnly": true
},
"revision": {
"type": "integer",
"minimum": 0
}
},
"required": [
"enabled",
"senderName",
"senderEmail",
"password",
"revision"
],
"additionalProperties": false
}
}
}Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Read selected-role data permission policies
GET /v1/organizations/{organizationId}/data-permissions
Owner-only selected-role ObjectType/field policies. Record APIs enforce these policies; saved query execution remains disabled. Optional recordScope selects all records (default) or one direct relationship to an owner-bound member profile. Related-only policies cannot grant create. Missing identities and unrelated rows fail closed. GET also returns profile ObjectType IDs and relationship choices.
Access: Owner mode
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
page | query | Page number starting at 1; up to 100 items per page. |
Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
Save selected-role data permission policies
POST /v1/organizations/{organizationId}/data-permissions
Owner-only selected-role ObjectType/field policies. Record APIs enforce these policies; saved query execution remains disabled. Optional recordScope selects all records (default) or one direct relationship to an owner-bound member profile. Related-only policies cannot grant create. Missing identities and unrelated rows fail closed. GET also returns profile ObjectType IDs and relationship choices.
Access: Owner mode
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | Organization ID. |
Request body
{
"application/json": {
"schema": {
"type": "object",
"additionalProperties": false,
"required": [
"userTypeId",
"objectTypeId",
"revision",
"operations",
"readFieldIds",
"createFieldIds",
"updateFieldIds"
],
"properties": {
"userTypeId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"objectTypeId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"revision": {
"type": "integer",
"minimum": 0
},
"operations": {
"type": "array",
"maxItems": 4,
"items": {
"type": "string",
"enum": [
"read",
"create",
"update",
"delete"
]
}
},
"readFieldIds": {
"type": "array",
"maxItems": 500,
"items": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
}
},
"createFieldIds": {
"type": "array",
"maxItems": 500,
"items": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
}
},
"updateFieldIds": {
"type": "array",
"maxItems": 500,
"items": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
}
},
"recordScope": {
"oneOf": [
{
"type": "object",
"additionalProperties": false,
"required": [
"mode"
],
"properties": {
"mode": {
"const": "all"
}
}
},
{
"type": "object",
"additionalProperties": false,
"required": [
"mode",
"relationshipId",
"recordSide"
],
"properties": {
"mode": {
"const": "related"
},
"relationshipId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"recordSide": {
"enum": [
"source",
"target"
]
}
}
},
{
"type": "object",
"additionalProperties": false,
"required": [
"mode"
],
"properties": {
"mode": {
"const": "profile"
}
},
"description": "Only the signed-in member profile record; requires matching profile ObjectType and an explicit identity binding. Create is denied."
}
]
},
"relationshipWriteIds": {
"type": "array",
"maxItems": 100,
"uniqueItems": true,
"items": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"description": "Connected relationships that declared group selectors may replace. Requires ObjectType Update. Default empty; does not grant generic edge administration."
}
}
}
}
}Responses
- 200: Successful response.
- 401: Authentication required or invalid credentials.
- 403: Origin, CSRF, permissions, pending access, or membership expiry denial.
- 404: Resource not found or inaccessible.
- 409: Duplicate, protected dependency, stale revision, or incompatible schema change.
- 422: Invalid input.
- 429: Too many attempts.
- 503: Service temporarily unavailable.
List authorized records
GET /v1/organizations/{organizationId}/objects
Returns objects, hasMore, nextCursor. Stable ascending ObjectId pagination, no total count. Relationship row constraints apply before pagination, maximum execution time 2 seconds. Only readable fields are returned.
Access: Active member; selected-role operation, row, and field access
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
objectTypeId | query | |
limit | query | |
after | query |
Responses
- 200: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Create a record
POST /v1/organizations/{organizationId}/objects
Applies strict schema validation and defaults, freezes the aggregate ObjectType schema at version 1, and returns object with schemaVersion/revision. Related-only roles cannot create. JSON 256 KiB, values 128 KiB. Saved query-backed non-null option values are unavailable.
Access: Active member; selected-role operation, row, and field access
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
X-CSRF-Token | header |
Request body
{
"application/json": {
"schema": {
"type": "object",
"additionalProperties": false,
"required": [
"objectTypeId",
"data"
],
"properties": {
"objectTypeId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"data": {
"type": "object",
"description": "Immutable field keys with strictly typed schema values. Unknown or unauthorized fields are rejected."
},
"action": {
"const": "create"
}
}
}
}
}Responses
- 201: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Read an authorized record
GET /v1/organizations/{organizationId}/objects/{objectId}
Returns object with id, objectTypeId, schemaVersion, revision, and readable data. Unrelated records return 404.
Access: Active member; selected-role operation, row, and field access
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
objectId | path |
Responses
- 200: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Update or soft-delete a record
POST /v1/organizations/{organizationId}/objects/{objectId}
Partial update merges submitted fields, validates the full frozen schema, and increments revision. Delete retires the record and detachable connections; restrict connections block deletion. Hidden fields never appear in write responses. Histories are atomic per document and bounded to 100 events.
Access: Active member; selected-role operation, row, and field access
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
objectId | path | |
X-CSRF-Token | header |
Request body
{
"application/json": {
"schema": {
"oneOf": [
{
"type": "object",
"additionalProperties": false,
"required": [
"revision",
"data"
],
"properties": {
"revision": {
"type": "integer",
"minimum": 1
},
"action": {
"const": "update"
},
"data": {
"type": "object",
"description": "Immutable field keys with strictly typed schema values. Unknown or unauthorized fields are rejected."
}
}
},
{
"type": "object",
"additionalProperties": false,
"required": [
"revision",
"action"
],
"properties": {
"revision": {
"type": "integer",
"minimum": 1
},
"action": {
"const": "delete"
}
}
}
]
}
}
}Responses
- 200: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
List record connections
GET /v1/organizations/{organizationId}/object-relationships/{relationshipId}/edges
Owner-only. Returns edges (id, endpoints, status, revision), hasMore, nextCursor. includeRetired=1 exposes retired-pair revisions for relinking.
Access: Owner mode
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
relationshipId | path | |
objectId | query | |
includeRetired | query | |
limit | query | |
after | query |
Responses
- 200: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Link or unlink records
POST /v1/organizations/{organizationId}/object-relationships/{relationshipId}/edges
Owner-only. Both endpoints must match the relationship types and tenant. Source cardinality means sources per target; target cardinality means targets per source. Revision 0 creates a new pair. Relinking uses its latest revision. Unlink permits retired endpoints for interrupted-detach repair.
Access: Owner mode
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
relationshipId | path | |
X-CSRF-Token | header |
Request body
{
"application/json": {
"schema": {
"type": "object",
"additionalProperties": false,
"required": [
"sourceObjectId",
"targetObjectId",
"revision"
],
"properties": {
"sourceObjectId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"targetObjectId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"revision": {
"type": "integer",
"minimum": 0
},
"action": {
"enum": [
"link",
"unlink"
],
"default": "link"
}
}
}
}
}Responses
- 200: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Inspect member profile bindings
GET /v1/organizations/{organizationId}/record-identities
Owner-only. Returns identities for the specified account, including cleared bindings and their revisions. At most 500 bindings.
Access: Owner mode
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
userId | query |
Responses
- 200: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Bind or clear member profile
POST /v1/organizations/{organizationId}/record-identities
Owner-only. Explicitly associates an active, unexpired member with an active profile record. One binding per account/ObjectType and one active account per profile record. Null objectId clears. Use revision 0 for a new binding.
Access: Owner mode
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
X-CSRF-Token | header |
Request body
{
"application/json": {
"schema": {
"type": "object",
"additionalProperties": false,
"required": [
"userId",
"objectTypeId",
"objectId",
"revision"
],
"properties": {
"userId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"objectTypeId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"objectId": {
"oneOf": [
{
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
{
"type": "null"
}
]
},
"revision": {
"type": "integer",
"minimum": 0
}
}
}
}
}Responses
- 200: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Execute an authorized saved query
POST /v1/organizations/{organizationId}/queries/{queryId}/execute
Revalidates typed literal AST, source/schema, filter-field readability, selected-role row/field access. Returns objects, readable fields, query ID/version, hasMore, nextCursor; no count. Maximum 100 rows, 2-second aggregates, no disk spill. Optional scalar output sorting has ID tie-breakers. Cursor binds query/version/sort and resolves sorted anchors under current access; removed anchors require refresh. Unsupported parameters/raw filters/operators are rejected. Query management alone grants no data access.
Access: Active membership and selected-role data/group authorization
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
queryId | path | |
X-CSRF-Token | header |
Request body
{
"application/json": {
"schema": {
"type": "object",
"additionalProperties": false,
"properties": {
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50
},
"after": {
"type": "string",
"maxLength": 2048
},
"sortFieldId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"sortDirection": {
"enum": [
"asc",
"desc"
],
"default": "asc"
}
}
}
}
}Responses
- 200: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
List authorized groups or owner configuration catalog
GET /v1/organizations/{organizationId}/groups
Default lists role-visible groups with readable source/output/filter fields. manage=1 is Owner-only and returns definitions plus query, field, and UserType choices. Maximum 200 active groups. Member runtime access requires an authorized View placement (viewId, placementKey, viewVersion); standalone Group preview is Owner-only. Member collection listings return no standalone Groups.
Access: Active membership and selected-role data/group authorization
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
manage | query |
Responses
- 200: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Create, update, or retire a group
POST /v1/organizations/{organizationId}/groups
Owner-only. Save requires name/key/queryId/renderer/ordered fieldIds/createFieldIds/editableFieldIds/operations/userTypeIds; update also requires id/version. Remove uses id/version/action=remove. Read is mandatory; writable fields are visible subsets of query output. Keys stay reserved after retirement. Group settings narrow underlying data permissions. Versions and bounded atomic history protect changes; query/field/view dependencies are checked. Contextual groups accept bindingModel instead of mandatory query/field lists. Explicit fields/relationship write targets, per-UserType rules, required/optional contexts and source scopes are validated. Existing query-backed groups remain compatible; conversion is explicit. Optional icon selects a SourceIcon. View placement icon defaults to inheritance when absent/null; empty string hides it and a listed icon overrides it. Member runtime access requires an authorized View placement (viewId, placementKey, viewVersion); standalone Group preview is Owner-only. Member collection listings return no standalone Groups. Contextual Groups support renderer=sheet, sheetFormats, defaultSort and Group-owned navigationButtons/actionButtons/linkButtons. View inheritance can only narrow Group button grants.
Access: Owner mode
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
X-CSRF-Token | header |
Request body
{
"application/json": {
"schema": {
"oneOf": [
{
"type": "object",
"additionalProperties": false,
"required": [
"name",
"key",
"renderer",
"bindingModel"
],
"properties": {
"id": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"version": {
"type": "integer",
"minimum": 1
},
"name": {
"type": "string",
"maxLength": 100
},
"key": {
"type": "string",
"pattern": "^[a-z][a-z0-9-]{0,63}$"
},
"renderer": {
"type": "string",
"enum": [
"table",
"form",
"sheet"
],
"description": "Sheet renderer requires contextual bindings."
},
"bindingModel": {
"$ref": "#/components/schemas/ContextBindingModel"
},
"icon": {
"$ref": "#/components/schemas/SourceIcon"
},
"sheetFormats": {
"type": "object",
"additionalProperties": {
"type": "string",
"enum": [
"auto",
"text",
"number",
"currency",
"percent",
"date"
]
},
"description": "Presentation-only format keyed by binding. Percentage values are fractions."
},
"navigationButtons": {
"type": "array",
"maxItems": 10,
"items": {
"type": "object"
},
"description": "Group-owned buttons inherited by View placements; see custom Group buttons guide for mappings and restrictions."
},
"actionButtons": {
"type": "array",
"maxItems": 10,
"items": {
"type": "object"
},
"description": "Group-owned buttons inherited by View placements; see custom Group buttons guide for mappings and restrictions."
},
"linkButtons": {
"type": "array",
"maxItems": 10,
"items": {
"type": "object"
},
"description": "Group-owned buttons inherited by View placements; see custom Group buttons guide for mappings and restrictions."
},
"description": {
"type": "string",
"description": "Plain-text summary, at most 4000 UTF-8 bytes."
},
"defaultSort": {
"type": "object",
"properties": {
"mode": {
"enum": [
"recordId",
"column",
"updatedAt"
]
},
"column": {
"type": "string"
},
"direction": {
"enum": [
"asc",
"desc"
]
}
},
"required": [
"mode"
],
"additionalProperties": false
}
}
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"id": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"version": {
"type": "integer",
"minimum": 1
},
"action": {
"enum": [
"save",
"remove"
],
"default": "save"
},
"name": {
"type": "string",
"maxLength": 100
},
"key": {
"type": "string",
"pattern": "^[a-z][a-z0-9-]{0,63}$"
},
"queryId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"renderer": {
"enum": [
"table",
"form"
]
},
"fieldIds": {
"type": "array",
"maxItems": 100,
"uniqueItems": true,
"items": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
}
},
"createFieldIds": {
"type": "array",
"maxItems": 100,
"uniqueItems": true,
"items": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
}
},
"editableFieldIds": {
"type": "array",
"maxItems": 100,
"uniqueItems": true,
"items": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
}
},
"userTypeIds": {
"type": "array",
"maxItems": 100,
"uniqueItems": true,
"items": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
}
},
"operations": {
"type": "array",
"uniqueItems": true,
"items": {
"enum": [
"read",
"create",
"update",
"delete"
]
}
},
"icon": {
"$ref": "#/components/schemas/SourceIcon"
},
"description": {
"type": "string",
"description": "Plain-text summary, at most 4000 UTF-8 bytes."
},
"defaultSort": {
"type": "object",
"properties": {
"mode": {
"enum": [
"recordId",
"column",
"updatedAt"
]
},
"column": {
"type": "string"
},
"direction": {
"enum": [
"asc",
"desc"
]
}
},
"required": [
"mode"
],
"additionalProperties": false
}
}
}
]
}
}
}Responses
- 200: Successful response.
- 201: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Get authorized table/form metadata
GET /v1/organizations/{organizationId}/groups/{groupId}
Returns group ID/name/renderer/version, objectTypeId, query ID/version, intersected operations, and ordered readable fields with canCreate/canUpdate flags and permitted defaults. Owner bypasses visibility but not group restrictions. Contextual groups require their declared inputs and optionally accept viewId/placementKey/viewVersion. Their row responses contain rows/values/cells and per-cell destination revisions; they accept limit 1–50 and an ObjectId after cursor. Contextual groups do not accept scalar sort parameters. Member runtime access requires an authorized View placement (viewId, placementKey, viewVersion); standalone Group preview is Owner-only. Member collection listings return no standalone Groups.
Access: Active membership and selected-role data/group authorization
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
groupId | path | |
contexts | query | |
viewId | query | |
placementKey | query | |
viewVersion | query |
Responses
- 200: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Run the group query with narrowing access
GET /v1/organizations/{organizationId}/groups/{groupId}/rows
Returns the same page contract as query execution; role visibility, group projection, data/field/related-row policies apply. Request parameters bind to group and query versions. Contextual groups require their declared inputs and optionally accept viewId/placementKey/viewVersion. Their row responses contain rows/values/cells and per-cell destination revisions; they accept limit 1–50 and an ObjectId after cursor. Contextual groups do not accept scalar sort parameters. Summary mode returns authorized aggregates, scopeLabel and read-only drill-down; summary pagination uses 64-character bucket IDs. Member runtime access requires an authorized View placement (viewId, placementKey, viewVersion); standalone Group preview is Owner-only. Member collection listings return no standalone Groups. Contextual search and filters apply before pagination and intersect permissions. Configured defaultSort applies across pages. Contextual row pages default to 25 and allow up to 50; legacy query-only pages default to 50 and allow up to 100.
Access: Active membership and selected-role data/group authorization
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
groupId | path | |
limit | query | |
after | query | |
sortFieldId | query | |
sortDirection | query | |
contexts | query | |
viewId | query | |
placementKey | query | |
viewVersion | query | |
bucket | query | Returned summary bucket ID for read-only source drill-down. |
search | query | Contextual groups with search enabled; authorized dataset search before pagination. |
filters | query | URL-encoded JSON array of {key,logic:all|any,conditions:[{op,value,upper?}]}. Up to twenty readable columns, three conditions each; columns combine with AND. Requires filtering enabled; unavailable for summary results. |
Responses
- 200: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Create a record through an editable group
POST /v1/organizations/{organizationId}/groups/{groupId}/objects
Intersects group and data grants, validates fields/schema/defaults, and requires the new record to satisfy the saved query. Related-only creation is denied. Stale group/query versions return 409; field errors map to error.fields. Contextual groups support explicit anchor create/delete grants with groupVersion, contexts and optional viewId/placementKey/viewVersion. Creation requires a direct records source and no active scope. Summary groups reject writes. Member runtime access requires an authorized View placement (viewId, placementKey, viewVersion); standalone Group preview is Owner-only. Member collection listings return no standalone Groups.
Access: Active membership and selected-role data/group authorization
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
groupId | path | |
X-CSRF-Token | header |
Request body
{
"application/json": {
"schema": {
"type": "object",
"additionalProperties": false,
"required": [
"objectTypeId",
"data",
"groupVersion",
"queryVersion"
],
"properties": {
"objectTypeId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"data": {
"type": "object",
"description": "Immutable field keys and strict schema values."
},
"groupVersion": {
"type": "integer",
"minimum": 1
},
"queryVersion": {
"type": "integer",
"minimum": 1
}
}
}
}
}Responses
- 201: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Update or delete a record through a group
POST /v1/organizations/{organizationId}/groups/{groupId}/objects/{objectId}
Existing record must satisfy current group query and role row policy. Group operations/fields narrow underlying grants. Updates may move records out of the query. Record/group/query revisions are checked; normal relationship deletion rules apply. Contextual groups support explicit anchor create/delete grants with groupVersion, contexts and optional viewId/placementKey/viewVersion. Creation requires a direct records source and no active scope. Summary groups reject writes. Member runtime access requires an authorized View placement (viewId, placementKey, viewVersion); standalone Group preview is Owner-only. Member collection listings return no standalone Groups.
Access: Active membership and selected-role data/group authorization
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
groupId | path | |
objectId | path | |
X-CSRF-Token | header |
Request body
{
"application/json": {
"schema": {
"type": "object",
"additionalProperties": false,
"required": [
"revision",
"groupVersion",
"queryVersion"
],
"properties": {
"revision": {
"type": "integer",
"minimum": 1
},
"action": {
"enum": [
"update",
"delete"
],
"default": "update"
},
"data": {
"type": "object",
"description": "Immutable field keys and strict schema values."
},
"groupVersion": {
"type": "integer",
"minimum": 1
},
"queryVersion": {
"type": "integer",
"minimum": 1
}
}
}
}
}Responses
- 200: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Get live relationship choices
GET /v1/organizations/{organizationId}/groups/{groupId}/bindings/{bindingKey}/options
Requires an editable declared relationship binding, parent update and explicit relationship-write grant. Runs the configured query with current target read/row/field access. Returns options, pagination, and queryVersion; no arbitrary source query is accepted. Member runtime access requires an authorized View placement (viewId, placementKey, viewVersion); standalone Group preview is Owner-only. Member collection listings return no standalone Groups.
Access: Selected-role data, binding, context, and optional view-placement access
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
groupId | path | |
bindingKey | path | |
contexts | query | |
viewId | query | |
placementKey | query | |
viewVersion | query | |
rowId | query | |
limit | query | |
after | query |
Responses
- 200: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Save one explicit field or relationship
POST /v1/organizations/{organizationId}/groups/{groupId}/bindings/{bindingKey}/value
Field writes require value and destination revision. Relationship writes require edgeRevision, expectedTargetObjectId, targetObjectId (or null), and queryVersion. The server resolves targets from the binding, rechecks current row/path/field permissions, assigned-profile conditions, live query membership, cardinality and revisions. Group/view versions are required as applicable. Replacement retires old before activating new; no multi-document transactional guarantee. Member runtime access requires an authorized View placement (viewId, placementKey, viewVersion); standalone Group preview is Owner-only. Member collection listings return no standalone Groups.
Access: Selected-role data, binding, context, and optional view-placement access
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
groupId | path | |
bindingKey | path | |
X-CSRF-Token | header |
Request body
{
"application/json": {
"schema": {
"type": "object",
"additionalProperties": false,
"required": [
"rowId",
"groupVersion"
],
"properties": {
"contexts": {
"type": "object",
"additionalProperties": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
}
},
"rowId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"groupVersion": {
"type": "integer",
"minimum": 1
},
"viewId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"placementKey": {
"type": "string",
"pattern": "^[a-z][a-z0-9-]{0,63}$"
},
"viewVersion": {
"type": "integer",
"minimum": 1
},
"revision": {
"type": "integer",
"minimum": 1
},
"value": {},
"edgeRevision": {
"type": "integer",
"minimum": 0
},
"expectedTargetObjectId": {
"oneOf": [
{
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
{
"type": "null"
}
]
},
"targetObjectId": {
"oneOf": [
{
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
{
"type": "null"
}
]
},
"queryVersion": {
"type": "integer",
"minimum": 1
}
}
}
}
}Responses
- 200: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
List views or owner configuration catalog
GET /v1/organizations/{organizationId}/views
Returns role-visible summaries and required typed contexts. manage=1 returns Owner-only definitions. An empty context contract supports an all-records view.
Access: Selected-role data, binding, context, and optional view-placement access
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
manage | query |
Responses
- 200: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Create, update, or retire a DynamicView
POST /v1/organizations/{organizationId}/views
Owner-only. Save requires name/key/contexts/userTypeIds/placements; updates require id/version. Declared view contexts are required. Required group inputs must map to matching types; optional inputs may remain unmapped. Placement restrictions narrow group permissions. Retirement uses id/version/action=remove. Optional icon selects a SourceIcon. View placement icon defaults to inheritance when absent/null; empty string hides it and a listed icon overrides it. Placements may inherit Group-owned buttons, hide them, narrow UserTypes or move them to row/toolbar/page display. Read-only placements deny action mutations. Search and filtering restrictions cannot enable capabilities prohibited by the Group.
Access: Owner mode
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
X-CSRF-Token | header |
Request body
{
"application/json": {
"schema": {
"type": "object",
"additionalProperties": false,
"properties": {
"id": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"version": {
"type": "integer",
"minimum": 1
},
"action": {
"enum": [
"save",
"remove"
]
},
"name": {
"type": "string",
"maxLength": 100
},
"key": {
"type": "string",
"pattern": "^[a-z][a-z0-9-]{0,63}$"
},
"contexts": {
"type": "array",
"maxItems": 4,
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"key",
"objectTypeId"
],
"properties": {
"key": {
"type": "string",
"pattern": "^[a-z][a-z0-9-]{0,63}$"
},
"objectTypeId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"required": {
"type": "boolean",
"default": true
}
}
}
},
"userTypeIds": {
"type": "array",
"maxItems": 100,
"items": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
}
},
"placements": {
"type": "array",
"minItems": 1,
"maxItems": 20,
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"key",
"groupId",
"contextMap"
],
"properties": {
"key": {
"type": "string",
"pattern": "^[a-z][a-z0-9-]{0,63}$"
},
"groupId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"contextMap": {
"type": "object",
"additionalProperties": {
"type": "string",
"pattern": "^[a-z][a-z0-9-]{0,63}$"
}
},
"restriction": {
"type": "object",
"additionalProperties": false,
"properties": {
"readBindingKeys": {
"type": "array",
"maxItems": 40,
"uniqueItems": true,
"items": {
"type": "string",
"pattern": "^[a-z][a-z0-9-]{0,63}$"
}
},
"editBindingKeys": {
"type": "array",
"maxItems": 40,
"uniqueItems": true,
"items": {
"type": "string",
"pattern": "^[a-z][a-z0-9-]{0,63}$"
}
},
"readOnly": {
"type": "boolean"
},
"userTypeIds": {
"type": "array",
"maxItems": 100,
"items": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
}
},
"searchEnabled": {
"type": "boolean",
"description": "May narrow, never expand Group permissions."
},
"filterEnabled": {
"type": "boolean",
"description": "May narrow, never expand Group permissions."
},
"allowCreate": {
"type": "boolean",
"description": "May narrow, never expand Group permissions."
},
"allowDelete": {
"type": "boolean",
"description": "May narrow, never expand Group permissions."
},
"createBindingKeys": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"icon": {
"$ref": "#/components/schemas/SourceIcon"
},
"title": {
"type": "string",
"description": "Optional plain-text section heading, at most 200 UTF-8 bytes."
},
"buttons": {
"type": "array",
"items": {
"type": "object"
},
"description": "Existing View-owned navigation buttons."
},
"actionButtons": {
"type": "array",
"items": {
"type": "object"
},
"description": "Existing View-owned action buttons."
},
"inheritGroupButtons": {
"type": "boolean",
"default": true
},
"buttonOverrides": {
"type": "object",
"description": "Keys are navigation:<key>, action:<key> or link:<key>. Restrictions intersect Group grants.",
"additionalProperties": {
"type": "object",
"additionalProperties": false,
"properties": {
"hidden": {
"type": "boolean"
},
"display": {
"enum": [
"row",
"toolbar",
"page"
]
},
"userTypeIds": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
}
}
}
}
}
}
}
},
"icon": {
"$ref": "#/components/schemas/SourceIcon"
},
"description": {
"type": "string",
"description": "Plain text, at most 4000 UTF-8 bytes."
},
"appearance": {
"type": "object",
"additionalProperties": false,
"properties": {
"backgroundColor": {
"type": [
"string",
"null"
],
"pattern": "^#[a-fA-F0-9]{6}$"
},
"borderColor": {
"type": [
"string",
"null"
],
"pattern": "^#[a-fA-F0-9]{6}$"
},
"density": {
"enum": [
"compact",
"comfortable"
]
},
"showBackButton": {
"type": "boolean"
},
"showTitle": {
"type": "boolean"
},
"showFavorite": {
"type": "boolean"
}
}
},
"actionButtons": {
"type": "array",
"items": {
"type": "object"
},
"description": "Independent View page actions; see bindings and Views guide."
}
}
}
}
}Responses
- 200: Successful response.
- 201: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Resolve authorized reusable group placements
GET /v1/organizations/{organizationId}/views/{viewId}
Requires all declared context IDs before rendering. Validates role, tenant and row access, maps named contexts, and applies per-placement read/edit/visibility restrictions. Context IDs never expand underlying data access.
Access: Selected-role data, binding, context, and optional view-placement access
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
viewId | path | |
contexts | query |
Responses
- 200: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Owner Records: List authorized records
GET /v1/organizations/{organizationId}/object-types/{objectTypeId}/records
Requires selected Owner role. ObjectType is fixed by the path. Collection GET includes schema metadata. Existing record validation and revision rules apply.
Access: Active member; selected-role operation, row, and field access
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
objectTypeId | query | |
limit | query | |
after | query | |
objectTypeId | path |
Responses
- 200: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Owner Records: Create a record
POST /v1/organizations/{organizationId}/object-types/{objectTypeId}/records
Requires selected Owner role. ObjectType is fixed by the path. Collection GET includes schema metadata. Existing record validation and revision rules apply.
Access: Active member; selected-role operation, row, and field access
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
X-CSRF-Token | header | |
objectTypeId | path |
Request body
{
"application/json": {
"schema": {
"type": "object",
"additionalProperties": false,
"required": [
"objectTypeId",
"data"
],
"properties": {
"objectTypeId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"data": {
"type": "object",
"description": "Immutable field keys with strictly typed schema values. Unknown or unauthorized fields are rejected."
},
"action": {
"const": "create"
}
}
}
}
}Responses
- 201: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Owner Records: Update or soft-delete a record
POST /v1/organizations/{organizationId}/object-types/{objectTypeId}/records/{objectId}
Requires selected Owner role. ObjectType is fixed by the path. Collection GET includes schema metadata. Existing record validation and revision rules apply.
Access: Active member; selected-role operation, row, and field access
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
objectId | path | |
X-CSRF-Token | header | |
objectTypeId | path |
Request body
{
"application/json": {
"schema": {
"oneOf": [
{
"type": "object",
"additionalProperties": false,
"required": [
"revision",
"data"
],
"properties": {
"revision": {
"type": "integer",
"minimum": 1
},
"action": {
"const": "update"
},
"data": {
"type": "object",
"description": "Immutable field keys with strictly typed schema values. Unknown or unauthorized fields are rejected."
}
}
},
{
"type": "object",
"additionalProperties": false,
"required": [
"revision",
"action"
],
"properties": {
"revision": {
"type": "integer",
"minimum": 1
},
"action": {
"const": "delete"
}
}
}
]
}
}
}Responses
- 200: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Read personal favorites and dashboard pins visible to the selected role
GET /v1/organizations/{organizationId}/favorites
Access:
| Parameter | Location | Description |
|---|---|---|
organizationId | path |
Responses
- 200: favoriteGroups, favoriteViews, pinnedGroups and pinnedViews arrays of definition IDs. Current user and organization only.
Set a personal favorite or dashboard pin
POST /v1/organizations/{organizationId}/favorites
Authenticated active member; CSRF required. Does not grant data access. Each list is bounded to 200 IDs. Setting false can remove a formerly visible source.
Access:
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path |
Request body
{
"application/json": {
"schema": {
"type": "object",
"required": [
"kind",
"id",
"setting",
"enabled"
],
"additionalProperties": false,
"properties": {
"kind": {
"type": "string",
"enum": [
"groups",
"views"
]
},
"id": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"setting": {
"type": "string",
"enum": [
"favorite",
"pinned"
]
},
"enabled": {
"type": "boolean"
}
}
}
}
}Responses
- 200: Preference saved
- 404: Source unavailable to selected role
- 422: Invalid input or list limit
List DynamicActions
GET /v1/organizations/{organizationId}/actions
Returns active versioned definitions including inputs, operation, conditions and allowed UserTypes. No query parameters.
Access: Owner mode
| Parameter | Location | Description |
|---|---|---|
organizationId | path |
Responses
- 200: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Configure a DynamicAction
POST /v1/organizations/{organizationId}/actions
Create, update or retire an explicit action. Updates and retirement require id/version; referenced action contracts are dependency-protected. Operation creates one record with up to four connections or updates one existing record. See bindings and Views guide for invocation.
Access: Owner mode
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
X-CSRF-Token | header |
Request body
{
"application/json": {
"schema": {
"type": "object",
"additionalProperties": false,
"properties": {
"id": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"version": {
"type": "integer",
"minimum": 1
},
"action": {
"type": "string",
"enum": [
"save",
"remove"
]
},
"name": {
"type": "string"
},
"key": {
"type": "string"
},
"description": {
"type": "string"
},
"inputs": {
"type": "array",
"items": {
"type": "object"
}
},
"operation": {
"type": "object"
},
"conditions": {
"type": "array",
"items": {
"type": "object"
}
},
"userTypeIds": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
}
}
}
}
}
}Responses
- 200: Successful response.
- 201: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Prepare authorized action inputs
POST /v1/organizations/{organizationId}/actions/{actionId}/prepare
Requires a valid authorized View/button invocation and current action/View/Group versions. Returns action fields, prompted inputs and resolved revisions.
Access: Authorized View/button and action/data grants
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
actionId | path | |
X-CSRF-Token | header |
Request body
{
"application/json": {
"schema": {
"type": "object",
"additionalProperties": false,
"properties": {
"viewId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"viewVersion": {
"type": "integer",
"minimum": 1
},
"placementKey": {
"type": "string"
},
"groupVersion": {
"type": "integer",
"minimum": 1
},
"contexts": {
"type": "object"
},
"buttonKey": {
"type": "string"
},
"rowId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"rowRevision": {
"type": "integer",
"minimum": 1
},
"actionVersion": {
"type": "integer",
"minimum": 1
}
}
}
}
}Responses
- 200: Successful response.
- 201: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
List authorized prompted record choices
POST /v1/organizations/{organizationId}/actions/{actionId}/options
Requires a valid authorized View/button invocation and current action/View/Group versions. Returns options, hasMore and nextCursor; pages contain up to 25 authorized records.
Access: Authorized View/button and action/data grants
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
actionId | path | |
X-CSRF-Token | header |
Request body
{
"application/json": {
"schema": {
"type": "object",
"additionalProperties": false,
"properties": {
"viewId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"viewVersion": {
"type": "integer",
"minimum": 1
},
"placementKey": {
"type": "string"
},
"groupVersion": {
"type": "integer",
"minimum": 1
},
"contexts": {
"type": "object"
},
"buttonKey": {
"type": "string"
},
"rowId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"rowRevision": {
"type": "integer",
"minimum": 1
},
"actionVersion": {
"type": "integer",
"minimum": 1
},
"inputKey": {
"type": "string"
},
"after": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
}
}
}
}
}Responses
- 200: Successful response.
- 201: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Execute an explicit DynamicAction
POST /v1/organizations/{organizationId}/actions/{actionId}/execute
Requires a valid authorized View/button invocation and current action/View/Group versions. Requires current revisions and an idempotency requestId; returns result. Conditions, data/field/connection grants and Group/View restrictions are rechecked.
Access: Authorized View/button and action/data grants
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
actionId | path | |
X-CSRF-Token | header |
Request body
{
"application/json": {
"schema": {
"type": "object",
"additionalProperties": false,
"properties": {
"viewId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"viewVersion": {
"type": "integer",
"minimum": 1
},
"placementKey": {
"type": "string"
},
"groupVersion": {
"type": "integer",
"minimum": 1
},
"contexts": {
"type": "object"
},
"buttonKey": {
"type": "string"
},
"rowId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"rowRevision": {
"type": "integer",
"minimum": 1
},
"actionVersion": {
"type": "integer",
"minimum": 1
},
"records": {
"type": "object"
},
"values": {
"type": "object"
},
"revisions": {
"type": "object"
},
"requestId": {
"type": "string"
}
}
}
}
}Responses
- 200: Successful response.
- 201: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
List reusable View navigations
GET /v1/organizations/{organizationId}/navigations
Returns active navigation definitions. No query parameters.
Access: Owner mode
| Parameter | Location | Description |
|---|---|---|
organizationId | path |
Responses
- 200: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Configure reusable View navigation
POST /v1/organizations/{organizationId}/navigations
Inputs must exactly match destination View contexts and types. Updates require id/version. Retirement is blocked while referenced.
Access: Owner mode
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
X-CSRF-Token | header |
Request body
{
"application/json": {
"schema": {
"type": "object",
"additionalProperties": false,
"properties": {
"id": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"version": {
"type": "integer",
"minimum": 1
},
"action": {
"type": "string",
"enum": [
"save",
"remove"
]
},
"name": {
"type": "string"
},
"key": {
"type": "string"
},
"kind": {
"type": "string",
"enum": [
"openView"
]
},
"targetViewId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"inputs": {
"type": "array",
"items": {
"type": "object"
}
}
}
}
}
}Responses
- 200: Successful response.
- 201: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Review current record connections
GET /v1/organizations/{organizationId}/record-connections
Returns connections, hasMore and nextCursor. Includes endpoint labels, revisions, availability, canDisconnect and canModify. Mutations use relationship edges routes; this overview is read-only.
Access: Owner mode
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
relationshipId | query | |
after | query | |
limit | query |
Responses
- 200: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Review ObjectType dependencies
GET /v1/organizations/{organizationId}/object-types/{objectTypeId}/dependencies
Returns dependency information for an active ObjectType, filtered by management permissions.
Access: ObjectType management permission
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
objectTypeId | path |
Responses
- 200: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Review preserved field values and migrations
GET /v1/organizations/{organizationId}/object-types/{objectTypeId}/field-migrations
Returns fields, relationships, migrations, fieldKinds, optionQueries and relationshipSources. Includes active/retired fields and recent non-preview jobs.
Access: Owner mode
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
objectTypeId | path |
Responses
- 200: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
Choose, preview or apply a preserved-value migration
POST /v1/organizations/{organizationId}/object-types/{objectTypeId}/field-migrations
Use action=choices for replacement choices, preview to validate source/destination settings, then apply with only action, previewId and previewToken. Apply requires an unexpired actor-bound preview and current versions; source values remain preserved. See ObjectTypes and fields guide for replacement and conflict behavior.
Access: Owner mode
CSRF: Send the session's X-CSRF-Token header.
| Parameter | Location | Description |
|---|---|---|
organizationId | path | |
objectTypeId | path | |
X-CSRF-Token | header |
Request body
{
"application/json": {
"schema": {
"type": "object",
"additionalProperties": false,
"properties": {
"action": {
"type": "string",
"enum": [
"choices",
"preview",
"apply"
]
},
"sourceId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"sourceVersion": {
"type": "integer",
"minimum": 1
},
"targetId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"targetVersion": {
"type": "integer",
"minimum": 1
},
"conflictPolicy": {
"type": "string"
},
"retireAfter": {
"type": "boolean"
},
"previewId": {
"type": "string",
"pattern": "^[a-f0-9]{24}$"
},
"previewToken": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"targetKind": {
"type": "string"
},
"from": {
"type": "string"
},
"mappings": {
"type": "array",
"items": {}
},
"newField": {
"type": "object"
},
"sourceKind": {
"type": "string",
"enum": [
"field",
"relationship"
]
},
"sourceFrom": {
"type": "string"
}
},
"required": [
"action"
]
}
}
}Responses
- 200: Successful response.
- 201: Successful response.
- 400: Malformed JSON.
- 401: Authentication required.
- 403: CSRF, operation, field, role, or membership access denied.
- 404: Resource absent or row access denied.
- 409: Revision, schema, cardinality, dependency, identity, or concurrent mutation conflict.
- 413: Request or record too large.
- 415: JSON content required.
- 422: Invalid input; record validation errors may include error.fields.
DynamicActions
| Method | Organization-relative path | Purpose |
|---|---|---|
| GET / POST | /actions | Owner action catalog and versioned configuration |
| POST | /actions/{id}/prepare | Authorize a View/button invocation and prepare input fields |
| POST | /actions/{id}/options | Page through authorized record input choices |
| POST | /actions/{id}/execute | Execute with current revisions and an idempotency request ID |
Reusable buttons are configured on Groups and inherited by View placements; existing View page and placement-owned buttons remain supported. See custom Group buttons. Action role grants intersect data, field, connection, group and context permissions. See bindings and Views and action creation permissions.

