MENU navbar-image

Introduction

Stateless REST API for tenant apps and the platform control plane: multi-tenant isolation, Sanctum tokens, RBAC, device registry, and multi-channel push.

Base path: **`/api/v1`**. Browser and mobile clients authenticate with Sanctum Bearer tokens. Integration-enabled routes can instead accept a scoped tenant key.

## Two API surfaces

| Surface | Prefix | Auth | Tenant header |
|---------|--------|------|----------------|
| **Tenant product** | `/api/v1/*` (auth, users, push, …) | Sanctum Bearer from `POST /auth/login` | **`X-Tenant`** required (tenant slug or id) |
| **Platform control plane** | `/api/v1/central/*` | Central operator token from `POST /central/auth/login` | **Do not** send `X-Tenant` |

Public bootstrap routes (`GET /health`, `GET /public/tenants/{slug}`) do not require authentication.

## Headers

| Header | Required | Purpose |
|--------|----------|---------|
| `X-Api-Key` | Integration routes only | Per-tenant integration secret with the route's required ability |
| `X-Tenant` | Tenant routes | Organization slug or id (`demo` in seeded data) |
| `Authorization: Bearer {token}` | Authenticated routes | Sanctum personal access token (tenant or central) |
| `x-access-token` | Optional alt | Same token as Bearer |
| `X-Device-Name` | Recommended | Human label for device / token listing |
| `X-App-Version` | Recommended | Client version for support / targeting |
| `Accept` | Recommended | `application/json` |

## Response envelope

```json
{ "status": "success", "message": "…", "data": {} }
```

Errors use the same shape with `status: "error"` (or Laravel validation under `errors`).

## Tenant auth + device registry

On **`POST /auth/register`** and **`POST /auth/login`**, optional body fields upsert a `device_tokens` row for push audiences:

- `platform` — `web` \| `ios` \| `android`
- `provider` — `webpush` \| `fcm` \| `apns`
- `token` — stable browser client id **or** FCM/APNs push token
- `device_name`, `app_version`

Login returns `user`, a Sanctum `token`, and an optional `device` registry row. Registration creates an unlicensed account and returns no token or device until an administrator grants a seat; clients can then log in and register/update devices via **`POST /devices`**.

**Password recovery:** `POST /auth/forgot-password` then `POST /auth/reset-password` (email link uses `FRONTEND_URL`).

**Email verification:** register sends a link; `POST /auth/email/verify` (id + hash) and authenticated `POST /auth/email/resend`. Login is not blocked until verified. Profile: `PATCH /auth/profile`, password: `PATCH /auth/password`.

**Web push delivery** still needs a browser subscription (`POST /push/subscribe` with VAPID). Device tokens power FCM/APNs delivery when those credentials are set, and always appear in admin recipient pick-lists.

## Admin push broadcast (tenant-scoped)

Permission: `notifications.send`. Requires initialized tenant context (`X-Tenant`). Audiences: `all_users`, `users`, `all_devices`, `devices`. When targeting `users` or `devices`, IDs must belong to the current tenant.

## Platform control plane

Central routes manage tenants, operators, per-tenant database backups, cache flush, legacy host-key configuration status, and ops dashboard tickets (Telescope / Horizon / Pulse). Host operations live under **Central — Host Operations** (`POST /central/cache/flush`, `GET /central/config/api-key`). The host-key endpoint reports only configuration status and a fingerprint; it never returns the secret.

<aside>Code samples for each endpoint appear in the dark panel (language tabs: bash / javascript). The control-plane SPA embeds Swagger UI against <code>/docs/openapi.yaml</code>.</aside>

Authenticating requests

To authenticate requests, include an Authorization header with the value "Bearer {YOUR_ACCESS_TOKEN}".

All authenticated endpoints are marked with a requires authentication badge in the documentation below.

Tenant routes: obtain a Sanctum token from POST /api/v1/auth/login (with X-Tenant). Registration creates an unlicensed account without a token until an administrator grants a seat. Central routes: obtain a platform operator token from POST /api/v1/central/auth/login (no X-Tenant). Send the token as Authorization: Bearer {token} (or x-access-token).

Routes explicitly enabled for machine integrations can use a per-tenant X-Api-Key with the declared ability instead of a Bearer token. The legacy host API_KEY is server-side compatibility only and is not an identity or authorization grant.

Tenant-scoped routes additionally require X-Tenant (slug or id). Optional device headers: X-Device-Name, X-App-Version.

Configuration & System Diagnostics

Health checks and admin configuration. GET /health is unauthenticated beyond API key (mobile bootstrap).

Health Check

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/health" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/health"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 30120d56-87ac-4795-99cd-ea6ca992af6b
vary: Origin
 

{
    "status": "success",
    "message": "Service is healthy.",
    "data": {
        "status": "operational",
        "app": "App Template",
        "app_version": "1.0.0",
        "version": "1.0.0",
        "timestamp": "2026-09-04T13:56:45+00:00",
        "server_time": "2026-09-04T13:56:45+00:00",
        "services": {
            "database": "ok",
            "cache": "configured",
            "queue": "configured"
        }
    }
}
 

Request      

GET api/v1/health

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Get Dashboard Telemetry & Stats

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/config/dashboard-stats" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/config/dashboard-stats"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (503):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: be14b1c4-15ee-4c50-a83f-8471b1f82a46
vary: Origin
 

{
    "status": "error",
    "message": "Tenant database is not provisioned.",
    "data": null,
    "errors": null
}
 

Request      

GET api/v1/config/dashboard-stats

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/config/legal" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/config/legal"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (503):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 0d713ff0-df5c-4e3f-9e8f-06ffc3a0b41b
vary: Origin
 

{
    "status": "error",
    "message": "Tenant database is not provisioned.",
    "data": null,
    "errors": null
}
 

requires authentication

Example request:
curl --request PATCH \
    "http://localhost:8000/api/v1/config/legal" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"privacy_policy\": \"architecto\",
    \"terms_and_conditions\": \"architecto\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/config/legal"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "privacy_policy": "architecto",
    "terms_and_conditions": "architecto"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Get Login Branding

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/config/login-branding" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/config/login-branding"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (503):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: fccb884f-b3d0-4bf6-bda1-ea6c0cf54146
vary: Origin
 

{
    "status": "error",
    "message": "Tenant database is not provisioned.",
    "data": null,
    "errors": null
}
 

Request      

