Revert Unified CRM Users API
Read and list CRM users (record owners) across connected CRMs, useful for owner assignment and reference lookups.
Read and list CRM users (record owners) across connected CRMs, useful for owner assignment and reference lookups.
openapi: 3.0.3
info:
title: Revert Unified API
description: >-
Revert is an open-source unified API for building product integrations. This
specification describes the hosted REST surface at api.revert.dev, focused on
the unified CRM category (contacts, leads, deals, companies, notes, tasks,
events, users), the passthrough proxy, connection management, integration
metadata, and webhooks. All CRM requests are authenticated with an
`x-revert-api-token` (your Revert API key) and target a specific customer
connection via `x-revert-t-id` (the tenant id captured when the customer
linked their third-party tool through Revert's managed OAuth flow). Revert is
AGPL-3.0 licensed and can be self-hosted.
termsOfService: https://revert.dev
contact:
name: Revert
url: https://revert.dev
license:
name: AGPL-3.0
url: https://www.gnu.org/licenses/agpl-3.0.en.html
version: '1.0'
servers:
- url: https://api.revert.dev
description: Revert hosted API
tags:
- name: Connection
- name: Metadata
- name: Webhook
- name: CRM Contacts
- name: CRM Leads
- name: CRM Deals
- name: CRM Companies
- name: CRM Notes
- name: CRM Tasks
- name: CRM Events
- name: CRM Users
- name: CRM Properties
- name: CRM Proxy
components:
securitySchemes:
revertApiToken:
type: apiKey
in: header
name: x-revert-api-token
description: Your Revert API key (private token used from your backend).
parameters:
TenantId:
name: x-revert-t-id
in: header
required: true
description: The unique customer/tenant id used when the customer linked their account.
schema:
type: string
ApiVersion:
name: x-api-version
in: header
required: false
description: Optional Revert API version. Latest is used when omitted.
schema:
type: string
Fields:
name: fields
in: query
required: false
description: Comma-separated list of additional provider fields to return.
schema:
type: string
Cursor:
name: cursor
in: query
required: false
description: Pagination cursor returned by a previous list response.
schema:
type: string
PageSize:
name: pageSize
in: query
required: false
description: Number of records to return per page.
schema:
type: integer
Id:
name: id
in: path
required: true
description: The unified record id.
schema:
type: string
schemas:
UnifiedResponse:
type: object
properties:
status:
type: string
example: ok
result:
type: object
UnifiedListResponse:
type: object
properties:
status:
type: string
example: ok
next:
type: string
nullable: true
description: Cursor for the next page, or null when there are no more records.
previous:
type: string
nullable: true
results:
type: array
items:
type: object
Contact:
type: object
properties:
id: { type: string }
firstName: { type: string }
lastName: { type: string }
email: { type: string }
phone: { type: string }
additional: { type: object, description: Provider-specific fields passthrough. }
Lead:
type: object
properties:
id: { type: string }
firstName: { type: string }
lastName: { type: string }
email: { type: string }
phone: { type: string }
additional: { type: object }
Deal:
type: object
properties:
id: { type: string }
name: { type: string }
amount: { type: number }
stage: { type: string }
probability: { type: number }
associations: { type: object }
additional: { type: object }
Company:
type: object
properties:
id: { type: string }
name: { type: string }
industry: { type: string }
phone: { type: string }
additional: { type: object }
Note:
type: object
properties:
id: { type: string }
content: { type: string }
associations: { type: object }
additional: { type: object }
Task:
type: object
properties:
id: { type: string }
subject: { type: string }
body: { type: string }
status: { type: string }
dueDate: { type: string, format: date-time }
additional: { type: object }
Event:
type: object
properties:
id: { type: string }
type: { type: string }
subject: { type: string }
startDateTime: { type: string, format: date-time }
endDateTime: { type: string, format: date-time }
additional: { type: object }
User:
type: object
properties:
id: { type: string }
firstName: { type: string }
lastName: { type: string }
email: { type: string }
additional: { type: object }
ProxyRequest:
type: object
properties:
path:
type: string
description: Provider-native path to call, appended to the connected tool's base URL.
method:
type: string
enum: [GET, POST, PUT, PATCH, DELETE]
body:
type: object
description: Request body to forward to the provider.
Connection:
type: object
properties:
tenantId: { type: string }
tpId: { type: string, description: Third-party provider id (e.g. hubspot, sfdc). }
status: { type: string }
createdAt: { type: string, format: date-time }
security:
- revertApiToken: []
paths:
/crm/ping:
get:
tags: [Connection]
operationId: crmPing
summary: Ping the CRM API to verify credentials and connection.
parameters:
- $ref: '#/components/parameters/TenantId'
responses:
'200':
description: Connection healthy.
content:
application/json:
schema: { $ref: '#/components/schemas/UnifiedResponse' }
/connections:
get:
tags: [Connection]
operationId: getConnections
summary: List all connections for the account.
responses:
'200':
description: A list of connections.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Connection' }
/connection:
get:
tags: [Connection]
operationId: getConnection
summary: Get the connection for a given tenant.
parameters:
- $ref: '#/components/parameters/TenantId'
responses:
'200':
description: The connection.
content:
application/json:
schema: { $ref: '#/components/schemas/Connection' }
delete:
tags: [Connection]
operationId: deleteConnection
summary: Revoke and delete the connection for a given tenant.
parameters:
- $ref: '#/components/parameters/TenantId'
responses:
'200':
description: Connection deleted.
/metadata/crms:
get:
tags: [Metadata]
operationId: getCrmMetadata
summary: Get CRM integration metadata for the account.
description: Returns the supported apps, their status, and configuration used to render Revert's connection UI.
responses:
'200':
description: Integration metadata.
content:
application/json:
schema: { $ref: '#/components/schemas/UnifiedResponse' }
/webhooks:
get:
tags: [Webhook]
operationId: getWebhooks
summary: List webhook subscriptions.
responses:
'200':
description: A list of webhooks.
content:
application/json:
schema: { $ref: '#/components/schemas/UnifiedResponse' }
post:
tags: [Webhook]
operationId: createWebhook
summary: Create a webhook subscription.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
url: { type: string }
events: { type: array, items: { type: string } }
responses:
'201':
description: Webhook created.
delete:
tags: [Webhook]
operationId: deleteWebhook
summary: Delete a webhook subscription.
responses:
'200':
description: Webhook deleted.
/crm/contacts:
get:
tags: [CRM Contacts]
operationId: getContacts
summary: List contacts from the connected CRM.
parameters:
- $ref: '#/components/parameters/TenantId'
- $ref: '#/components/parameters/ApiVersion'
- $ref: '#/components/parameters/Fields'
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/PageSize'
responses:
'200':
description: A page of contacts.
content:
application/json:
schema: { $ref: '#/components/schemas/UnifiedListResponse' }
post:
tags: [CRM Contacts]
operationId: createContact
summary: Create a contact in the connected CRM.
parameters:
- $ref: '#/components/parameters/TenantId'
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/Contact' }
responses:
'201':
description: Contact created.
content:
application/json:
schema: { $ref: '#/components/schemas/UnifiedResponse' }
/crm/contacts/{id}:
get:
tags: [CRM Contacts]
operationId: getContact
summary: Get a single contact by id.
parameters:
- $ref: '#/components/parameters/Id'
- $ref: '#/components/parameters/TenantId'
- $ref: '#/components/parameters/Fields'
responses:
'200':
description: The contact.
content:
application/json:
schema: { $ref: '#/components/schemas/UnifiedResponse' }
patch:
tags: [CRM Contacts]
operationId: updateContact
summary: Update a contact by id.
parameters:
- $ref: '#/components/parameters/Id'
- $ref: '#/components/parameters/TenantId'
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/Contact' }
responses:
'200':
description: Contact updated.
/crm/contacts/search:
post:
tags: [CRM Contacts]
operationId: searchContacts
summary: Search contacts in the connected CRM.
parameters:
- $ref: '#/components/parameters/TenantId'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
searchCriteria: { type: object }
responses:
'200':
description: Matching contacts.
content:
application/json:
schema: { $ref: '#/components/schemas/UnifiedListResponse' }
/crm/leads:
get:
tags: [CRM Leads]
operationId: getLeads
summary: List leads from the connected CRM.
parameters:
- $ref: '#/components/parameters/TenantId'
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/PageSize'
responses:
'200':
description: A page of leads.
content:
application/json:
schema: { $ref: '#/components/schemas/UnifiedListResponse' }
post:
tags: [CRM Leads]
operationId: createLead
summary: Create a lead in the connected CRM.
parameters:
- $ref: '#/components/parameters/TenantId'
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/Lead' }
responses:
'201':
description: Lead created.
/crm/leads/{id}:
get:
tags: [CRM Leads]
operationId: getLead
summary: Get a single lead by id.
parameters:
- $ref: '#/components/parameters/Id'
- $ref: '#/components/parameters/TenantId'
responses:
'200':
description: The lead.
patch:
tags: [CRM Leads]
operationId: updateLead
summary: Update a lead by id.
parameters:
- $ref: '#/components/parameters/Id'
- $ref: '#/components/parameters/TenantId'
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/Lead' }
responses:
'200':
description: Lead updated.
/crm/leads/search:
post:
tags: [CRM Leads]
operationId: searchLeads
summary: Search leads in the connected CRM.
parameters:
- $ref: '#/components/parameters/TenantId'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
searchCriteria: { type: object }
responses:
'200':
description: Matching leads.
/crm/deals:
get:
tags: [CRM Deals]
operationId: getDeals
summary: List deals from the connected CRM.
parameters:
- $ref: '#/components/parameters/TenantId'
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/PageSize'
responses:
'200':
description: A page of deals.
content:
application/json:
schema: { $ref: '#/components/schemas/UnifiedListResponse' }
post:
tags: [CRM Deals]
operationId: createDeal
summary: Create a deal in the connected CRM.
parameters:
- $ref: '#/components/parameters/TenantId'
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/Deal' }
responses:
'201':
description: Deal created.
/crm/deals/{id}:
get:
tags: [CRM Deals]
operationId: getDeal
summary: Get a single deal by id.
parameters:
- $ref: '#/components/parameters/Id'
- $ref: '#/components/parameters/TenantId'
responses:
'200':
description: The deal.
patch:
tags: [CRM Deals]
operationId: updateDeal
summary: Update a deal by id.
parameters:
- $ref: '#/components/parameters/Id'
- $ref: '#/components/parameters/TenantId'
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/Deal' }
responses:
'200':
description: Deal updated.
/crm/deals/search:
post:
tags: [CRM Deals]
operationId: searchDeals
summary: Search deals in the connected CRM.
parameters:
- $ref: '#/components/parameters/TenantId'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
searchCriteria: { type: object }
responses:
'200':
description: Matching deals.
/crm/companies:
get:
tags: [CRM Companies]
operationId: getCompanies
summary: List companies from the connected CRM.
parameters:
- $ref: '#/components/parameters/TenantId'
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/PageSize'
responses:
'200':
description: A page of companies.
content:
application/json:
schema: { $ref: '#/components/schemas/UnifiedListResponse' }
post:
tags: [CRM Companies]
operationId: createCompany
summary: Create a company in the connected CRM.
parameters:
- $ref: '#/components/parameters/TenantId'
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/Company' }
responses:
'201':
description: Company created.
/crm/companies/{id}:
get:
tags: [CRM Companies]
operationId: getCompany
summary: Get a single company by id.
parameters:
- $ref: '#/components/parameters/Id'
- $ref: '#/components/parameters/TenantId'
responses:
'200':
description: The company.
patch:
tags: [CRM Companies]
operationId: updateCompany
summary: Update a company by id.
parameters:
- $ref: '#/components/parameters/Id'
- $ref: '#/components/parameters/TenantId'
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/Company' }
responses:
'200':
description: Company updated.
/crm/companies/search:
post:
tags: [CRM Companies]
operationId: searchCompanies
summary: Search companies in the connected CRM.
parameters:
- $ref: '#/components/parameters/TenantId'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
searchCriteria: { type: object }
responses:
'200':
description: Matching companies.
/crm/notes:
get:
tags: [CRM Notes]
operationId: getNotes
summary: List notes from the connected CRM.
parameters:
- $ref: '#/components/parameters/TenantId'
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/PageSize'
responses:
'200':
description: A page of notes.
content:
application/json:
schema: { $ref: '#/components/schemas/UnifiedListResponse' }
post:
tags: [CRM Notes]
operationId: createNote
summary: Create a note in the connected CRM.
parameters:
- $ref: '#/components/parameters/TenantId'
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/Note' }
responses:
'201':
description: Note created.
/crm/notes/{id}:
get:
tags: [CRM Notes]
operationId: getNote
summary: Get a single note by id.
parameters:
- $ref: '#/components/parameters/Id'
- $ref: '#/components/parameters/TenantId'
responses:
'200':
description: The note.
patch:
tags: [CRM Notes]
operationId: updateNote
summary: Update a note by id.
parameters:
- $ref: '#/components/parameters/Id'
- $ref: '#/components/parameters/TenantId'
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/Note' }
responses:
'200':
description: Note updated.
/crm/tasks:
get:
tags: [CRM Tasks]
operationId: getTasks
summary: List tasks from the connected CRM.
parameters:
- $ref: '#/components/parameters/TenantId'
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/PageSize'
responses:
'200':
description: A page of tasks.
content:
application/json:
schema: { $ref: '#/components/schemas/UnifiedListResponse' }
post:
tags: [CRM Tasks]
operationId: createTask
summary: Create a task in the connected CRM.
parameters:
- $ref: '#/components/parameters/TenantId'
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/Task' }
responses:
'201':
description: Task created.
/crm/tasks/{id}:
get:
tags: [CRM Tasks]
operationId: getTask
summary: Get a single task by id.
parameters:
- $ref: '#/components/parameters/Id'
- $ref: '#/components/parameters/TenantId'
responses:
'200':
description: The task.
patch:
tags: [CRM Tasks]
operationId: updateTask
summary: Update a task by id.
parameters:
- $ref: '#/components/parameters/Id'
- $ref: '#/components/parameters/TenantId'
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/Task' }
responses:
'200':
description: Task updated.
/crm/events:
get:
tags: [CRM Events]
operationId: getEvents
summary: List events from the connected CRM.
parameters:
- $ref: '#/components/parameters/TenantId'
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/PageSize'
responses:
'200':
description: A page of events.
content:
application/json:
schema: { $ref: '#/components/schemas/UnifiedListResponse' }
post:
tags: [CRM Events]
operationId: createEvent
summary: Create an event in the connected CRM.
parameters:
- $ref: '#/components/parameters/TenantId'
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/Event' }
responses:
'201':
description: Event created.
/crm/events/{id}:
get:
tags: [CRM Events]
operationId: getEvent
summary: Get a single event by id.
parameters:
- $ref: '#/components/parameters/Id'
- $ref: '#/components/parameters/TenantId'
responses:
'200':
description: The event.
patch:
tags: [CRM Events]
operationId: updateEvent
summary: Update an event by id.
parameters:
- $ref: '#/components/parameters/Id'
- $ref: '#/components/parameters/TenantId'
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/Event' }
responses:
'200':
description: Event updated.
/crm/users:
get:
tags: [CRM Users]
operationId: getUsers
summary: List CRM users (record owners) from the connected CRM.
parameters:
- $ref: '#/components/parameters/TenantId'
- $ref: '#/components/parameters/Cursor'
- $ref: '#/components/parameters/PageSize'
responses:
'200':
description: A page of users.
content:
application/json:
schema: { $ref: '#/components/schemas/UnifiedListResponse' }
/crm/users/{id}:
get:
tags: [CRM Users]
operationId: getUser
summary: Get a single CRM user by id.
parameters:
- $ref: '#/components/parameters/Id'
- $ref: '#/components/parameters/TenantId'
responses:
'200':
description: The user.
/crm/properties/{object}:
get:
tags: [CRM Properties]
operationId: getProperties
summary: List available properties for a CRM object.
parameters:
- name: object
in: path
required: true
description: The CRM object type (e.g. contact, deal, company).
schema: { type: string }
- $ref: '#/components/parameters/TenantId'
responses:
'200':
description: Available object properties.
content:
application/json:
schema: { $ref: '#/components/schemas/UnifiedResponse' }
/crm/proxy:
post:
tags: [CRM Proxy]
operationId: crmProxy
summary: Passthrough a raw request to the connected provider's native API.
description: >-
Forwards the supplied path, method, and body to the underlying connected
CRM using Revert's managed OAuth token, for provider-specific endpoints not
yet covered by the unified model.
parameters:
- $ref: '#/components/parameters/TenantId'
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/ProxyRequest' }
responses:
'200':
description: Raw provider response, passed through.
content:
application/json:
schema: { type: object }