Users
Generated from
DialerDigital/corecommit6e9f026f0a72— specopenapi/dialer-v1.yamlv0.36.0. Do not edit by hand; see How this reference is built. Download the OpenAPI spec.
Dashboard user accounts (email + password; disabled, never deleted).
Endpoints
| Method | Path | Summary |
|---|---|---|
GET | /v1/users | List dashboard users |
POST | /v1/users | Create a dashboard user |
DELETE | /v1/users/{id} | Disable a user (never deletes) |
POST | /v1/users/{id}/enable | Re-enable a disabled user |
List dashboard users
GET /v1/usersEmails, names, status and login timestamps — password hashes are never exposed.
Responses
200
The tenant's dashboard users.
| Field | Type | Required | Description |
|---|---|---|---|
users | array of User | yes | |
users[].id | string (uuid) | no | |
users[].email | string (email) | no | Global login identifier, stored lowercase. |
users[].name | string | no | |
users[].status | active · disabled | no | |
users[].role | member · account_admin | no | Intra-account privilege. Only an account_admin may create or modify the empresa-wide rows every sibling sede inherits (scope: "empresa" on carriers and SMS providers); a member gets 403. Read-only here: promotion is an operator gesture, never a request. |
users[].password_updated_at | string (date-time) | no | |
users[].last_login_at | string (date-time) | null | no | |
users[].created_at | string (date-time) | no | |
users[].updated_at | string (date-time) | no |
401 — Unauthorized
Missing, unknown or revoked API key (or, on /v1/admin/*, a bad/unset admin token; on webhooks, a bad/missing signature).
{
"error": {
"code": "unauthorized",
"message": "invalid or revoked API key"
}
}403 — Forbidden
The tenant is suspended.
{
"error": {
"code": "forbidden",
"message": "tenant is suspended"
}
}Create a dashboard user
POST /v1/usersBootstrap runs with the dd_ machine key (it creates the FIRST user); after that any ddu_ session can manage users (all users are console admins day-1). The email is the GLOBAL login identifier (stored lowercase, unique across tenants — 409 on any duplicate). The password never persists in plaintext (PBKDF2-SHA512 at rest) and is never echoed back. tenant_id is never read from the body.
Request body (JSON, required)
| Field | Type | Required | Description |
|---|---|---|---|
email | string (email) | yes | |
name | string | no | |
password | string (password) | yes |
{
"email": "[email protected]",
"name": "Ops Admin",
"password": "a-long-passphrase-here"
}Responses
201
The created user (no secret material).
| Field | Type | Required | Description |
|---|---|---|---|
user | object (User) | yes | A dashboard user — the password hash is never exposed. |
user.id | string (uuid) | no | |
user.email | string (email) | no | Global login identifier, stored lowercase. |
user.name | string | no | |
user.status | active · disabled | no | |
user.role | member · account_admin | no | Intra-account privilege. Only an account_admin may create or modify the empresa-wide rows every sibling sede inherits (scope: "empresa" on carriers and SMS providers); a member gets 403. Read-only here: promotion is an operator gesture, never a request. |
user.password_updated_at | string (date-time) | no | |
user.last_login_at | string (date-time) | null | no | |
user.created_at | string (date-time) | no | |
user.updated_at | string (date-time) | no |
400 — BadRequest
Malformed request (shape/type errors, invalid filters, bad timestamps).
{
"error": {
"code": "bad_request",
"message": "from must be RFC-3339"
}
}401 — Unauthorized
Missing, unknown or revoked API key (or, on /v1/admin/*, a bad/unset admin token; on webhooks, a bad/missing signature).
{
"error": {
"code": "unauthorized",
"message": "invalid or revoked API key"
}
}403 — Forbidden
The tenant is suspended.
{
"error": {
"code": "forbidden",
"message": "tenant is suspended"
}
}409 — Conflict
Invalid state transition, uniqueness conflict, or a seat that is busy/reserved.
{
"error": {
"code": "conflict",
"message": "invalid state transition"
}
}Disable a user (never deletes)
DELETE /v1/users/{id}Sets status: disabled AND revokes every live session the user holds (their bearer dies at the next request). Idempotent. Users are audit evidence — rows never delete; re-enable via POST /v1/users/{id}/enable.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string (uuid) | yes | Resource UUID. Malformed or cross-tenant ids read as 404. |
Responses
200
The disabled user.
| Field | Type | Required | Description |
|---|---|---|---|
user | object (User) | yes | A dashboard user — the password hash is never exposed. |
user.id | string (uuid) | no | |
user.email | string (email) | no | Global login identifier, stored lowercase. |
user.name | string | no | |
user.status | active · disabled | no | |
user.role | member · account_admin | no | Intra-account privilege. Only an account_admin may create or modify the empresa-wide rows every sibling sede inherits (scope: "empresa" on carriers and SMS providers); a member gets 403. Read-only here: promotion is an operator gesture, never a request. |
user.password_updated_at | string (date-time) | no | |
user.last_login_at | string (date-time) | null | no | |
user.created_at | string (date-time) | no | |
user.updated_at | string (date-time) | no |
401 — Unauthorized
Missing, unknown or revoked API key (or, on /v1/admin/*, a bad/unset admin token; on webhooks, a bad/missing signature).
{
"error": {
"code": "unauthorized",
"message": "invalid or revoked API key"
}
}403 — Forbidden
The tenant is suspended.
{
"error": {
"code": "forbidden",
"message": "tenant is suspended"
}
}404 — NotFound
Unknown id, malformed (non-UUID) id OR another tenant's id — RLS returns zero rows, so all three are indistinguishable by design (no existence leak, never a 403 for foreign ids).
{
"error": {
"code": "not_found",
"message": "resource not found for this tenant"
}
}Re-enable a disabled user
POST /v1/users/{id}/enableSessions revoked at disable STAY revoked — the user logs in fresh.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string (uuid) | yes | Resource UUID. Malformed or cross-tenant ids read as 404. |
Responses
200
The re-enabled user.
| Field | Type | Required | Description |
|---|---|---|---|
user | object (User) | yes | A dashboard user — the password hash is never exposed. |
user.id | string (uuid) | no | |
user.email | string (email) | no | Global login identifier, stored lowercase. |
user.name | string | no | |
user.status | active · disabled | no | |
user.role | member · account_admin | no | Intra-account privilege. Only an account_admin may create or modify the empresa-wide rows every sibling sede inherits (scope: "empresa" on carriers and SMS providers); a member gets 403. Read-only here: promotion is an operator gesture, never a request. |
user.password_updated_at | string (date-time) | no | |
user.last_login_at | string (date-time) | null | no | |
user.created_at | string (date-time) | no | |
user.updated_at | string (date-time) | no |
401 — Unauthorized
Missing, unknown or revoked API key (or, on /v1/admin/*, a bad/unset admin token; on webhooks, a bad/missing signature).
{
"error": {
"code": "unauthorized",
"message": "invalid or revoked API key"
}
}403 — Forbidden
The tenant is suspended.
{
"error": {
"code": "forbidden",
"message": "tenant is suspended"
}
}404 — NotFound
Unknown id, malformed (non-UUID) id OR another tenant's id — RLS returns zero rows, so all three are indistinguishable by design (no existence leak, never a 403 for foreign ids).
{
"error": {
"code": "not_found",
"message": "resource not found for this tenant"
}
}