GET api/v1/config/login-branding

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Upload Login Background

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/config/login-branding/upload" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --form "image=@/tmp/phpps0ot3gr295c4YPjga6" 
const url = new URL(
    "http://localhost:8000/api/v1/config/login-branding/upload"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

const body = new FormData();
body.append('image', document.querySelector('input[name="image"]').files[0]);

fetch(url, {
    method: "POST",
    headers,
    body,
}).then(response => response.json());

Request      

POST api/v1/config/login-branding/upload

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

image   file     

Must be an image. Must not be greater than 5120 kilobytes. Example: /tmp/phpps0ot3gr295c4YPjga6

Update Login Background URL

requires authentication

Example request:
curl --request PATCH \
    "http://localhost:8000/api/v1/config/login-branding" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"login_background_url\": \"http:\\/\\/www.bailey.biz\\/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/config/login-branding"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "login_background_url": "http:\/\/www.bailey.biz\/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PATCH api/v1/config/login-branding

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

login_background_url   string  optional    

Must be a valid URL. Must not be greater than 2048 characters. Example: http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html

Remove Login Background

requires authentication

Example request:
curl --request DELETE \
    "http://localhost:8000/api/v1/config/login-branding" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/config/login-branding"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/config/login-branding

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Public — Organization Lookup

Resolve tenant branding before login. API key only — no Bearer token or X-Tenant header.

Resolve Public Organization

Returns the organization name for a slug or id. Used by tenant login screens.

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/public/tenants/acme" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/public/tenants/acme"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: ce4866de-47aa-45d3-be53-658024a436dd
vary: Origin
 

{
    "message": "Server Error"
}
 

Request      

GET api/v1/public/tenants/{slug}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

slug   string     

The slug of the tenant. Example: acme

Central — Authentication

Platform operator login for the control plane (/central SPA). Tokens use the central Sanctum guard — do not send X-Tenant.

Central Login

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/central/auth/login" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"email\": \"gbailey@example.net\",
    \"password\": \"|]|{+-\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/central/auth/login"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "email": "gbailey@example.net",
    "password": "|]|{+-"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/central/auth/login

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

email   string     

Must be a valid email address. Example: gbailey@example.net

password   string     

Example: |]|{+-

Central Profile

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/central/auth/me" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/auth/me"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (500):

Show headers
cache-control: no-store, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 167f3d54-d851-459d-9277-acf5282e7b5c
vary: Origin
 

{
    "message": "Server Error"
}
 

Request      

GET api/v1/central/auth/me

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Central Logout

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/central/auth/logout" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/auth/logout"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/central/auth/logout

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Central — Dashboard & Activity

Central Dashboard Snapshot

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/central/dashboard" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/dashboard"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 0f7151b6-59af-4a1b-8172-4124225e6891
vary: Origin
 

{
    "message": "Server Error"
}
 

Request      

GET api/v1/central/dashboard

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Central Activity Log

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/central/activity" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/activity"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 5bff2f32-4556-490b-84e7-b8e2ce84d8a1
vary: Origin
 

{
    "message": "Server Error"
}
 

Request      

GET api/v1/central/activity

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Central — Tenants & Hierarchy

Provision and manage tenant organizations from the platform control plane.

List Tenants

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/central/tenants" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"page\": 16,
    \"per_page\": 22,
    \"search\": \"g\",
    \"status\": \"active\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/central/tenants"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "page": 16,
    "per_page": 22,
    "search": "g",
    "status": "active"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 66729f6d-d9be-4755-b2a6-8d053be2202a
vary: Origin
 

{
    "message": "Server Error"
}
 

Request      

GET api/v1/central/tenants

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

page   integer  optional    

Must be at least 1. Example: 16

per_page   integer  optional    

Must be at least 1. Must not be greater than 100. Example: 22

search   string  optional    

Must not be greater than 255 characters. Example: g

status   string  optional    

Example: active

Must be one of:
  • active
  • suspended

Create Tenant

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/central/tenants" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"slug\": \"b\",
    \"name\": \"n\",
    \"parent\": \"g\",
    \"super_admin\": {
        \"name\": \"b\",
        \"email\": \"zbailey@example.net\",
        \"password\": \"architecto\"
    },
    \"admin\": {
        \"name\": \"n\",
        \"email\": \"ashly64@example.com\"
    },
    \"user_license_limit\": 1
}"
const url = new URL(
    "http://localhost:8000/api/v1/central/tenants"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "slug": "b",
    "name": "n",
    "parent": "g",
    "super_admin": {
        "name": "b",
        "email": "zbailey@example.net",
        "password": "architecto"
    },
    "admin": {
        "name": "n",
        "email": "ashly64@example.com"
    },
    "user_license_limit": 1
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/central/tenants

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

slug   string     

Must match the regex /^[a-z0-9]+(?:-[a-z0-9]+)*$/. Must be at least 2 characters. Must not be greater than 32 characters. Example: b

name   string     

Must not be greater than 255 characters. Example: n

parent   string  optional    

Must not be greater than 64 characters. Example: g

super_admin   object     
name   string     

Must not be greater than 255 characters. Example: b

email   string     

Must be a valid email address. Must not be greater than 255 characters. Example: zbailey@example.net

password   string     

Example: architecto

admin   object  optional    
name   string  optional    

This field is required when admin.email is present. Must not be greater than 255 characters. Example: n

email   string  optional    

This field is required when admin.name is present. The value and super_admin.email must be different. Must be a valid email address. Must not be greater than 255 characters. Example: ashly64@example.com

password   string  optional    

This field is required when admin.email is present.

user_license_limit   integer  optional    

Must be at least 1. Must not be greater than 10000. Example: 1

Tenant Hierarchy Tree

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/central/tenants/tree" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/tenants/tree"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 92a7a801-c801-4b0b-950c-b70474d3503e
vary: Origin
 

{
    "message": "Server Error"
}
 

Request      

GET api/v1/central/tenants/tree

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Show Tenant

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/central/tenants/acme" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/tenants/acme"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: a98845e7-6826-4321-b0a9-2246955d8406
vary: Origin
 

{
    "message": "Server Error"
}
 

Request      

GET api/v1/central/tenants/{tenant}

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

tenant   string     

The tenant. Example: acme

Set Tenant Parent

requires authentication

Example request:
curl --request PATCH \
    "http://localhost:8000/api/v1/central/tenants/acme/parent" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"parent\": \"b\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/central/tenants/acme/parent"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "parent": "b"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PATCH api/v1/central/tenants/{tenant}/parent

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

tenant   string     

The tenant. Example: acme

Body Parameters

parent   string  optional    

Must not be greater than 64 characters. Example: b

Update Tenant

requires authentication

Example request:
curl --request PATCH \
    "http://localhost:8000/api/v1/central/tenants/acme" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"slug\": \"b\",
    \"name\": \"n\",
    \"status\": \"active\",
    \"user_license_limit\": 7,
    \"api_rate_limit\": 16,
    \"allowed_ips\": [
        \"m\"
    ]
}"
const url = new URL(
    "http://localhost:8000/api/v1/central/tenants/acme"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "slug": "b",
    "name": "n",
    "status": "active",
    "user_license_limit": 7,
    "api_rate_limit": 16,
    "allowed_ips": [
        "m"
    ]
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PATCH api/v1/central/tenants/{tenant}

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

tenant   string     

The tenant. Example: acme

Body Parameters

slug   string  optional    

Must match the regex /^[a-z0-9]+(?:-[a-z0-9]+)*$/. Must be at least 2 characters. Must not be greater than 32 characters. Example: b

name   string  optional    

Must not be greater than 255 characters. Example: n

status   string  optional    

Example: active

Must be one of:
  • active
  • suspended
user_license_limit   integer  optional    

Must be at least 1. Must not be greater than 10000. Example: 7

api_rate_limit   integer  optional    

Must be at least 1. Must not be greater than 100000. Example: 16

allowed_ips   string[]  optional    

Must not be greater than 64 characters.

Delete Tenant

requires authentication

Example request:
curl --request DELETE \
    "http://localhost:8000/api/v1/central/tenants/acme" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"confirm_slug\": \"b\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/central/tenants/acme"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "confirm_slug": "b"
};

