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
ridstring (RID)
orgRidstring (RID)
emailstring
displayNamestring
avatarUrlstringAvatar URL or a default avatar if the user does not have one.
createdAtstring (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
displayNamestring required
Response
ridstring (RID)
orgRidstring (RID)
emailstring
displayNamestring
avatarUrlstringAvatar URL or a default avatar if the user does not have one.
createdAtstring (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
defaultTimeRangeTypeDefaultTimeRangeTypeSetting
Values of
DefaultTimeRangeTypeSettingDEFAULT
ABSOLUTE
RELATIVE
appearanceAppearanceSetting
Values of
AppearanceSettingSYSTEM
LIGHT
DARK
timezoneTimezoneSetting
Values of
TimezoneSettingLOCAL
UTC
timeSeriesHoverTooltipConciseboolean deprecatedDeprecated: Use
chartHoverTooltipModeinstead. IfchartHoverTooltipModeis not set, this field will be used:trueasSINGLEandfalseasVERBOSE.chartHoverTooltipModeChartTooltipModeSetting
Values of
ChartTooltipModeSettingVERBOSE
CONCISE
MULTI_ROW_CONCISE
SINGLE
NONE
defaultNumberFormatsDefaultNumberFormatConfigurations
Fields of
DefaultNumberFormatConfigurationsdataNumberFormatDefault number format for data values, e.g. chart tooltip and value table cell values.
Fields of
NumberFormatsigFigsintegerInclude the specified number of significant figures, rounding if needed.
displayOptionNumberFormatDisplayOptionThe base display format for the number.
Values of
NumberFormatDisplayOptionSCIENTIFIC
SUCCINCT
LOCALE
PLAIN
fixedDecimalPlacesinteger deprecatedDeprecated: use decimalPlaces instead
decimalPlacesDecimalPlacesOptions for formatting the decimal part of number.
Set
typeto"fixed".fixedFixedDecimalPlaces
Fields of
FixedDecimalPlacesplacesinteger
Set
typeto"max".maxMaxDecimalPlaces
Fields of
MaxDecimalPlacesplacesinteger
relativeTimestampFormatRelativeTimestampFormatRelative timestamp display preference.
Set
typeto"temporalSubunits".temporalSubunitsTemporalSubunitsRelativeTimestampFormat
Set
typeto"totalSeconds".totalSecondsTotalSecondsRelativeTimestampFormat
vimModeEnabledboolean
defaultWorkbookVisibleInSearchbooleanWhether 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
defaultTimeRangeTypeDefaultTimeRangeTypeSetting
Values of
DefaultTimeRangeTypeSettingDEFAULT
ABSOLUTE
RELATIVE
appearanceAppearanceSetting
Values of
AppearanceSettingSYSTEM
LIGHT
DARK
timezoneTimezoneSetting
Values of
TimezoneSettingLOCAL
UTC
timeSeriesHoverTooltipConciseboolean deprecatedDeprecated: Use
chartHoverTooltipModeinstead. IfchartHoverTooltipModeis not set, this field will be used:trueasSINGLEandfalseasVERBOSE.chartHoverTooltipModeChartTooltipModeSetting
Values of
ChartTooltipModeSettingVERBOSE
CONCISE
MULTI_ROW_CONCISE
SINGLE
NONE
defaultNumberFormatsDefaultNumberFormatConfigurations
Fields of
DefaultNumberFormatConfigurationsdataNumberFormatDefault number format for data values, e.g. chart tooltip and value table cell values.
Fields of
NumberFormatsigFigsintegerInclude the specified number of significant figures, rounding if needed.
displayOptionNumberFormatDisplayOptionThe base display format for the number.
Values of
NumberFormatDisplayOptionSCIENTIFIC
SUCCINCT
LOCALE
PLAIN
fixedDecimalPlacesinteger deprecatedDeprecated: use decimalPlaces instead
decimalPlacesDecimalPlacesOptions for formatting the decimal part of number.
Set
typeto"fixed".fixedFixedDecimalPlaces
Fields of
FixedDecimalPlacesplacesinteger required
Set
typeto"max".maxMaxDecimalPlaces
Fields of
MaxDecimalPlacesplacesinteger required
relativeTimestampFormatRelativeTimestampFormatRelative timestamp display preference.
Set
typeto"temporalSubunits".temporalSubunitsTemporalSubunitsRelativeTimestampFormat
Set
typeto"totalSeconds".totalSecondsTotalSecondsRelativeTimestampFormat
vimModeEnabledboolean
defaultWorkbookVisibleInSearchbooleanWhether newly created workbooks are visible in search by default. If absent, the organization default applies.
Response
defaultTimeRangeTypeDefaultTimeRangeTypeSetting
Values of
DefaultTimeRangeTypeSettingDEFAULT
ABSOLUTE
RELATIVE
appearanceAppearanceSetting
Values of
AppearanceSettingSYSTEM
LIGHT
DARK
timezoneTimezoneSetting
Values of
TimezoneSettingLOCAL
UTC
timeSeriesHoverTooltipConciseboolean deprecatedDeprecated: Use
chartHoverTooltipModeinstead. IfchartHoverTooltipModeis not set, this field will be used:trueasSINGLEandfalseasVERBOSE.chartHoverTooltipModeChartTooltipModeSetting
Values of
ChartTooltipModeSettingVERBOSE
CONCISE
MULTI_ROW_CONCISE
SINGLE
NONE
defaultNumberFormatsDefaultNumberFormatConfigurations
Fields of
DefaultNumberFormatConfigurationsdataNumberFormatDefault number format for data values, e.g. chart tooltip and value table cell values.
Fields of
NumberFormatsigFigsintegerInclude the specified number of significant figures, rounding if needed.
displayOptionNumberFormatDisplayOptionThe base display format for the number.
Values of
NumberFormatDisplayOptionSCIENTIFIC
SUCCINCT
LOCALE
PLAIN
fixedDecimalPlacesinteger deprecatedDeprecated: use decimalPlaces instead
decimalPlacesDecimalPlacesOptions for formatting the decimal part of number.
Set
typeto"fixed".fixedFixedDecimalPlaces
Fields of
FixedDecimalPlacesplacesinteger
Set
typeto"max".maxMaxDecimalPlaces
Fields of
MaxDecimalPlacesplacesinteger
relativeTimestampFormatRelativeTimestampFormatRelative timestamp display preference.
Set
typeto"temporalSubunits".temporalSubunitsTemporalSubunitsRelativeTimestampFormat
Set
typeto"totalSeconds".totalSecondsTotalSecondsRelativeTimestampFormat
vimModeEnabledboolean
defaultWorkbookVisibleInSearchbooleanWhether 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
defaultTimeRangeTypeDefaultTimeRangeTypeSetting
Values of
DefaultTimeRangeTypeSettingDEFAULT
ABSOLUTE
RELATIVE
defaultWorkbookVisibleInSearchbooleanWhether 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
defaultTimeRangeTypeDefaultTimeRangeTypeSetting
Values of
DefaultTimeRangeTypeSettingDEFAULT
ABSOLUTE
RELATIVE
defaultWorkbookVisibleInSearchbooleanWhether newly created workbooks are visible in search by default.
Response
defaultTimeRangeTypeDefaultTimeRangeTypeSetting
Values of
DefaultTimeRangeTypeSettingDEFAULT
ABSOLUTE
RELATIVE
defaultWorkbookVisibleInSearchbooleanWhether 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
querySearchUsersQueryrequired
Set
typeto"and".andarray ofSearchUsersQuery
Set
typeto"or".orarray ofSearchUsersQuery
Set
typeto"exactMatch".exactMatchstringPerforms case insensitive exact match on email
Set
typeto"searchText".searchTextstringSearches email and display name
sortBySortByUPDATED_AT descending by default
Fields of
SortByisDescendingboolean required
fieldSortByFieldrequired
Values of
SortByFieldNAME
EMAIL
CREATED_AT
UPDATED_AT
nextPageTokenstring
pageSizeintegerDefaults to 100. Will throw if larger than 1_000.
Response
resultsarray ofUserV2
Fields of
UserV2ridstring (RID)
orgRidstring (RID)
emailstring
displayNamestring
avatarUrlstringAvatar URL or a default avatar if the user does not have one.
createdAtstring (date-time)
nextPageTokenstring
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
ridstring (RID)
orgRidstring (RID)
emailstring
displayNamestring
avatarUrlstringAvatar URL or a default avatar if the user does not have one.
createdAtstring (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
userRidstring (RID) required
Response
ridstring (RID)
orgRidstring (RID)
emailstring
displayNamestring
avatarUrlstringAvatar URL or a default avatar if the user does not have one.
createdAtstring (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
keysarray ofJwk
Fields of
Jwkktystring
kidstring
usestring
algstring
nstring
estring
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
emailsarray of stringThe list of email addresses to preregister. Maximum 1000 entries.
Response
usersmap of string toUserV2Map of email to UserV2 for each newly created user.
Fields of
UserV2ridstring (RID)
orgRidstring (RID)
emailstring
displayNamestring
avatarUrlstringAvatar URL or a default avatar if the user does not have one.
createdAtstring (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
orgsarray of string (RID)Defaults to the caller’s own org. The caller must be an admin of every org listed.
isDescendingbooleanSorts 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.
nextPageTokenstring
pageSizeintegerDefaults to 100. Will throw if larger than 1_000.
Response
resultsarray ofOrgUserLoginActivity
Fields of
OrgUserLoginActivityuserRidstring (RID)
orgRidstring (RID)
lastLoginAtstring (date-time)The most recent time this user logged into orgRid. Absent if they have never logged in.
nextPageTokenstring
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
userRidstring (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
userRidstring (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 |
|
|
400 |
|
|
403 |
|
|
403 |
|
|
404 |
|
|
404 |
|
|
500 |
|
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.
fixedFixedDecimalPlaces
maxMaxDecimalPlaces
DefaultNumberFormatConfigurations#
dataNumberFormatDefault 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.
placesinteger required
Jwk#
A JSON Web Key (JWK) representation for RSA public keys
ktystring required
kidstring required
usestring required
algstring required
nstring required
estring required
MaxDecimalPlaces#
Format the number to a maximum number of decimal places, rounding numbers that have greater precision.
placesinteger required
NumberFormat#
Number format for numeric cells, eg 1e4 | 10000 | 10,000.
sigFigsintegerInclude the specified number of significant figures, rounding if needed.
displayOptionNumberFormatDisplayOptionThe base display format for the number.
fixedDecimalPlacesinteger deprecatedDeprecated: use decimalPlaces instead
decimalPlacesDecimalPlacesOptions for formatting the decimal part of number.
NumberFormatDisplayOption#
SCIENTIFIC
SUCCINCT
LOCALE
PLAIN
OrgUserLoginActivity#
userRidstring (RID) required
orgRidstring (RID) required
lastLoginAtstring (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.
temporalSubunitsTemporalSubunitsRelativeTimestampFormat
totalSecondsTotalSecondsRelativeTimestampFormat
SearchUsersQuery#
Set type to the name of one of the other fields, and set only that field.
andarray ofSearchUsersQuery
orarray ofSearchUsersQuery
exactMatchstringPerforms case insensitive exact match on email
searchTextstringSearches email and display name
SortBy#
isDescendingboolean required
fieldSortByFieldrequired
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#
ridstring (RID) required
orgRidstring (RID) required
emailstring required
displayNamestring required
avatarUrlstring requiredAvatar URL or a default avatar if the user does not have one.
createdAtstring (date-time)
Page design based on Scalar, MIT License.