Vitally Accounts API
The Accounts API from Vitally — 3 operation(s) for accounts.
The Accounts API from Vitally — 3 operation(s) for accounts.
openapi: 3.1.0
info:
title: Vitally REST Accounts 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: Accounts
paths:
/accounts:
get:
operationId: listAccounts
tags:
- Accounts
summary: List accounts
description: Paginated list of Accounts, by default ordered by updatedAt descending.
parameters:
- $ref: '#/components/parameters/limit'
- $ref: '#/components/parameters/from'
- $ref: '#/components/parameters/sortBy'
- name: status
in: query
description: One of active (default), churned, or activeOrChurned.
schema:
type: string
enum:
- active
- churned
- activeOrChurned
default: active
responses:
'200':
description: A page of accounts
content:
application/json:
schema:
$ref: '#/components/schemas/AccountList'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
post:
operationId: createAccount
tags:
- Accounts
summary: Create an account
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/AccountWrite'
responses:
'200':
description: The created account
content:
application/json:
schema:
$ref: '#/components/schemas/Account'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
/accounts/{accountId}:
parameters:
- $ref: '#/components/parameters/accountId'
get:
operationId: getAccount
tags:
- Accounts
summary: Get an account
responses:
'200':
description: The account
content:
application/json:
schema:
$ref: '#/components/schemas/Account'
'401':
$ref: '#/components/responses/Unauthorized'
put:
operationId: updateAccount
tags:
- Accounts
summary: Update an account
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/AccountWrite'
responses:
'200':
description: The updated account
content:
application/json:
schema:
$ref: '#/components/schemas/Account'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
delete:
operationId: deleteAccount
tags:
- Accounts
summary: Delete an account
responses:
'204':
description: Deleted
'401':
$ref: '#/components/responses/Unauthorized'
/organizations/{organizationId}/accounts:
parameters:
- name: organizationId
in: path
required: true
schema:
type: string
get:
operationId: listAccountsForOrganization
tags:
- Accounts
summary: List accounts for an organization
parameters:
- $ref: '#/components/parameters/limit'
- $ref: '#/components/parameters/from'
responses:
'200':
description: A page of accounts
content:
application/json:
schema:
$ref: '#/components/schemas/AccountList'
'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.
AccountWrite:
type: object
properties:
externalId:
type: string
name:
type: string
organizationId:
type:
- string
- 'null'
accountOwnerId:
type:
- string
- 'null'
traits:
type: object
additionalProperties: true
required:
- name
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
AccountList:
allOf:
- $ref: '#/components/schemas/Cursor'
- type: object
properties:
results:
type: array
items:
$ref: '#/components/schemas/Account'
parameters:
from:
name: from
in: query
description: The cursor returned from a previous request (from the next property).
schema:
type: string
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
limit:
name: limit
in: query
description: Number of items to return. Max/default is 100.
schema:
type: integer
maximum: 100
default: 100
responses:
Unauthorized:
description: Unauthorized - there is an issue with the authorization used
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
BadRequest:
description: Bad Request - the body of the request needs to be reviewed
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
TooManyRequests:
description: Too Many Requests - rate limit exceeded (default 1000 requests/min)
headers:
RateLimit-Limit:
schema:
type: string
description: e.g. 1000, 1000;window=60
RateLimit-Remaining:
schema:
type: integer
RateLimit-Reset:
schema:
type: integer
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.'