fetch(url, {
    method: "DELETE",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

DELETE api/v1/central/tenants/{tenant}

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

tenant   string     

The tenant. Example: acme

Body Parameters

confirm_slug   string     

Must not be greater than 64 characters. Example: b

Update Tenant User

requires authentication

Example request:
curl --request PATCH \
    "http://localhost:8000/api/v1/central/tenants/acme/users/564" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"name\": \"b\",
    \"is_active\": false,
    \"has_license\": true
}"
const url = new URL(
    "http://localhost:8000/api/v1/central/tenants/acme/users/564"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "name": "b",
    "is_active": false,
    "has_license": true
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PATCH api/v1/central/tenants/{tenant}/users/{userId}

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

tenant   string     

The tenant. Example: acme

userId   string     

Example: 564

Body Parameters

name   string  optional    

Must not be greater than 255 characters. Example: b

password   string  optional    
is_active   boolean  optional    

Example: false

has_license   boolean  optional    

Example: true

Impersonate Tenant User

requires authentication

Starts a support session and returns a short-lived tenant Sanctum token.

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/central/tenants/acme/users/564/impersonate" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/tenants/acme/users/564/impersonate"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/central/tenants/{tenant}/users/{userId}/impersonate

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

tenant   string     

The tenant. Example: acme

userId   string     

Example: 564

Central — Tenant Access

Cross-tenant visibility policies and per-user grants.

Show Tenant Access

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/central/tenants/acme/access" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/tenants/acme/access"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 30a9e976-7007-4b34-9d62-becbd813eb42
vary: Origin
 

{
    "message": "Server Error"
}
 

Request      

GET api/v1/central/tenants/{tenant}/access

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

tenant   string     

The tenant. Example: acme

Upsert Tenant Access Policy

requires authentication

Example request:
curl --request PUT \
    "http://localhost:8000/api/v1/central/tenants/acme/access/policies" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"source\": \"b\",
    \"level\": \"monitor\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/central/tenants/acme/access/policies"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "source": "b",
    "level": "monitor"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PUT api/v1/central/tenants/{tenant}/access/policies

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

tenant   string     

The tenant. Example: acme

Body Parameters

source   string     

Must not be greater than 64 characters. Example: b

level   string  optional    

Example: monitor

Must be one of:
  • monitor
  • admin

Upsert Tenant Access Grant

requires authentication

Example request:
curl --request PUT \
    "http://localhost:8000/api/v1/central/tenants/acme/access/grants" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"source\": \"b\",
    \"user_id\": 22,
    \"level\": \"monitor\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/central/tenants/acme/access/grants"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "source": "b",
    "user_id": 22,
    "level": "monitor"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PUT api/v1/central/tenants/{tenant}/access/grants

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

tenant   string     

The tenant. Example: acme

Body Parameters

source   string     

Must not be greater than 64 characters. Example: b

user_id   integer     

Must be at least 1. Example: 22

level   string     

Example: monitor

Must be one of:
  • monitor
  • admin
  • deny

Delete Tenant Access Grant

requires authentication

Example request:
curl --request DELETE \
    "http://localhost:8000/api/v1/central/tenants/acme/access/grants/564" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/tenants/acme/access/grants/564"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/central/tenants/{tenant}/access/grants/{grant}

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

tenant   string     

The tenant. Example: acme

grant   string     

The grant. Example: 564

Central — Tenant Backups

Per-tenant database dumps stored on the platform host.

List Tenant Backups

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/central/tenants/acme/backups" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/tenants/acme/backups"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 1eee393d-3768-446e-9ecb-b19829c7b816
vary: Origin
 

{
    "message": "Server Error"
}
 

Request      

GET api/v1/central/tenants/{tenant}/backups

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

tenant   string     

The tenant. Example: acme

Create Tenant Backup

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/central/tenants/acme/backups" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/tenants/acme/backups"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/central/tenants/{tenant}/backups

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

tenant   string     

The tenant. Example: acme

Download Tenant Backup

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/central/tenants/acme/backups/db_backup_-.w.zip" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/tenants/acme/backups/db_backup_-.w.zip"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 392df036-74b6-4d1c-8fac-bb74ac98ffb5
vary: Origin
 

{
    "message": "Server Error"
}
 

Request      

GET api/v1/central/tenants/{tenant}/backups/{filename}

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

tenant   string     

The tenant. Example: acme

filename   string     

Example: db_backup_-.w.zip

Delete Tenant Backup

requires authentication

Example request:
curl --request DELETE \
    "http://localhost:8000/api/v1/central/tenants/acme/backups/db_backup_-.w.zip" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/tenants/acme/backups/db_backup_-.w.zip"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/central/tenants/{tenant}/backups/{filename}

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

tenant   string     

The tenant. Example: acme

filename   string     

Example: db_backup_-.w.zip

Central — Platform Operators

List Platform Operators

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/central/operators" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/operators"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 6e941665-ba00-4762-b7e0-f6fc19bdf6c8
vary: Origin
 

{
    "message": "Server Error"
}
 

Request      

GET api/v1/central/operators

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Create Platform Operator

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/central/operators" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"name\": \"b\",
    \"email\": \"zbailey@example.net\",
    \"password\": \"architecto\",
    \"role\": \"platform-super\",
    \"is_active\": false
}"
const url = new URL(
    "http://localhost:8000/api/v1/central/operators"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "name": "b",
    "email": "zbailey@example.net",
    "password": "architecto",
    "role": "platform-super",
    "is_active": false
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/central/operators

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

name   string     

Must not be greater than 255 characters. Example: b

email   string     

Must be a valid email address. Must not be greater than 255 characters. Example: zbailey@example.net

password   string     

Example: architecto

role   string     

Example: platform-super

Must be one of:
  • platform-super
  • platform-admin
  • platform-support
is_active   boolean  optional    

Example: false

Update Platform Operator

requires authentication

Example request:
curl --request PATCH \
    "http://localhost:8000/api/v1/central/operators/564" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"name\": \"b\",
    \"email\": \"zbailey@example.net\",
    \"role\": \"platform-admin\",
    \"is_active\": true
}"
const url = new URL(
    "http://localhost:8000/api/v1/central/operators/564"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "name": "b",
    "email": "zbailey@example.net",
    "role": "platform-admin",
    "is_active": true
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PATCH api/v1/central/operators/{operator}

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

operator   string     

The operator. Example: 564

Body Parameters

name   string  optional    

Must not be greater than 255 characters. Example: b

email   string  optional    

Must be a valid email address. Must not be greater than 255 characters. Example: zbailey@example.net

password   string  optional    
role   string  optional    

Example: platform-admin

Must be one of:
  • platform-super
  • platform-admin
  • platform-support
is_active   boolean  optional    

Example: true

Delete Platform Operator

requires authentication

Example request:
curl --request DELETE \
    "http://localhost:8000/api/v1/central/operators/564" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/operators/564"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/central/operators/{operator}

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

operator   string     

The operator. Example: 564

Central — Host Operations

Platform-wide cache operations and legacy API-key configuration status.

Flush Application Cache

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/central/cache/flush" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/cache/flush"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/central/cache/flush

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

API Key Configuration Status

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/central/config/api-key" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/config/api-key"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: a20b2dca-71ca-4971-bfb0-5d92834ac4a3
vary: Origin
 

{
    "message": "Server Error"
}
 

Request      

GET api/v1/central/config/api-key

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Central — Ops Dashboards

Issue short-lived access tickets for Telescope, Horizon, and Pulse.

Issue Telescope Access Ticket

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/central/telescope/ticket" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/telescope/ticket"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/central/telescope/ticket

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Issue Horizon Access Ticket

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/central/horizon/ticket" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/horizon/ticket"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/central/horizon/ticket

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Issue Pulse Access Ticket

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/central/pulse/ticket" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/pulse/ticket"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/central/pulse/ticket

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Authentication

Endpoints for managing user authentication and access tokens.

User Registration

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/auth/register" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"name\": \"b\",
    \"email\": \"zbailey@example.net\",
    \"password\": \"architecto\",
    \"device_name\": \"n\",
    \"platform\": \"web\",
    \"provider\": \"webpush\",
    \"token\": \"g\",
    \"app_version\": \"z\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/auth/register"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "name": "b",
    "email": "zbailey@example.net",
    "password": "architecto",
    "device_name": "n",
    "platform": "web",
    "provider": "webpush",
    "token": "g",
    "app_version": "z"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/auth/register

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

name   string     

Must not be greater than 255 characters. Example: b

email   string     

Must be a valid email address. Must not be greater than 255 characters. Example: zbailey@example.net

password   string     

Example: architecto

device_name   string  optional    

Must not be greater than 255 characters. Example: n

platform   string  optional    

Example: web

Must be one of:
  • web
  • ios
  • android
provider   string  optional    

Example: webpush

Must be one of:
  • webpush
  • fcm
  • apns
token   string  optional    

Must not be greater than 512 characters. Example: g

app_version   string  optional    

Must not be greater than 50 characters. Example: z

User Login

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/auth/login" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"email\": \"gbailey@example.net\",
    \"password\": \"architecto\",
    \"device_name\": \"n\",
    \"platform\": \"ios\",
    \"provider\": \"apns\",
    \"token\": \"g\",
    \"app_version\": \"z\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/auth/login"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "email": "gbailey@example.net",
    "password": "architecto",
    "device_name": "n",
    "platform": "ios",
    "provider": "apns",
    "token": "g",
    "app_version": "z"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/auth/login

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

email   string     

Must be at least 3 characters. Must not be greater than 255 characters. Example: gbailey@example.net

password   string     

Example: architecto

device_name   string  optional    

Must not be greater than 255 characters. Example: n

platform   string  optional    

Example: ios

Must be one of:
  • web
  • ios
  • android
provider   string  optional    

Example: apns

Must be one of:
  • webpush
  • fcm
  • apns
token   string  optional    

Must not be greater than 512 characters. Example: g

app_version   string  optional    

Must not be greater than 50 characters. Example: z

Forgot Password

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/auth/forgot-password" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"email\": \"gbailey@example.net\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/auth/forgot-password"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "email": "gbailey@example.net"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/auth/forgot-password

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

email   string     

Must be a valid email address. Example: gbailey@example.net

Reset Password

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/auth/reset-password" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"email\": \"gbailey@example.net\",
    \"token\": \"architecto\",
    \"password\": \"architecto\",
    \"password_confirmation\": \"architecto\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/auth/reset-password"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "email": "gbailey@example.net",
    "token": "architecto",
    "password": "architecto",
    "password_confirmation": "architecto"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/auth/reset-password

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

email   string     

Must be a valid email address. Example: gbailey@example.net

token   string     

Example: architecto

password   string     

Example: architecto

password_confirmation   string     

Example: architecto

Verify Email

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/auth/email/verify" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"id\": 16,
    \"hash\": \"architecto\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/auth/email/verify"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "id": 16,
    "hash": "architecto"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/auth/email/verify

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

id   integer     

Must match an existing stored value. Example: 16

hash   string     

Example: architecto

User Details By Access Token

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/auth/user-by-token" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"token\": \"architecto\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/auth/user-by-token"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "token": "architecto"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (503):

Show headers
cache-control: no-store, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 1fbbaab1-9cc2-422c-8f66-e0c6677a31c8
vary: Origin
 

{
    "status": "error",
    "message": "Tenant database is not provisioned.",
    "data": null,
    "errors": null
}
 

Request      

GET api/v1/auth/user-by-token

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

token   string  optional    

Example: architecto

User Logout

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/auth/logout" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/auth/logout"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/auth/logout

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Get Current User Profile

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/auth/me" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/auth/me"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (503):

Show headers
cache-control: no-store, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 86381cdc-efce-46f1-afaf-63820d0c47ee
vary: Origin
 

{
    "status": "error",
    "message": "Tenant database is not provisioned.",
    "data": null,
    "errors": null
}
 

Request      

GET api/v1/auth/me

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Update Profile

requires authentication

Example request:
curl --request PATCH \
    "http://localhost:8000/api/v1/auth/profile" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"name\": \"b\",
    \"email\": \"zbailey@example.net\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/auth/profile"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "name": "b",
    "email": "zbailey@example.net"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PATCH api/v1/auth/profile

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

name   string  optional    

Must not be greater than 255 characters. Example: b

email   string  optional    

Must be a valid email address. Must not be greater than 255 characters. Example: zbailey@example.net

Resend Email Verification

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/auth/email/resend" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/auth/email/resend"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/auth/email/resend

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Change Password

requires authentication

Example request:
curl --request PATCH \
    "http://localhost:8000/api/v1/auth/password" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"current_password\": \"architecto\",
    \"password\": \"architecto\",
    \"password_confirmation\": \"architecto\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/auth/password"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "current_password": "architecto",
    "password": "architecto",
    "password_confirmation": "architecto"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PATCH api/v1/auth/password

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

current_password   string     

Example: architecto

password   string     

Example: architecto

password_confirmation   string     

Example: architecto

List Access Tokens

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/auth/tokens" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/auth/tokens"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (503):

Show headers
cache-control: no-store, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: c191b570-addf-4b5d-987f-803411fce00c
vary: Origin
 

{
    "status": "error",
    "message": "Tenant database is not provisioned.",
    "data": null,
    "errors": null
}
 

Request      

GET api/v1/auth/tokens

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Revoke Access Token

requires authentication

Example request:
curl --request DELETE \
    "http://localhost:8000/api/v1/auth/tokens/architecto" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/auth/tokens/architecto"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/auth/tokens/{tokenId}

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

tokenId   string     

Example: architecto

Device Registry

Register mobile / web device tokens for multi-channel push (FCM, APNs, Web Push linkage).

List Devices

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/devices" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/devices"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (503):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 391a5c6c-3e46-4769-b0f2-5630697c2a79
vary: Origin
 

{
    "status": "error",
    "message": "Tenant database is not provisioned.",
    "data": null,
    "errors": null
}
 

Request      

GET api/v1/devices

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Register or Update Device

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/devices" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"platform\": \"ios\",
    \"provider\": \"webpush\",
    \"token\": \"b\",
    \"device_name\": \"n\",
    \"app_version\": \"g\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/devices"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "platform": "ios",
    "provider": "webpush",
    "token": "b",
    "device_name": "n",
    "app_version": "g"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/devices

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

platform   string     

Example: ios

Must be one of:
  • web
  • ios
  • android
provider   string     

Example: webpush

Must be one of:
  • webpush
  • fcm
  • apns
token   string     

Must not be greater than 512 characters. Example: b

device_name   string  optional    

Must not be greater than 255 characters. Example: n

app_version   string  optional    

Must not be greater than 50 characters. Example: g

Revoke Device

requires authentication

Example request:
curl --request DELETE \
    "http://localhost:8000/api/v1/devices" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"token\": \"b\",
    \"provider\": \"webpush\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/devices"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "token": "b",
    "provider": "webpush"
};

fetch(url, {
    method: "DELETE",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

DELETE api/v1/devices

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

token   string     

Must not be greater than 512 characters. Example: b

provider   string  optional    

Example: webpush

Must be one of:
  • webpush
  • fcm
  • apns

Push Notifications

Endpoints for browser Web Push subscriptions and multi-channel notification dispatch.

Save Push Subscription

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/push/subscribe" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"endpoint\": \"b\",
    \"keys\": {
        \"p256dh\": \"architecto\",
        \"auth\": \"architecto\"
    },
    \"content_encoding\": \"aesgcm\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/push/subscribe"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "endpoint": "b",
    "keys": {
        "p256dh": "architecto",
        "auth": "architecto"
    },
    "content_encoding": "aesgcm"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/push/subscribe

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

endpoint   string     

Must not be greater than 2048 characters. Example: b

keys   object     
p256dh   string     

Example: architecto

auth   string     

Example: architecto

content_encoding   string  optional    

Example: aesgcm

Must be one of:
  • aesgcm
  • aes128gcm

Unsubscribe Push Notification

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/push/unsubscribe" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"endpoint\": \"b\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/push/unsubscribe"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "endpoint": "b"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/push/unsubscribe

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

endpoint   string     

Must not be greater than 2048 characters. Example: b

Send Push Notification (self)

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/push/send" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"title\": \"b\",
    \"body\": \"n\",
    \"icon\": \"g\",
    \"url\": \"http:\\/\\/www.okuneva.com\\/fugiat-sunt-nihil-accusantium-harum-mollitia.html\",
    \"providers\": [
        \"apns\"
    ]
}"
const url = new URL(
    "http://localhost:8000/api/v1/push/send"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "title": "b",
    "body": "n",
    "icon": "g",
    "url": "http:\/\/www.okuneva.com\/fugiat-sunt-nihil-accusantium-harum-mollitia.html",
    "providers": [
        "apns"
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/push/send

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

title   string  optional    

Must not be greater than 255 characters. Example: b

body   string  optional    

Must not be greater than 1000 characters. Example: n

icon   string  optional    

Must not be greater than 500 characters. Example: g

url   string  optional    

Must not be greater than 500 characters. Example: http://www.okuneva.com/fugiat-sunt-nihil-accusantium-harum-mollitia.html

providers   string[]  optional    
Must be one of:
  • webpush
  • fcm
  • apns

List Broadcast Recipients

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/push/recipients" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/push/recipients"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (503):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 7e632972-db17-49c3-8b18-c2a2695726d5
vary: Origin
 

{
    "status": "error",
    "message": "Tenant database is not provisioned.",
    "data": null,
    "errors": null
}
 

Request      

GET api/v1/push/recipients

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Broadcast Push Notification

requires authentication

Requires tenant context (X-Tenant) and notifications.send. When audience is users or devices, the supplied IDs must belong to the current tenant.

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/push/broadcast" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"title\": \"b\",
    \"body\": \"n\",
    \"icon\": \"g\",
    \"url\": \"http:\\/\\/www.okuneva.com\\/fugiat-sunt-nihil-accusantium-harum-mollitia.html\",
    \"audience\": \"all_devices\",
    \"user_ids\": [
        16
    ],
    \"device_keys\": [
        \"device_642\"
    ]
}"
const url = new URL(
    "http://localhost:8000/api/v1/push/broadcast"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "title": "b",
    "body": "n",
    "icon": "g",
    "url": "http:\/\/www.okuneva.com\/fugiat-sunt-nihil-accusantium-harum-mollitia.html",
    "audience": "all_devices",
    "user_ids": [
        16
    ],
    "device_keys": [
        "device_642"
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/push/broadcast

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

title   string     

Must not be greater than 255 characters. Example: b

body   string     

Must not be greater than 1000 characters. Example: n

icon   string  optional    

Must not be greater than 500 characters. Example: g

url   string  optional    

Must not be greater than 500 characters. Example: http://www.okuneva.com/fugiat-sunt-nihil-accusantium-harum-mollitia.html

audience   string     

Example: all_devices

Must be one of:
  • all_users
  • users
  • all_devices
  • devices
user_ids   integer[]  optional    

Must match an existing stored value.

device_keys   string[]  optional    

Must match the regex /^(web|device)_\d+$/.

Notifications — Inbox

List Inbox Notifications

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/notifications" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"page\": 16,
    \"per_page\": 22,
    \"unread_only\": 1,
    \"category\": \"broadcast\",
    \"simple\": 0
}"
const url = new URL(
    "http://localhost:8000/api/v1/notifications"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "page": 16,
    "per_page": 22,
    "unread_only": 1,
    "category": "broadcast",
    "simple": 0
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (503):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 60d9f587-3636-47e1-a1f2-432afccbc3dd
vary: Origin
 

{
    "status": "error",
    "message": "Tenant database is not provisioned.",
    "data": null,
    "errors": null
}
 

Request      

GET api/v1/notifications

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

page   integer  optional    

Must be at least 1. Example: 16

per_page   integer  optional    

Must be at least 1. Must not be greater than 100. Example: 22

unread_only   string  optional    

Example: 1

Must be one of:
  • 0
  • 1
category   string  optional    

Example: broadcast

Must be one of:
  • broadcast
  • system
simple   string  optional    

Example: 0

Must be one of:
  • 0
  • 1

Unread Notification Count

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/notifications/unread-count" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/notifications/unread-count"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (503):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 078b8901-adcf-47b0-a006-a46bf17d7bd6
vary: Origin
 

{
    "status": "error",
    "message": "Tenant database is not provisioned.",
    "data": null,
    "errors": null
}
 

Request      

GET api/v1/notifications/unread-count

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Mark All Notifications Read

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/notifications/read-all" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/notifications/read-all"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/notifications/read-all

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

List Sent Broadcast Batches

requires authentication

Requires notifications.send.

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/notifications/sent-batches" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/notifications/sent-batches"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (503):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 0d33d9a4-902b-44ac-a790-a79620eb3584
vary: Origin
 

{
    "status": "error",
    "message": "Tenant database is not provisioned.",
    "data": null,
    "errors": null
}
 

Request      

GET api/v1/notifications/sent-batches

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Mark Notification Read

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/notifications/architecto/read" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/notifications/architecto/read"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/notifications/{id}/read

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

id   string     

The ID of the notification. Example: architecto

User Management

Endpoints for querying, managing, impersonating, and exporting users.

Export User Data

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/users/export" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"format\": \"xls\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/users/export"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "format": "xls"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (503):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 2bbc99e6-ff2c-43ba-a9a2-4ed9e51a424b
vary: Origin
 

{
    "status": "error",
    "message": "Tenant database is not provisioned.",
    "data": null,
    "errors": null
}
 

Request      

GET api/v1/users/export

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

format   string  optional    

Example: xls

Must be one of:
  • csv
  • xlsx
  • xls

Impersonate User

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/users/1/impersonate" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/users/1/impersonate"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/users/{user_id}/impersonate

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

user_id   integer     

The ID of the user. Example: 1

Stop Impersonating User

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/users/stop-impersonating" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/users/stop-impersonating"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/users/stop-impersonating

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

List Users (Filtered & Sorted)

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/users" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"per_page\": 1,
    \"filter\": {
        \"name\": \"n\",
        \"email\": \"ashly64@example.com\"
    },
    \"sort\": \"v\",
    \"include\": \"d\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/users"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "per_page": 1,
    "filter": {
        "name": "n",
        "email": "ashly64@example.com"
    },
    "sort": "v",
    "include": "d"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (503):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 7760a9e3-cbf7-4d5b-b5b3-5043586c91f3
vary: Origin
 

{
    "status": "error",
    "message": "Tenant database is not provisioned.",
    "data": null,
    "errors": null
}
 

Request      

GET api/v1/users

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

per_page   integer  optional    

Must be at least 1. Must not be greater than 100. Example: 1

filter   object  optional    
name   string  optional    

Must not be greater than 255 characters. Example: n

email   string  optional    

Must not be greater than 255 characters. Example: ashly64@example.com

sort   string  optional    

Must not be greater than 64 characters. Example: v

include   string  optional    

Must not be greater than 255 characters. Example: d

Get User Details

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/users/1" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/users/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (503):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: ae65eb79-994e-4d1b-8213-054a1e24f4a0
vary: Origin
 

{
    "status": "error",
    "message": "Tenant database is not provisioned.",
    "data": null,
    "errors": null
}
 

Request      

GET api/v1/users/{user_id}

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

user_id   integer     

The ID of the user. Example: 1

Create User

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/users" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"name\": \"b\",
    \"password\": \"architecto\",
    \"is_active\": true,
    \"has_license\": false,
    \"roles\": [
        \"architecto\"
    ],
    \"email\": \"zbailey@example.net\",
    \"username\": \"i\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/users"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "name": "b",
    "password": "architecto",
    "is_active": true,
    "has_license": false,
    "roles": [
        "architecto"
    ],
    "email": "zbailey@example.net",
    "username": "i"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/users

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

