Authentication service#

This service provides operations for managing user and org profiles/settings. Its name is a bit of a misnomer.

OpenAPI file: AuthenticationServiceV2.json

Endpoints#

Get my profile#

GET /authentication/v2/my/profile

Gets the profile of the authenticated user.

Request

No parameters and no body.

Response

rid string (RID)

​

orgRid string (RID)

​

email string

​

displayName string

​

avatarUrl string

Avatar URL or a default avatar if the user does not have one.

createdAt string (date-time)

​

Request

curl "https://api.gov.nominal.io/api/authentication/v2/my/profile" \
  -H "Authorization: Bearer <api key>"
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/authentication/v2/my/profile",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.get(
    "https://api.gov.nominal.io/api/authentication/v2/my/profile",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.get(
            "https://api.gov.nominal.io/api/authentication/v2/my/profile",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

{
  "rid": "<user rid>",
  "orgRid": "<org rid>",
  "email": "<email>",
  "displayName": "<display name>",
  "avatarUrl": "<avatar url>",
  "createdAt": "2026-01-01T00:00:00Z"
}

Update my profile#

PUT /authentication/v2/my/profile

Updates the profile of the authenticated user.

Body

displayName string required

​

Response

rid string (RID)

​

orgRid string (RID)

​

email string

​

displayName string

​

avatarUrl string

Avatar URL or a default avatar if the user does not have one.

createdAt string (date-time)

​

Request

curl -X PUT "https://api.gov.nominal.io/api/authentication/v2/my/profile" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "displayName": "<display name>"
}'
import requests

