Vitally Users API
The Users API from Vitally — 3 operation(s) for users.
The Users API from Vitally — 3 operation(s) for users.
openapi: 3.1.0
info:
title: Vitally REST Accounts Users API
version: '1.0'
x-generated: '2026-07-21'
x-method: generated
x-source: https://docs.vitally.io/en/articles/9880649-rest-api-overview and the per-resource REST API reference articles (accounts, users, tasks, organizations, notes, conversations, npsResponses, admins, customObjects). Operations, hosts, authentication, pagination and error semantics are taken verbatim from Vitally's published documentation; object schemas for Account, User and Task are transcribed from their documented object tables. Not a provider-published OpenAPI — a faithful generation from the public docs.
description: Vitally's public REST API for creating, updating, retrieving and listing the core Customer Success objects — Accounts, Organizations, Users, Tasks, Notes, Conversations and NPS Responses. Authentication is HTTP Basic using a Vitally REST API key as the username. List endpoints use cursor-based pagination ordered by updatedAt (default) or createdAt.
contact:
name: Vitally
url: https://docs.vitally.io/en/articles/9880649-rest-api-overview
servers:
- url: https://{subdomain}.rest.vitally.io/resources
description: US data center (default)
variables:
subdomain:
default: yoursubdomain
description: Your Vitally subdomain (from your login URL yoursubdomain.vitally.io)
- url: https://rest.vitally-eu.io/resources
description: EU data center
security:
- basicAuth: []
tags:
- name: Users
paths:
/accounts/{accountId}/users:
parameters:
- $ref: '#/components/parameters/accountId'
get:
operationId: listUsersForAccount
tags:
- Users
summary: List users for an account
parameters:
- $ref: '#/components/parameters/limit'
- $ref: '#/components/parameters/from'
responses:
'200':
description: A page of users
content:
application/json:
schema:
$ref: '#/components/schemas/UserList'
'401':
$ref: '#/components/responses/Unauthorized'
/users:
get:
operationId: listUsers
tags:
- Users
summary: List users
parameters:
- $ref: '#/components/parameters/limit'
- $ref: '#/components/parameters/from'
- $ref: '#/components/parameters/sortBy'
responses:
'200':
description: A page of users
content:
application/json:
schema:
$ref: '#/components/schemas/UserList'
'401':
$ref: '#/components/responses/Unauthorized'
post:
operationId: createUser
tags:
- Users
summary: Create a user
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UserWrite'
responses:
'200':
description: The created user
content:
application/json:
schema:
$ref: '#/components/schemas/User'
'401':
$ref: '#/components/responses/Unauthorized'
/users/{userId}:
parameters:
- name: userId
in: path
required: true
schema:
type: string
get:
operationId: getUser
tags:
- Users
summary: Get a user
responses:
'200':
description: The user
content:
application/json:
schema:
$ref: '#/components/schemas/User'
'401':
$ref: '#/components/responses/Unauthorized'
put:
operationId: updateUser
tags:
- Users
summary: Update a user
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UserWrite'
responses:
'200':
description: The updated user
content:
application/json:
schema:
$ref: '#/components/schemas/User'
'401':
$ref: '#/components/responses/Unauthorized'
components:
schemas:
Cursor:
type: object
properties:
next:
type:
- string
- 'null'
description: The cursor to use for the following page, or null at the end.
Error:
type: object
properties:
error:
type: string
description: Human-readable error message.
required:
- error
SegmentRef:
type: object
properties:
id:
type: string
name:
type: string
Account:
type: object
properties:
id:
type: string
description: Vitally's unique ID for the account
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
externalId:
type: string
description: Your unique ID for the account
name:
type: string
traits:
type: object
additionalProperties: true
organizationId:
type:
- string
- 'null'
accountOwnerId:
type:
- string
- 'null'
mrr:
type:
- number
- 'null'
nextRenewalDate:
type:
- string
- 'null'
format: date-time
churnedAt:
type:
- string
- 'null'
format: date-time
firstSeenTimestamp:
type:
- string
- 'null'
format: date-time
lastSeenTimestamp:
type:
- string
- 'null'
format: date-time
lastInboundMessageTimestamp:
type:
- string
- 'null'
format: date-time
lastOutboundMessageTimestamp:
type:
- string
- 'null'
format: date-time
trialEndDate:
type:
- string
- 'null'
format: date-time
usersCount:
type: integer
npsDetractorCount:
type: integer
npsPassiveCount:
type: integer
npsPromoterCount:
type: integer
npsScore:
type:
- number
- 'null'
description: NPS score across all users (-100 to 100)
healthScore:
type:
- number
- 'null'
description: Current health score (0-10)
csmId:
type:
- string
- 'null'
accountExecutiveId:
type:
- string
- 'null'
keyRoles:
type: array
items:
type: object
properties:
vitallyUser:
type: object
keyRole:
type: string
segments:
type: array
items:
$ref: '#/components/schemas/SegmentRef'
required:
- id
- name
UserWrite:
type: object
properties:
externalId:
type: string
name:
type: string
email:
type: string
format: email
avatar:
type: string
traits:
type: object
additionalProperties: true
accountIds:
type: array
items:
type: string
required:
- name
User:
type: object
properties:
id:
type: string
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
externalId:
type: string
name:
type: string
email:
type: string
format: email
avatar:
type:
- string
- 'null'
traits:
type: object
additionalProperties: true
firstKnown:
type:
- string
- 'null'
format: date-time
lastSeenTimestamp:
type:
- string
- 'null'
format: date-time
lastInboundMessageTimestamp:
type:
- string
- 'null'
format: date-time
lastOutboundMessageTimestamp:
type:
- string
- 'null'
format: date-time
npsLastScore:
type:
- number
- 'null'
npsLastFeedback:
type:
- string
- 'null'
npsLastRespondedAt:
type:
- string
- 'null'
format: date-time
unsubscribedFromConversations:
type: boolean
unsubscribedFromConversationsAt:
type:
- string
- 'null'
format: date-time
deactivatedAt:
type:
- string
- 'null'
format: date-time
permanentlyBounced:
type: boolean
segments:
type: array
items:
$ref: '#/components/schemas/SegmentRef'
accounts:
type: array
items:
$ref: '#/components/schemas/Account'
organizations:
type: array
items:
$ref: '#/components/schemas/GenericObject'
required:
- id
- name
GenericObject:
type: object
description: Common Vitally object envelope. Every REST object exposes id, createdAt, updatedAt, externalId, name and a traits map; resource-specific fields are documented per resource.
properties:
id:
type: string
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
externalId:
type:
- string
- 'null'
name:
type:
- string
- 'null'
traits:
type: object
additionalProperties: true
additionalProperties: true
UserList:
allOf:
- $ref: '#/components/schemas/Cursor'
- type: object
properties:
results:
type: array
items:
$ref: '#/components/schemas/User'
parameters:
from:
name: from
in: query
description: The cursor returned from a previous request (from the next property).
schema:
type: string
limit:
name: limit
in: query
description: Number of items to return. Max/default is 100.
schema:
type: integer
maximum: 100
default: 100
accountId:
name: accountId
in: path
required: true
schema:
type: string
sortBy:
name: sortBy
in: query
description: How to order results. Default updatedAt.
schema:
type: string
enum:
- createdAt
- updatedAt
default: updatedAt
responses:
Unauthorized:
description: Unauthorized - there is an issue with the authorization used
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
securitySchemes:
basicAuth:
type: http
scheme: basic
description: 'HTTP Basic authentication. Use your Vitally REST API key as the username with an empty password (Authorization: Basic base64(apiKey:)). Keys are created in the Vitally UI under Settings -> Integrations -> Vitally REST API.'