name   string     

Must not be greater than 255 characters. Example: b

password   string     

Example: architecto

is_active   boolean  optional    

Example: true

has_license   boolean  optional    

Example: false

roles   string[]  optional    

Must match an existing stored value.

email   string  optional    

Must be a valid email address. Must not be greater than 255 characters. Example: zbailey@example.net

username   string  optional    

This field is required when email is not present. Must match the regex /^[a-z0-9][a-z0-9._-]{2,31}$/. Must not be greater than 32 characters. Example: i

Update User

requires authentication

Example request:
curl --request PUT \
    "http://localhost:8000/api/v1/users/1" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"name\": \"b\",
    \"is_active\": false,
    \"has_license\": true,
    \"roles\": [
        \"architecto\"
    ],
    \"email\": \"zbailey@example.net\",
    \"username\": \"i\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/users/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "name": "b",
    "is_active": false,
    "has_license": true,
    "roles": [
        "architecto"
    ],
    "email": "zbailey@example.net",
    "username": "i"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PUT api/v1/users/{user_id}

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

user_id   integer     

The ID of the user. Example: 1

Body Parameters

name   string  optional    

Must not be greater than 255 characters. Example: b

password   string  optional    
is_active   boolean  optional    

Example: false

has_license   boolean  optional    

Example: true