response = requests.put(
    "https://api.gov.nominal.io/api/authentication/v2/my/profile",
    headers={"Authorization": "Bearer <api key>"},
    json={"displayName": "<display name>"},
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.put(
    "https://api.gov.nominal.io/api/authentication/v2/my/profile",
    headers={"Authorization": "Bearer <api key>"},
    json={"displayName": "<display name>"},
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.put(
            "https://api.gov.nominal.io/api/authentication/v2/my/profile",
            headers={"Authorization": "Bearer <api key>"},
            json={"displayName": "<display name>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

{
  "rid": "<user rid>",
  "orgRid": "<org rid>",
  "email": "<email>",
  "displayName": "<display name>",
  "avatarUrl": "<avatar url>",
  "createdAt": "2026-01-01T00:00:00Z"
}

Get my settings#

GET /authentication/v2/my/settings

Gets the settings of the authenticated user.

Request

No parameters and no body.

Response

defaultTimeRangeType DefaultTimeRangeTypeSetting

​

Values of DefaultTimeRangeTypeSetting
DEFAULT

​

ABSOLUTE

​

RELATIVE

​

appearance AppearanceSetting

​

Values of AppearanceSetting
SYSTEM

​

LIGHT

​

DARK

​

timezone TimezoneSetting

​

Values of TimezoneSetting
LOCAL

​

UTC

​

timeSeriesHoverTooltipConcise boolean deprecated

Deprecated: Use chartHoverTooltipMode instead. If chartHoverTooltipMode is not set, this field will be used: true as SINGLE and false as VERBOSE.

chartHoverTooltipMode ChartTooltipModeSetting

​

Values of ChartTooltipModeSetting
VERBOSE

​

CONCISE

​

MULTI_ROW_CONCISE

​

SINGLE

​

NONE

​

defaultNumberFormats DefaultNumberFormatConfigurations

​

Fields of DefaultNumberFormatConfigurations
data NumberFormat

Default number format for data values, e.g. chart tooltip and value table cell values.

Fields of NumberFormat
sigFigs integer

Include the specified number of significant figures, rounding if needed.

displayOption NumberFormatDisplayOption

The base display format for the number.

Values of NumberFormatDisplayOption
SCIENTIFIC

​

SUCCINCT

​

LOCALE

​

PLAIN

​

fixedDecimalPlaces integer deprecated

Deprecated: use decimalPlaces instead

decimalPlaces DecimalPlaces

Options for formatting the decimal part of number.

Set type to "fixed".

fixed FixedDecimalPlaces

​

Fields of FixedDecimalPlaces
places integer

​

Set type to "max".

max MaxDecimalPlaces

​

Fields of MaxDecimalPlaces
places integer

​

relativeTimestampFormat RelativeTimestampFormat

Relative timestamp display preference.

Set type to "temporalSubunits".

temporalSubunits TemporalSubunitsRelativeTimestampFormat

​

Set type to "totalSeconds".

totalSeconds TotalSecondsRelativeTimestampFormat

​

vimModeEnabled boolean

​

defaultWorkbookVisibleInSearch boolean

Whether newly created workbooks are visible in search by default. If absent, the organization default applies.

Request

curl "https://api.gov.nominal.io/api/authentication/v2/my/settings" \
  -H "Authorization: Bearer <api key>"
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/authentication/v2/my/settings",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.get(
    "https://api.gov.nominal.io/api/authentication/v2/my/settings",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.get(
            "https://api.gov.nominal.io/api/authentication/v2/my/settings",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

{
  "defaultTimeRangeType": "DEFAULT",
  "appearance": "SYSTEM",
  "timezone": "LOCAL",
  "timeSeriesHoverTooltipConcise": true,
  "chartHoverTooltipMode": "VERBOSE",
  "defaultNumberFormats": {
    "data": {
      "sigFigs": 1,
      "displayOption": "SCIENTIFIC",
      "fixedDecimalPlaces": 1,
      "decimalPlaces": {
        "type": "fixed",
        "fixed": {
          "places": 1
        }
      }
    }
  },
  "relativeTimestampFormat": {
    "type": "temporalSubunits",
    "temporalSubunits": {}
  },
  "vimModeEnabled": true,
  "defaultWorkbookVisibleInSearch": true
}

Update my settings#

PUT /authentication/v2/my/settings

Updates the settings of the authenticated user.

Body

defaultTimeRangeType DefaultTimeRangeTypeSetting

​

Values of DefaultTimeRangeTypeSetting
DEFAULT

​

ABSOLUTE

​

RELATIVE

​

appearance AppearanceSetting

​

Values of AppearanceSetting
SYSTEM

​

LIGHT

​

DARK

​

timezone TimezoneSetting

​

Values of TimezoneSetting
LOCAL

​

UTC

​

timeSeriesHoverTooltipConcise boolean deprecated

Deprecated: Use chartHoverTooltipMode instead. If chartHoverTooltipMode is not set, this field will be used: true as SINGLE and false as VERBOSE.

chartHoverTooltipMode ChartTooltipModeSetting

​

Values of ChartTooltipModeSetting
VERBOSE

​

CONCISE

​

MULTI_ROW_CONCISE

​

SINGLE

​

NONE

​

defaultNumberFormats DefaultNumberFormatConfigurations

​

Fields of DefaultNumberFormatConfigurations
data NumberFormat

Default number format for data values, e.g. chart tooltip and value table cell values.

Fields of NumberFormat
sigFigs integer

Include the specified number of significant figures, rounding if needed.

displayOption NumberFormatDisplayOption

The base display format for the number.

Values of NumberFormatDisplayOption
SCIENTIFIC

​

SUCCINCT

​

LOCALE

​

PLAIN

​

fixedDecimalPlaces integer deprecated

Deprecated: use decimalPlaces instead

decimalPlaces DecimalPlaces

Options for formatting the decimal part of number.

Set type to "fixed".

fixed FixedDecimalPlaces

​

Fields of FixedDecimalPlaces
places integer required

​

Set type to "max".

max MaxDecimalPlaces

​

Fields of MaxDecimalPlaces
places integer required

​

relativeTimestampFormat RelativeTimestampFormat

Relative timestamp display preference.

Set type to "temporalSubunits".

temporalSubunits TemporalSubunitsRelativeTimestampFormat

​

Set type to "totalSeconds".

totalSeconds TotalSecondsRelativeTimestampFormat

​

vimModeEnabled boolean

​

defaultWorkbookVisibleInSearch boolean

Whether newly created workbooks are visible in search by default. If absent, the organization default applies.

Response

defaultTimeRangeType DefaultTimeRangeTypeSetting

​

Values of DefaultTimeRangeTypeSetting
DEFAULT

​

ABSOLUTE

​

RELATIVE

​

appearance AppearanceSetting

​

Values of AppearanceSetting
SYSTEM

​

LIGHT

​

DARK

​

timezone TimezoneSetting

​

Values of TimezoneSetting
LOCAL

​

UTC

​

timeSeriesHoverTooltipConcise boolean deprecated

Deprecated: Use chartHoverTooltipMode instead. If chartHoverTooltipMode is not set, this field will be used: true as SINGLE and false as VERBOSE.

chartHoverTooltipMode ChartTooltipModeSetting

​

Values of ChartTooltipModeSetting
VERBOSE

​

CONCISE

​

MULTI_ROW_CONCISE

​

SINGLE

​

NONE

​

defaultNumberFormats DefaultNumberFormatConfigurations

​

Fields of DefaultNumberFormatConfigurations
data NumberFormat

Default number format for data values, e.g. chart tooltip and value table cell values.

Fields of NumberFormat
sigFigs integer

Include the specified number of significant figures, rounding if needed.

displayOption NumberFormatDisplayOption

The base display format for the number.

Values of NumberFormatDisplayOption
SCIENTIFIC

​

SUCCINCT

​

LOCALE

​

PLAIN

​

fixedDecimalPlaces integer deprecated

Deprecated: use decimalPlaces instead

decimalPlaces DecimalPlaces

Options for formatting the decimal part of number.

Set type to "fixed".

fixed FixedDecimalPlaces

​

Fields of FixedDecimalPlaces
places integer

​

Set type to "max".

max MaxDecimalPlaces

​

Fields of MaxDecimalPlaces
places integer

​

relativeTimestampFormat RelativeTimestampFormat

Relative timestamp display preference.

Set type to "temporalSubunits".

temporalSubunits TemporalSubunitsRelativeTimestampFormat

​

Set type to "totalSeconds".

totalSeconds TotalSecondsRelativeTimestampFormat

​

vimModeEnabled boolean

​

defaultWorkbookVisibleInSearch boolean

Whether newly created workbooks are visible in search by default. If absent, the organization default applies.

Request

curl -X PUT "https://api.gov.nominal.io/api/authentication/v2/my/settings" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "defaultTimeRangeType": "DEFAULT",
  "appearance": "SYSTEM",
  "timezone": "LOCAL",
  "timeSeriesHoverTooltipConcise": true,
  "chartHoverTooltipMode": "VERBOSE",
  "defaultNumberFormats": {
    "data": {
      "sigFigs": 1,
      "displayOption": "SCIENTIFIC",
      "fixedDecimalPlaces": 1,
      "decimalPlaces": {
        "type": "fixed",
        "fixed": {
          "places": 1
        }
      }
    }
  },
  "relativeTimestampFormat": {
    "type": "temporalSubunits",
    "temporalSubunits": {}
  },
  "vimModeEnabled": true,
  "defaultWorkbookVisibleInSearch": true
}'
import requests

response = requests.put(
    "https://api.gov.nominal.io/api/authentication/v2/my/settings",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "defaultTimeRangeType": "DEFAULT",
        "appearance": "SYSTEM",
        "timezone": "LOCAL",
        "timeSeriesHoverTooltipConcise": True,
        "chartHoverTooltipMode": "VERBOSE",
        "defaultNumberFormats": {
            "data": {
                "sigFigs": 1,
                "displayOption": "SCIENTIFIC",
                "fixedDecimalPlaces": 1,
                "decimalPlaces": {"type": "fixed", "fixed": {"places": 1}},
            },
        },
        "relativeTimestampFormat": {"type": "temporalSubunits", "temporalSubunits": {}},
        "vimModeEnabled": True,
        "defaultWorkbookVisibleInSearch": True,
    },
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.put(
    "https://api.gov.nominal.io/api/authentication/v2/my/settings",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "defaultTimeRangeType": "DEFAULT",
        "appearance": "SYSTEM",
        "timezone": "LOCAL",
        "timeSeriesHoverTooltipConcise": True,
        "chartHoverTooltipMode": "VERBOSE",
        "defaultNumberFormats": {
            "data": {
                "sigFigs": 1,
                "displayOption": "SCIENTIFIC",
                "fixedDecimalPlaces": 1,
                "decimalPlaces": {"type": "fixed", "fixed": {"places": 1}},
            },
        },
        "relativeTimestampFormat": {"type": "temporalSubunits", "temporalSubunits": {}},
        "vimModeEnabled": True,
        "defaultWorkbookVisibleInSearch": True,
    },
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.put(
            "https://api.gov.nominal.io/api/authentication/v2/my/settings",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "defaultTimeRangeType": "DEFAULT",
                "appearance": "SYSTEM",
                "timezone": "LOCAL",
                "timeSeriesHoverTooltipConcise": True,
                "chartHoverTooltipMode": "VERBOSE",
                "defaultNumberFormats": {
                    "data": {
                        "sigFigs": 1,
                        "displayOption": "SCIENTIFIC",
                        "fixedDecimalPlaces": 1,
                        "decimalPlaces": {"type": "fixed", "fixed": {"places": 1}},
                    },
                },
                "relativeTimestampFormat": {
                    "type": "temporalSubunits",
                    "temporalSubunits": {},
                },
                "vimModeEnabled": True,
                "defaultWorkbookVisibleInSearch": True,
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

{
  "defaultTimeRangeType": "DEFAULT",
  "appearance": "SYSTEM",
  "timezone": "LOCAL",
  "timeSeriesHoverTooltipConcise": true,
  "chartHoverTooltipMode": "VERBOSE",
  "defaultNumberFormats": {
    "data": {
      "sigFigs": 1,
      "displayOption": "SCIENTIFIC",
      "fixedDecimalPlaces": 1,
      "decimalPlaces": {
        "type": "fixed",
        "fixed": {
          "places": 1
        }
      }
    }
  },
  "relativeTimestampFormat": {
    "type": "temporalSubunits",
    "temporalSubunits": {}
  },
  "vimModeEnabled": true,
  "defaultWorkbookVisibleInSearch": true
}

Get my org settings#

GET /authentication/v2/org/settings

Gets the settings of the org of the authenticated user.

Request

No parameters and no body.

Response

defaultTimeRangeType DefaultTimeRangeTypeSetting

​

Values of DefaultTimeRangeTypeSetting
DEFAULT

​

ABSOLUTE

​

RELATIVE

​

defaultWorkbookVisibleInSearch boolean

Whether newly created workbooks are visible in search by default.

Request

curl "https://api.gov.nominal.io/api/authentication/v2/org/settings" \
  -H "Authorization: Bearer <api key>"
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/authentication/v2/org/settings",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.get(
    "https://api.gov.nominal.io/api/authentication/v2/org/settings",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.get(
            "https://api.gov.nominal.io/api/authentication/v2/org/settings",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

{
  "defaultTimeRangeType": "DEFAULT",
  "defaultWorkbookVisibleInSearch": true
}

Update my org settings#

PUT /authentication/v2/org/settings

Updates the settings of the org of the authenticated user.

Body

defaultTimeRangeType DefaultTimeRangeTypeSetting

​

Values of DefaultTimeRangeTypeSetting
DEFAULT

​

ABSOLUTE

​

RELATIVE

​

defaultWorkbookVisibleInSearch boolean

Whether newly created workbooks are visible in search by default.

Response

defaultTimeRangeType DefaultTimeRangeTypeSetting

​

Values of DefaultTimeRangeTypeSetting
DEFAULT

​

ABSOLUTE

​

RELATIVE

​

defaultWorkbookVisibleInSearch boolean

Whether newly created workbooks are visible in search by default.

Request

curl -X PUT "https://api.gov.nominal.io/api/authentication/v2/org/settings" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "defaultTimeRangeType": "DEFAULT",
  "defaultWorkbookVisibleInSearch": true
}'
import requests

response = requests.put(
    "https://api.gov.nominal.io/api/authentication/v2/org/settings",
    headers={"Authorization": "Bearer <api key>"},
    json={"defaultTimeRangeType": "DEFAULT", "defaultWorkbookVisibleInSearch": True},
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.put(
    "https://api.gov.nominal.io/api/authentication/v2/org/settings",
    headers={"Authorization": "Bearer <api key>"},
    json={"defaultTimeRangeType": "DEFAULT", "defaultWorkbookVisibleInSearch": True},
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.put(
            "https://api.gov.nominal.io/api/authentication/v2/org/settings",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "defaultTimeRangeType": "DEFAULT",
                "defaultWorkbookVisibleInSearch": True,
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

{
  "defaultTimeRangeType": "DEFAULT",
  "defaultWorkbookVisibleInSearch": true
}

Search users v2#

POST /authentication/v2/users

Searches for users by email and displayName.

Body

query SearchUsersQuery required

​

Set type to "and".

and array of SearchUsersQuery

​

Set type to "or".

or array of SearchUsersQuery

​

Set type to "exactMatch".

exactMatch string

Performs case insensitive exact match on email

Set type to "searchText".

searchText string

Searches email and display name

sortBy SortBy

UPDATED_AT descending by default

Fields of SortBy
isDescending boolean required

​

field SortByField required

​

Values of SortByField
NAME

​

EMAIL

​

CREATED_AT

​

UPDATED_AT

​

nextPageToken string

​

pageSize integer

Defaults to 100. Will throw if larger than 1_000.

Response

results array of UserV2

​

Fields of UserV2
rid string (RID)

​

orgRid string (RID)

​

email string

​

displayName string

​

avatarUrl string

Avatar URL or a default avatar if the user does not have one.

createdAt string (date-time)

​

nextPageToken string

​

Request

curl -X POST "https://api.gov.nominal.io/api/authentication/v2/users" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "query": {
    "type": "and",
    "and": []
  }
}'
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/authentication/v2/users",
    headers={"Authorization": "Bearer <api key>"},
    json={"query": {"type": "and", "and": []}},
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/authentication/v2/users",
    headers={"Authorization": "Bearer <api key>"},
    json={"query": {"type": "and", "and": []}},
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/authentication/v2/users",
            headers={"Authorization": "Bearer <api key>"},
            json={"query": {"type": "and", "and": []}},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

{
  "results": [
    {
      "rid": "<user rid>",
      "orgRid": "<org rid>",
      "email": "<email>",
      "displayName": "<display name>",
      "avatarUrl": "<avatar url>",
      "createdAt": "2026-01-01T00:00:00Z"
    }
  ],
  "nextPageToken": "<token>"
}

Get users#

POST /authentication/v2/users/batch

Get users by RID. Returns objects for any of the requested RIDs that are members or guests of the caller’s org.

Body

The body is an array of string (RID).

Response

The body is an array of UserV2.

Fields of UserV2
rid string (RID)

​

orgRid string (RID)

​

email string

​

displayName string

​

avatarUrl string

Avatar URL or a default avatar if the user does not have one.

createdAt string (date-time)

​

Request

curl -X POST "https://api.gov.nominal.io/api/authentication/v2/users/batch" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '[
  "<user rid>"
]'
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/authentication/v2/users/batch",
    headers={"Authorization": "Bearer <api key>"},
    json=["<user rid>"],
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/authentication/v2/users/batch",
    headers={"Authorization": "Bearer <api key>"},
    json=["<user rid>"],
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/authentication/v2/users/batch",
            headers={"Authorization": "Bearer <api key>"},
            json=["<user rid>"],
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

[
  {
    "rid": "<user rid>",
    "orgRid": "<org rid>",
    "email": "<email>",
    "displayName": "<display name>",
    "avatarUrl": "<avatar url>",
    "createdAt": "2026-01-01T00:00:00Z"
  }
]

Get user#

GET /authentication/v2/users/{userRid}

Gets a user by RID. Throws if the requested RID is not a member or guest of the caller’s org.

Path parameters

userRid string (RID) required

​

Response

rid string (RID)

​

orgRid string (RID)

​

email string

​

displayName string

​

avatarUrl string

Avatar URL or a default avatar if the user does not have one.

createdAt string (date-time)

​

Request

curl "https://api.gov.nominal.io/api/authentication/v2/users/<user rid>" \
  -H "Authorization: Bearer <api key>"
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/authentication/v2/users/<user rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.get(
    "https://api.gov.nominal.io/api/authentication/v2/users/<user rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.get(
            "https://api.gov.nominal.io/api/authentication/v2/users/<user rid>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

{
  "rid": "<user rid>",
  "orgRid": "<org rid>",
  "email": "<email>",
  "displayName": "<display name>",
  "avatarUrl": "<avatar url>",
  "createdAt": "2026-01-01T00:00:00Z"
}

Get jwks#

GET /authentication/v2/jwks

Returns JWKS (JSON Web Key Set) for MediaMTX JWT verification. Only available if MediaMTX integration is enabled.

No API key needed.

Request

No parameters and no body.

Response

keys array of Jwk

​

Fields of Jwk
kty string

​

kid string

​

use string

​

alg string

​

n string

​

e string

​

Request

curl "https://api.gov.nominal.io/api/authentication/v2/jwks"
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/authentication/v2/jwks",
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.get(
    "https://api.gov.nominal.io/api/authentication/v2/jwks",
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.get(
            "https://api.gov.nominal.io/api/authentication/v2/jwks",
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

{
  "keys": [
    {
      "kty": "<kty>",
      "kid": "<kid>",
      "use": "<use>",
      "alg": "<alg>",
      "n": "<n>",
      "e": "<e>"
    }
  ]
}

Batch preregister users#

POST /authentication/v2/batch-preregister-users

Batch preregister users in the caller’s organization. Only creates new users for emails that don’t already exist — existing accounts are silently skipped and not returned in the response. The caller must be an admin of the organization.

Body

emails array of string

The list of email addresses to preregister. Maximum 1000 entries.

Response

users map of string to UserV2

Map of email to UserV2 for each newly created user.

Fields of UserV2
rid string (RID)

​

orgRid string (RID)

​

email string

​

displayName string

​

avatarUrl string

Avatar URL or a default avatar if the user does not have one.

createdAt string (date-time)

​

Request

curl -X POST "https://api.gov.nominal.io/api/authentication/v2/batch-preregister-users" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "emails": [
    "<emails>"
  ]
}'
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/authentication/v2/batch-preregister-users",
    headers={"Authorization": "Bearer <api key>"},
    json={"emails": ["<emails>"]},
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/authentication/v2/batch-preregister-users",
    headers={"Authorization": "Bearer <api key>"},
    json={"emails": ["<emails>"]},
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/authentication/v2/batch-preregister-users",
            headers={"Authorization": "Bearer <api key>"},
            json={"emails": ["<emails>"]},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

{
  "users": {
    "<key>": {
      "rid": "<user rid>",
      "orgRid": "<org rid>",
      "email": "<email>",
      "displayName": "<display name>",
      "avatarUrl": "<avatar url>",
      "createdAt": "2026-01-01T00:00:00Z"
    }
  }
}

List org login activity#

POST /authentication/v2/admin/org/login-activity

Lists members of one or more orgs together with their most recent login into each org, sorted and paginated. The caller must be an admin of every org requested — defaults to the caller’s own org if none are specified.

Body

orgs array of string (RID)

Defaults to the caller’s own org. The caller must be an admin of every org listed.

isDescending boolean

Sorts by last login time. Defaults to true (most recent login first, with users who have never logged in last). Set to false to sort oldest-first, with users who have never logged in first.

nextPageToken string

​

pageSize integer

Defaults to 100. Will throw if larger than 1_000.

Response

results array of OrgUserLoginActivity

​

Fields of OrgUserLoginActivity
userRid string (RID)

​

orgRid string (RID)

​

lastLoginAt string (date-time)

The most recent time this user logged into orgRid. Absent if they have never logged in.

nextPageToken string

​

Request

curl -X POST "https://api.gov.nominal.io/api/authentication/v2/admin/org/login-activity" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "orgs": [
    "<org rid>"
  ],
  "isDescending": true,
  "nextPageToken": "<token>",
  "pageSize": 1
}'
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/authentication/v2/admin/org/login-activity",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "orgs": ["<org rid>"],
        "isDescending": True,
        "nextPageToken": "<token>",
        "pageSize": 1,
    },
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/authentication/v2/admin/org/login-activity",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "orgs": ["<org rid>"],
        "isDescending": True,
        "nextPageToken": "<token>",
        "pageSize": 1,
    },
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/authentication/v2/admin/org/login-activity",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "orgs": ["<org rid>"],
                "isDescending": True,
                "nextPageToken": "<token>",
                "pageSize": 1,
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

{
  "results": [
    {
      "userRid": "<user rid>",
      "orgRid": "<org rid>",
      "lastLoginAt": "2026-01-01T00:00:00Z"
    }
  ],
  "nextPageToken": "<token>"
}

Deactivate user#

POST /authentication/v2/admin/users/{userRid}/deactivate

Deactivates a user in the caller’s organization, preventing them from obtaining new Nominal session tokens in that org. Also revokes all of the user’s API keys in the caller’s organization. Caller must be an admin of their org. Target user must be a member or guest of the org.

Path parameters

userRid string (RID) required

​

Response

No content (HTTP 204).

Request

curl -X POST "https://api.gov.nominal.io/api/authentication/v2/admin/users/<user rid>/deactivate" \
  -H "Authorization: Bearer <api key>"
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/authentication/v2/admin/users/<user rid>/deactivate",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/authentication/v2/admin/users/<user rid>/deactivate",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/authentication/v2/admin/users/<user rid>/deactivate",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()


asyncio.run(main())

Response: 204

No content.

Reactivate user#

POST /authentication/v2/admin/users/{userRid}/reactivate

Reactivates a user in the caller’s organization. Caller must be an admin of their org. Target user must be a member or guest of the org.

Path parameters

userRid string (RID) required

​

Response

No content (HTTP 204).

Request

curl -X POST "https://api.gov.nominal.io/api/authentication/v2/admin/users/<user rid>/reactivate" \
  -H "Authorization: Bearer <api key>"
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/authentication/v2/admin/users/<user rid>/reactivate",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/authentication/v2/admin/users/<user rid>/reactivate",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/authentication/v2/admin/users/<user rid>/reactivate",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()


asyncio.run(main())

Response: 204

No content.

Errors#

Errors shows how these errors are sent.

Each error’s errorName is Authentication: followed by its name below.

Status

Name

Notes

400

OrgLoginActivityLimitExceeded

400

SearchUsersLimitExceeded

403

NotAuthorized

403

NotAuthorizedAdmin

404

OrgNotFound

404

UserNotFound

500

MultipleUsersForSameEmail

Types#

AppearanceSetting#

SYSTEM

​

LIGHT

​

DARK

​

ChartTooltipModeSetting#

Tooltip modes which affect the data displayed in chart tooltips, primarily for time series charts. VERBOSE: Shows all the chart’s plotted series in the hover tooltip. CONCISE: Shows only the plotted series within the row currently being hovered. MULTI_ROW_CONCISE: Show separate tooltips for each row, where each shows the series plotted in that row. SINGLE: Shows only the plotted series closest to/under the cursor. NONE: Hides the tooltip entirely (also affects tooltips for other chart types).

VERBOSE

​

CONCISE

​

MULTI_ROW_CONCISE

​

SINGLE

​

NONE

​

DecimalPlaces#

Set type to the name of one of the other fields, and set only that field.

fixed FixedDecimalPlaces

​

max MaxDecimalPlaces

​

DefaultNumberFormatConfigurations#

data NumberFormat

Default number format for data values, e.g. chart tooltip and value table cell values.

DefaultTimeRangeTypeSetting#

DEFAULT

​

ABSOLUTE

​

RELATIVE

​

FixedDecimalPlaces#

Format the number to a fixed number of decimal places, padding with zeroes or rounding as needed.

places integer required

​

Jwk#

A JSON Web Key (JWK) representation for RSA public keys

kty string required

​

kid string required

​

use string required

​

alg string required

​

n string required

​

e string required

​

MaxDecimalPlaces#

Format the number to a maximum number of decimal places, rounding numbers that have greater precision.

places integer required

​

NumberFormat#

Number format for numeric cells, eg 1e4 | 10000 | 10,000.

sigFigs integer

Include the specified number of significant figures, rounding if needed.

displayOption NumberFormatDisplayOption

The base display format for the number.

fixedDecimalPlaces integer deprecated

Deprecated: use decimalPlaces instead

decimalPlaces DecimalPlaces

Options for formatting the decimal part of number.

NumberFormatDisplayOption#

SCIENTIFIC

​

SUCCINCT

​

LOCALE

​

PLAIN

​

OrgUserLoginActivity#

userRid string (RID) required

​

orgRid string (RID) required

​

lastLoginAt string (date-time)

The most recent time this user logged into orgRid. Absent if they have never logged in.

RelativeTimestampFormat#

User-level display format for relative timestamps.

Set type to the name of one of the other fields, and set only that field.

temporalSubunits TemporalSubunitsRelativeTimestampFormat

​

totalSeconds TotalSecondsRelativeTimestampFormat

​

SearchUsersQuery#

Set type to the name of one of the other fields, and set only that field.

and array of SearchUsersQuery

​

or array of SearchUsersQuery

​

exactMatch string

Performs case insensitive exact match on email

searchText string

Searches email and display name

SortBy#

isDescending boolean required

​

field SortByField required

​

SortByField#

NAME

​

EMAIL

​

CREATED_AT

​

UPDATED_AT

​

TemporalSubunitsRelativeTimestampFormat#

Display relative timestamps as temporal subunits, such as 1h 20m 30s.

An empty JSON object, {}.

TimezoneSetting#

LOCAL

​

UTC

​

TotalSecondsRelativeTimestampFormat#

Display relative timestamps as a total number of seconds.

An empty JSON object, {}.

UserV2#

rid string (RID) required

​

orgRid string (RID) required

​

email string required

​

displayName string required

​

avatarUrl string required

Avatar URL or a default avatar if the user does not have one.

createdAt string (date-time)

​

Page design based on Scalar, MIT License.