OpenAPI Specification
openapi: 3.1.1
info:
title: Tessl Admin Keys Users API
version: 1.0.0
description: Admin-scoped API keys for support tooling.
servers:
- url: https://api.tessl.io
tags:
- name: Users
description: User accounts and identity.
paths:
/v1/users:
get:
tags:
- Users
description: Lists users with username filter and sorting.
parameters:
- schema:
default: username
anyOf:
- type: array
items:
anyOf:
- type: string
enum:
- username
- type: string
enum:
- -username
- type: string
enum:
- createdAt
- type: string
enum:
- -createdAt
- anyOf:
- type: string
enum:
- username
- type: string
enum:
- -username
- type: string
enum:
- createdAt
- type: string
enum:
- -createdAt
in: query
name: sort
required: false
- schema:
minimum: 1
maximum: 100
default: 100
type: number
in: query
name: page[size]
required: false
- schema:
type: string
in: query
name: page[after]
required: false
- schema:
type: string
in: query
name: page[before]
required: false
- schema:
type: string
in: query
name: filter[username]
required: false
- schema:
type: string
in: query
name: filter[username][eq]
required: false
- schema:
type: string
in: query
name: filter[username][ne]
required: false
- schema:
type: string
in: query
name: filter[username][gt]
required: false
- schema:
type: string
in: query
name: filter[username][gte]
required: false
- schema:
type: string
in: query
name: filter[username][lt]
required: false
- schema:
type: string
in: query
name: filter[username][lte]
required: false
- schema:
type: string
in: query
name: filter[username][like]
required: false
- schema:
type: string
example: Bearer <token>
in: header
name: Authorization
required: false
responses:
'200':
description: Default Response
content:
application/json:
schema:
type: object
required:
- links
- meta
- data
properties:
links:
type: object
required:
- self
- next
- prev
properties:
self:
format: uri
type: string
next:
anyOf:
- format: uri
type: string
- type: 'null'
prev:
anyOf:
- format: uri
type: string
- type: 'null'
meta:
type: object
required:
- count
properties:
count:
type: number
data:
type: array
items:
type: object
required:
- id
- type
- attributes
properties:
id:
format: uuid
type: string
type:
type: string
enum:
- user
attributes:
type: object
required:
- username
- createdAt
properties:
username:
type: string
createdAt:
format: date-time
type: string
'401':
description: Unauthorized
content:
application/json:
schema:
description: Unauthorized
type: object
required:
- error
properties:
error:
type: object
required:
- title
- status
- message
properties:
title:
type: string
enum:
- Unauthorized
status:
type: number
enum:
- 401
message:
type: string
'403':
description: Forbidden
content:
application/json:
schema:
description: Forbidden
type: object
required:
- error
properties:
error:
type: object
required:
- title
- status
- message
properties:
title:
type: string
enum:
- Forbidden
status:
type: number
enum:
- 403
message:
type: string
'404':
description: Not Found
content:
application/json:
schema:
description: Not Found
type: object
required:
- error
properties:
error:
type: object
required:
- title
- status
- message
properties:
title:
type: string
enum:
- Not Found
status:
type: number
enum:
- 404
message:
type: string
'500':
description: Internal Server Error
content:
application/json:
schema:
description: Internal Server Error
type: object
required:
- error
properties:
error:
type: object
required:
- title
- status
- message
properties:
title:
type: string
enum:
- Internal Server Error
status:
type: number
enum:
- 500
message:
type: string
post:
tags:
- Users
description: Creates the authenticated user record from their auth-provider claims.
responses:
'200':
description: Default Response
content:
application/json:
schema:
type: object
required:
- links
- data
properties:
links:
type: object
required:
- self
properties:
self:
format: uri
type: string
data:
type: object
required:
- id
- type
- attributes
properties:
id:
format: uuid
type: string
type:
type: string
enum:
- user
attributes:
type: object
required:
- username
- firstName
- lastName
- profilePictureUrl
- createdAt
- updatedAt
properties:
username:
type: string
firstName:
anyOf:
- type: string
- type: 'null'
lastName:
anyOf:
- type: string
- type: 'null'
profilePictureUrl:
anyOf:
- type: string
- type: 'null'
createdAt:
format: date-time
type: string
updatedAt:
format: date-time
type: string
'201':
description: Default Response
content:
application/json:
schema:
type: object
required:
- links
- data
properties:
links:
type: object
required:
- self
properties:
self:
format: uri
type: string
data:
type: object
required:
- id
- type
- attributes
properties:
id:
format: uuid
type: string
type:
type: string
enum:
- user
attributes:
type: object
required:
- username
- firstName
- lastName
- profilePictureUrl
- createdAt
- updatedAt
properties:
username:
type: string
firstName:
anyOf:
- type: string
- type: 'null'
lastName:
anyOf:
- type: string
- type: 'null'
profilePictureUrl:
anyOf:
- type: string
- type: 'null'
createdAt:
format: date-time
type: string
updatedAt:
format: date-time
type: string
'404':
description: Not Found
content:
application/json:
schema:
description: Not Found
type: object
required:
- error
properties:
error:
type: object
required:
- title
- status
- message
properties:
title:
type: string
enum:
- Not Found
status:
type: number
enum:
- 404
message:
type: string
'500':
description: Internal Server Error
content:
application/json:
schema:
description: Internal Server Error
type: object
required:
- error
properties:
error:
type: object
required:
- title
- status
- message
properties:
title:
type: string
enum:
- Internal Server Error
status:
type: number
enum:
- 500
message:
type: string
/v1/users/me:
get:
tags:
- Users
description: Returns the authenticated user's profile and feature flags.
parameters:
- schema:
type: string
example: Bearer <token>
in: header
name: Authorization
required: false
responses:
'200':
description: Default Response
content:
application/json:
schema:
type: object
required:
- links
- data
properties:
links:
type: object
required:
- self
properties:
self:
format: uri
type: string
data:
type: object
required:
- id
- type
- attributes
properties:
id:
format: uuid
type: string
type:
type: string
enum:
- user
attributes:
type: object
required:
- username
- firstName
- lastName
- role
- useCase
- featureFlags
- email
- emailVerified
- profilePictureUrl
- defaultOrgId
- createdAt
- updatedAt
- onboardingCompletedAt
properties:
username:
type: string
firstName:
anyOf:
- type: string
- type: 'null'
lastName:
anyOf:
- type: string
- type: 'null'
role:
anyOf:
- type: string
- type: 'null'
useCase:
anyOf:
- anyOf:
- type: string
enum:
- work
- type: string
enum:
- personal
- type: 'null'
featureFlags:
type: object
additionalProperties:
anyOf:
- type: string
- type: boolean
email:
format: email
type: string
emailVerified:
type: boolean
profilePictureUrl:
anyOf:
- type: string
- type: 'null'
defaultOrgId:
anyOf:
- format: uuid
type: string
- type: 'null'
createdAt:
format: date-time
type: string
updatedAt:
format: date-time
type: string
onboardingCompletedAt:
anyOf:
- format: date-time
type: string
- type: 'null'
'401':
description: Unauthorized
content:
application/json:
schema:
description: Unauthorized
type: object
required:
- error
properties:
error:
type: object
required:
- title
- status
- message
properties:
title:
type: string
enum:
- Unauthorized
status:
type: number
enum:
- 401
message:
type: string
'403':
description: Forbidden
content:
application/json:
schema:
description: Forbidden
type: object
required:
- error
properties:
error:
type: object
required:
- title
- status
- message
properties:
title:
type: string
enum:
- Forbidden
status:
type: number
enum:
- 403
message:
type: string
'404':
description: Not Found
content:
application/json:
schema:
description: Not Found
type: object
required:
- error
properties:
error:
type: object
required:
- title
- status
- message
properties:
title:
type: string
enum:
- Not Found
status:
type: number
enum:
- 404
message:
type: string
'500':
description: Internal Server Error
content:
application/json:
schema:
description: Internal Server Error
type: object
required:
- error
properties:
error:
type: object
required:
- title
- status
- message
properties:
title:
type: string
enum:
- Internal Server Error
status:
type: number
enum:
- 500
message:
type: string
/v1/users/me/invitations:
get:
tags:
- Users
description: 'Lists invitations the authenticated user should consider during signup: valid pending invitations and recently revoked recoverable invitations discovered by exact or alias-stripped email match. Used to prompt the user to accept an invite before a personal org is created.'
parameters:
- schema:
type: string
example: Bearer <token>
in: header
name: Authorization
required: false
responses:
'200':
description: Default Response
content:
application/json:
schema:
type: object
required:
- links
- meta
- data
properties:
links:
type: object
required:
- self
- next
- prev
properties:
self:
format: uri
type: string
next:
anyOf:
- format: uri
type: string
- type: 'null'
prev:
anyOf:
- format: uri
type: string
- type: 'null'
meta:
type: object
required:
- count
properties:
count:
type: number
data:
type: array
items:
type: object
required:
- id
- type
- attributes
properties:
id:
format: uuid
type: string
type:
type: string
enum:
- invitation
attributes:
type: object
required:
- id
- orgId
- orgName
- email
- role
- expiresAt
- createdAt
- workspaces
properties:
id:
format: uuid
type: string
orgId:
format: uuid
type: string
orgName:
type: string
email:
format: email
type: string
role:
anyOf:
- type: string
enum:
- owner
- type: string
enum:
- manager
- type: string
enum:
- publisher
- type: string
enum:
- member
- type: string
enum:
- consumer
expiresAt:
format: date-time
type: string
createdAt:
format: date-time
type: string
workspaces:
type: array
items:
type: object
required:
- id
- name
properties:
id:
format: uuid
type: string
name:
type: string
'401':
description: Unauthorized
content:
application/json:
schema:
description: Unauthorized
type: object
required:
- error
properties:
error:
type: object
required:
- title
- status
- message
properties:
title:
type: string
enum:
- Unauthorized
status:
type: number
enum:
- 401
message:
type: string
'403':
description: Forbidden
content:
application/json:
schema:
description: Forbidden
type: object
required:
- error
properties:
error:
type: object
required:
- title
- status
- message
properties:
title:
type: string
enum:
- Forbidden
status:
type: number
enum:
- 403
message:
type: string
'404':
description: Not Found
content:
application/json:
schema:
description: Not Found
type: object
required:
- error
properties:
error:
type: object
required:
- title
- status
- message
properties:
title:
type: string
enum:
- Not Found
status:
type: number
enum:
- 404
message:
type: string
'500':
description: Internal Server Error
content:
application/json:
schema:
description: Internal Server Error
type: object
required:
- error
properties:
error:
type: object
required:
- title
- status
- message
properties:
title:
type: string
enum:
- Internal Server Error
status:
type: number
enum:
- 500
message:
type: string
/v1/users/me/invitations/{invitationId}/accept:
post:
tags:
- Users
description: Explicitly accepts a pending invitation addressed to the authenticated user, joining them to the invited organization and workspaces.
parameters:
- schema:
format: uuid
type: string
in: path
name: invitationId
required: true
- schema:
type: string
example: Bearer <token>
in: header
name: Authorization
required: false
responses:
'200':
description: Default Response
content:
application/json:
schema:
type: object
required:
- links
- data
properties:
links:
type: object
required:
- self
properties:
self:
format: uri
type: string
data:
type: object
required:
- id
- type
- attributes
properties:
id:
format: uuid
type: string
type:
type: string
enum:
- invitation
attributes:
type: object
required:
- id
- orgId
- orgName
- email
- role
- expiresAt
- createdAt
- workspaces
properties:
id:
format: uuid
type: string
orgId:
format: uuid
type: string
orgName:
type: string
email:
format: email
type: string
role:
anyOf:
- type: string
enum:
- owner
- type: string
enum:
- manager
- type: string
enum:
- publisher
- type: string
enum:
- member
- type: string
enum:
- consumer
expiresAt:
format: date-time
type: string
createdAt:
format: date-time
type: string
workspaces:
type: array
items:
type: object
required:
- id
- name
properties:
id:
format: uuid
# --- truncated at 32 KB (69 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/tesslio/refs/heads/main/openapi/tesslio-users-api-openapi.yml