roles   string[]  optional    

Must match an existing stored value.

email   string  optional    

Must be a valid email address. Must not be greater than 255 characters. Example: zbailey@example.net

username   string  optional    

Must match the regex /^[a-z0-9][a-z0-9._-]{2,31}$/. Must not be greater than 32 characters. Example: i

Update User

requires authentication

Example request:
curl --request PATCH \
    "http://localhost:8000/api/v1/users/1" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"name\": \"b\",
    \"is_active\": false,
    \"has_license\": true,
    \"roles\": [
        \"architecto\"
    ],
    \"email\": \"zbailey@example.net\",
    \"username\": \"i\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/users/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "name": "b",
    "is_active": false,
    "has_license": true,
    "roles": [
        "architecto"
    ],
    "email": "zbailey@example.net",
    "username": "i"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PATCH api/v1/users/{user_id}

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

user_id   integer     

The ID of the user. Example: 1

Body Parameters

name   string  optional    

Must not be greater than 255 characters. Example: b

password   string  optional    
is_active   boolean  optional    

Example: false

has_license   boolean  optional    

Example: true

roles   string[]  optional    

Must match an existing stored value.

email   string  optional    

Must be a valid email address. Must not be greater than 255 characters. Example: zbailey@example.net

username   string  optional    

Must match the regex /^[a-z0-9][a-z0-9._-]{2,31}$/. Must not be greater than 32 characters. Example: i

Delete User

requires authentication

Example request:
curl --request DELETE \
    "http://localhost:8000/api/v1/users/1" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/users/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/users/{user_id}

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

user_id   integer     

The ID of the user. Example: 1

Restore User

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/users/1/restore" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/users/1/restore"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/users/{id}/restore

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

id   integer     

The ID of the user. Example: 1

Role & Permission Management

Endpoints for managing RBAC Roles and Permissions.

List Permissions

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/permissions" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"filter\": {
        \"name\": \"b\"
    }
}"
const url = new URL(
    "http://localhost:8000/api/v1/permissions"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "filter": {
        "name": "b"
    }
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (503):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 0423d3f2-f1c9-4675-86ce-2a6ce1697e98
vary: Origin
 

{
    "status": "error",
    "message": "Tenant database is not provisioned.",
    "data": null,
    "errors": null
}
 

Request      

GET api/v1/permissions

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

filter   object  optional    
name   string  optional    

Must not be greater than 255 characters. Example: b

List Roles

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/roles" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/roles"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (503):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: e50301d9-489d-47d0-a9a9-2e013ae06cbc
vary: Origin
 

{
    "status": "error",
    "message": "Tenant database is not provisioned.",
    "data": null,
    "errors": null
}
 

Request      

GET api/v1/roles

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Get Role Details

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/roles/1" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/roles/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (503):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 3b5842ed-4077-4513-ae66-c09d32d2b53b
vary: Origin
 

{
    "status": "error",
    "message": "Tenant database is not provisioned.",
    "data": null,
    "errors": null
}
 

Request      

GET api/v1/roles/{role_id}

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

role_id   integer     

The ID of the role. Example: 1

Create Role

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/roles" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"name\": \"architecto\",
    \"display_name\": \"n\",
    \"permissions\": [
        \"architecto\"
    ]
}"
const url = new URL(
    "http://localhost:8000/api/v1/roles"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "name": "architecto",
    "display_name": "n",
    "permissions": [
        "architecto"
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/roles

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

name   string     

Example: architecto

display_name   string  optional    

Must not be greater than 255 characters. Example: n

permissions   string[]  optional    

Must match an existing stored value.

Update Role

requires authentication

Example request:
curl --request PUT \
    "http://localhost:8000/api/v1/roles/1" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"name\": \"architecto\",
    \"display_name\": \"n\",
    \"permissions\": [
        \"architecto\"
    ]
}"
const url = new URL(
    "http://localhost:8000/api/v1/roles/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "name": "architecto",
    "display_name": "n",
    "permissions": [
        "architecto"
    ]
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PUT api/v1/roles/{role_id}

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

role_id   integer     

The ID of the role. Example: 1

Body Parameters

name   string  optional    

Example: architecto

display_name   string  optional    

Must not be greater than 255 characters. Example: n

permissions   string[]  optional    

Must match an existing stored value.

Update Role

requires authentication

Example request:
curl --request PATCH \
    "http://localhost:8000/api/v1/roles/1" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"name\": \"architecto\",
    \"display_name\": \"n\",
    \"permissions\": [
        \"architecto\"
    ]
}"
const url = new URL(
    "http://localhost:8000/api/v1/roles/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "name": "architecto",
    "display_name": "n",
    "permissions": [
        "architecto"
    ]
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PATCH api/v1/roles/{role_id}

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

role_id   integer     

The ID of the role. Example: 1

Body Parameters

name   string  optional    

Example: architecto

display_name   string  optional    

Must not be greater than 255 characters. Example: n

permissions   string[]  optional    

Must match an existing stored value.

Delete Role

requires authentication

Example request:
curl --request DELETE \
    "http://localhost:8000/api/v1/roles/1" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/roles/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/roles/{role_id}

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

role_id   integer     

The ID of the role. Example: 1

Restore Role

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/roles/1/restore" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/roles/1/restore"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/roles/{id}/restore

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

id   integer     

The ID of the role. Example: 1

Audit Trail & Activity Logs

Endpoints for monitoring administrator and user action audit logs.

Export Activity Logs

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/activity-logs/export" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"format\": \"csv\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/activity-logs/export"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "format": "csv"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 1d3231b9-517b-4011-8f78-ee902a4a8245
vary: Origin
 

{
    "message": "Server Error"
}
 

Request      

GET api/v1/activity-logs/export

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

format   string  optional    

Example: csv

Must be one of:
  • csv
  • xlsx
  • xls

List Activity Logs

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/activity-logs" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"per_page\": 1,
    \"filter\": {
        \"log_name\": \"n\",
        \"description\": \"Animi quos velit et fugiat.\",
        \"event\": \"d\",
        \"from\": \"2026-09-04T13:56:46\",
        \"to\": \"2026-09-04T13:56:46\"
    },
    \"sort\": \"l\",
    \"include\": \"j\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/activity-logs"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "per_page": 1,
    "filter": {
        "log_name": "n",
        "description": "Animi quos velit et fugiat.",
        "event": "d",
        "from": "2026-09-04T13:56:46",
        "to": "2026-09-04T13:56:46"
    },
    "sort": "l",
    "include": "j"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (503):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 9c9845bb-44f1-4311-b356-3b7d24aee0f3
vary: Origin
 

{
    "status": "error",
    "message": "Tenant database is not provisioned.",
    "data": null,
    "errors": null
}
 

Request      

GET api/v1/activity-logs

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

per_page   integer  optional    

Must be at least 1. Must not be greater than 100. Example: 1

filter   object  optional    
log_name   string  optional    

Must not be greater than 255 characters. Example: n

description   string  optional    

Must not be greater than 255 characters. Example: Animi quos velit et fugiat.

event   string  optional    

Must not be greater than 255 characters. Example: d

from   string  optional    

Must be a valid date. Example: 2026-09-04T13:56:46

to   string  optional    

Must be a valid date. Example: 2026-09-04T13:56:46

sort   string  optional    

Must not be greater than 64 characters. Example: l

include   string  optional    

Must not be greater than 255 characters. Example: j

Endpoints

POST api/v1/central/auth/two-factor/verify

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/central/auth/two-factor/verify" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"challenge_token\": \"bngzmiyvdljnikhwaykcmyuwpwlvqwrsitcpscqldzsnrwtujwvlxjklqppwqbewtnn\",
    \"code\": \"architecto\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/central/auth/two-factor/verify"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "challenge_token": "bngzmiyvdljnikhwaykcmyuwpwlvqwrsitcpscqldzsnrwtujwvlxjklqppwqbewtnn",
    "code": "architecto"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/central/auth/two-factor/verify

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

challenge_token   string     

Must be at least 32 characters. Example: bngzmiyvdljnikhwaykcmyuwpwlvqwrsitcpscqldzsnrwtujwvlxjklqppwqbewtnn

code   string     

Example: architecto

GET api/v1/central/auth/two-factor/status

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/central/auth/two-factor/status" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/auth/two-factor/status"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (500):

Show headers
cache-control: no-store, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 7ff149f4-3e75-4a37-accf-7aed4ecbf6a0
vary: Origin
 

{
    "message": "Server Error"
}
 

Request      

GET api/v1/central/auth/two-factor/status

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

POST api/v1/central/auth/two-factor/setup

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/central/auth/two-factor/setup" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/auth/two-factor/setup"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/central/auth/two-factor/setup

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

POST api/v1/central/auth/two-factor/confirm

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/central/auth/two-factor/confirm" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"code\": \"bngzmi\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/central/auth/two-factor/confirm"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "code": "bngzmi"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/central/auth/two-factor/confirm

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

code   string     

Must be 6 characters. Example: bngzmi

POST api/v1/central/auth/two-factor/disable

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/central/auth/two-factor/disable" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"code\": \"architecto\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/central/auth/two-factor/disable"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "code": "architecto"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/central/auth/two-factor/disable

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

code   string     

Example: architecto

POST api/v1/central/auth/two-factor/recovery-codes

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/central/auth/two-factor/recovery-codes" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"code\": \"architecto\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/central/auth/two-factor/recovery-codes"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "code": "architecto"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/central/auth/two-factor/recovery-codes

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

code   string     

Example: architecto

POST api/v1/central/tenants/{tenant}/export

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/central/tenants/acme/export" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/tenants/acme/export"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/central/tenants/{tenant}/export

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

tenant   string     

The tenant. Example: acme

GET api/v1/central/tenants/{tenant}/exports/{filename}

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/central/tenants/acme/exports/tenant_export_--..zip" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/tenants/acme/exports/tenant_export_--..zip"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: cd146292-8090-486f-9f83-367266af6c3f
vary: Origin
 

{
    "message": "Server Error"
}
 

Request      

GET api/v1/central/tenants/{tenant}/exports/{filename}

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

tenant   string     

The tenant. Example: acme

filename   string     

Example: tenant_export_--..zip

GET api/v1/central/tenants/{tenant}/api-keys

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/central/tenants/acme/api-keys" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/tenants/acme/api-keys"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 4ba123a2-25e0-4421-b746-beb163f0e3c3
vary: Origin
 

{
    "message": "Server Error"
}
 

Request      

GET api/v1/central/tenants/{tenant}/api-keys

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

tenant   string     

The tenant. Example: acme

POST api/v1/central/tenants/{tenant}/api-keys

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/central/tenants/acme/api-keys" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"name\": \"b\",
    \"abilities\": [
        \"z_e6zpjx\"
    ],
    \"expires_at\": \"2052-09-28\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/central/tenants/acme/api-keys"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "name": "b",
    "abilities": [
        "z_e6zpjx"
    ],
    "expires_at": "2052-09-28"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/central/tenants/{tenant}/api-keys

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

tenant   string     

The tenant. Example: acme

Body Parameters

name   string     

Must not be greater than 120 characters. Example: b

abilities   string[]     

Must match the regex /^[a-z][a-z0-9_.:-]{1,100}$/.

expires_at   string  optional    

Must be a valid date. Must be a date after now. Example: 2052-09-28

DELETE api/v1/central/tenants/{tenant}/api-keys/{apiKey}

requires authentication

Example request:
curl --request DELETE \
    "http://localhost:8000/api/v1/central/tenants/acme/api-keys/564" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/central/tenants/acme/api-keys/564"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/central/tenants/{tenant}/api-keys/{apiKey}

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

tenant   string     

The tenant. Example: acme

apiKey   string     

Example: 564

GET api/v1/chat/conversations

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/chat/conversations" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/chat/conversations"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (503):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 25fb06bf-c125-4190-a3df-bccc0cb300fc
vary: Origin
 

{
    "status": "error",
    "message": "Tenant database is not provisioned.",
    "data": null,
    "errors": null
}
 

Request      

GET api/v1/chat/conversations

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

POST api/v1/chat/conversations

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/chat/conversations" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"recipient_id\": 16
}"
const url = new URL(
    "http://localhost:8000/api/v1/chat/conversations"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "recipient_id": 16
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/chat/conversations

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

recipient_id   integer     

Must match an existing stored value. Example: 16

GET api/v1/chat/conversations/{conversation}/messages

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/chat/conversations/architecto/messages" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"before_id\": 16,
    \"since_id\": 39,
    \"limit\": 7
}"
const url = new URL(
    "http://localhost:8000/api/v1/chat/conversations/architecto/messages"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "before_id": 16,
    "since_id": 39,
    "limit": 7
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (503):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: b76a69fe-8dc8-4ed3-863b-c57df9ae79cb
vary: Origin
 

{
    "status": "error",
    "message": "Tenant database is not provisioned.",
    "data": null,
    "errors": null
}
 

Request      

GET api/v1/chat/conversations/{conversation}/messages

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

conversation   string     

The conversation. Example: architecto

Body Parameters

before_id   integer  optional    

Must be at least 1. Example: 16

since_id   integer  optional    

Must be at least 0. Example: 39

limit   integer  optional    

Must be at least 1. Must not be greater than 50. Example: 7

POST api/v1/chat/conversations/{conversation}/messages

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/chat/conversations/architecto/messages" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"body\": \"b\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/chat/conversations/architecto/messages"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "body": "b"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/chat/conversations/{conversation}/messages

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

conversation   string     

The conversation. Example: architecto

Body Parameters

body   string     

Must be at least 1 character. Must not be greater than 2000 characters. Example: b

POST api/v1/chat/conversations/{conversation}/read

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/chat/conversations/architecto/read" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/chat/conversations/architecto/read"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/chat/conversations/{conversation}/read

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

URL Parameters

conversation   string     

The conversation. Example: architecto

GET api/v1/chat/unread-count

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/chat/unread-count" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/chat/unread-count"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (503):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 6957018d-7b20-4165-9958-70c8710e6098
vary: Origin
 

{
    "status": "error",
    "message": "Tenant database is not provisioned.",
    "data": null,
    "errors": null
}
 

Request      

GET api/v1/chat/unread-count

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

GET api/v1/chat/users

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/chat/users" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"search\": \"b\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/chat/users"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "search": "b"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (503):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 3ed52c5a-9925-40ad-bac8-cd8db644cdf1
vary: Origin
 

{
    "status": "error",
    "message": "Tenant database is not provisioned.",
    "data": null,
    "errors": null
}
 

Request      

GET api/v1/chat/users

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

search   string  optional    

Must not be greater than 100 characters. Example: b

Example tenant resource

requires authentication

Accepts either a tenant user's Bearer token or a tenant integration key with the example.read ability.

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/example" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "X-Api-Key: tk_your_tenant_integration_secret Integration authentication alternative to Bearer." \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/example"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "X-Api-Key": "tk_your_tenant_integration_secret Integration authentication alternative to Bearer.",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 3deebcb1-2cea-4cc5-8b8a-843f33f1c457
vary: Origin
 

{
    "message": "Server Error"
}
 

Request      

GET api/v1/example

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

X-Api-Key        

Example: tk_your_tenant_integration_secret Integration authentication alternative to Bearer.

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

POST api/v1/auth/two-factor/verify

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/auth/two-factor/verify" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"challenge_token\": \"bngzmiyvdljnikhwaykcmyuwpwlvqwrsitcpscqldzsnrwtujwvlxjklqppwqbewtnn\",
    \"code\": \"architecto\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/auth/two-factor/verify"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "challenge_token": "bngzmiyvdljnikhwaykcmyuwpwlvqwrsitcpscqldzsnrwtujwvlxjklqppwqbewtnn",
    "code": "architecto"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/auth/two-factor/verify

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

challenge_token   string     

Must be at least 32 characters. Example: bngzmiyvdljnikhwaykcmyuwpwlvqwrsitcpscqldzsnrwtujwvlxjklqppwqbewtnn

code   string     

Example: architecto

GET api/v1/auth/two-factor/status

requires authentication

Example request:
curl --request GET \
    --get "http://localhost:8000/api/v1/auth/two-factor/status" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/auth/two-factor/status"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (503):

Show headers
cache-control: no-store, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
x-request-id: 5b6adb56-46fa-47c6-a1e4-f0ec4d6cd52d
vary: Origin
 

{
    "status": "error",
    "message": "Tenant database is not provisioned.",
    "data": null,
    "errors": null
}
 

Request      

GET api/v1/auth/two-factor/status

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

POST api/v1/auth/two-factor/setup

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/auth/two-factor/setup" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo"
const url = new URL(
    "http://localhost:8000/api/v1/auth/two-factor/setup"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/auth/two-factor/setup

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

POST api/v1/auth/two-factor/confirm

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/auth/two-factor/confirm" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"code\": \"bngzmi\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/auth/two-factor/confirm"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "code": "bngzmi"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/auth/two-factor/confirm

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

code   string     

Must be 6 characters. Example: bngzmi

POST api/v1/auth/two-factor/disable

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/auth/two-factor/disable" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"code\": \"architecto\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/auth/two-factor/disable"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "code": "architecto"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/auth/two-factor/disable

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

code   string     

Example: architecto

POST api/v1/auth/two-factor/recovery-codes

requires authentication

Example request:
curl --request POST \
    "http://localhost:8000/api/v1/auth/two-factor/recovery-codes" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "X-Tenant: demo" \
    --data "{
    \"code\": \"architecto\"
}"
const url = new URL(
    "http://localhost:8000/api/v1/auth/two-factor/recovery-codes"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Tenant": "demo",
};

let body = {
    "code": "architecto"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/auth/two-factor/recovery-codes

Headers

Authorization        

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

X-Tenant        

Example: demo

Body Parameters

code   string     

Example: architecto