Embedded OpenAPI document
{
"openapi": "3.1.0",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "Braiventh CRM API",
"version": "1.0.0",
"summary": "API-first CRM and business operations platform.",
"description": "JSON success responses use a data envelope. Paginated collection responses also include meta.pagination; global search intentionally returns a bounded data array without pagination metadata. Errors use a stable error.code and error.message envelope. Browser sessions use an HttpOnly cookie. Integrations use scoped bearer API keys."
},
"servers": [
{
"url": "/",
"description": "Current Braiventh CRM installation"
}
],
"externalDocs": {
"description": "Interactive local documentation",
"url": "/api/docs"
},
"tags": [
{
"name": "System"
},
{
"name": "Authentication"
},
{
"name": "Dashboard"
},
{
"name": "Search"
},
{
"name": "Settings"
},
{
"name": "Companies"
},
{
"name": "Contacts"
},
{
"name": "Opportunities"
},
{
"name": "Pipeline stages"
},
{
"name": "Tasks"
},
{
"name": "Notes"
},
{
"name": "Activities"
},
{
"name": "Tags"
},
{
"name": "API keys"
},
{
"name": "Website integration"
},
{
"name": "Webhooks"
}
],
"paths": {
"/api/v1/health": {
"get": {
"tags": [
"System"
],
"operationId": "getHealth",
"summary": "Liveness check",
"description": "Reports whether the HTTP process is alive. This endpoint does not check dependencies.",
"security": [],
"responses": {
"200": {
"description": "Process is alive.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Health"
}
}
}
}
}
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/ready": {
"get": {
"tags": [
"System"
],
"operationId": "getReadiness",
"summary": "Readiness check",
"description": "Checks dependencies required to serve application traffic, including PostgreSQL.",
"security": [],
"responses": {
"200": {
"description": "All required dependencies are ready.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Readiness"
}
}
}
}
}
},
"500": {
"$ref": "#/components/responses/InternalError"
},
"503": {
"description": "One or more required dependencies are unavailable.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},
"/api/v1/auth/setup": {
"get": {
"tags": [
"Authentication"
],
"operationId": "getSetupStatus",
"summary": "Check whether first-run setup is required",
"security": [],
"responses": {
"200": {
"description": "Current first-run setup state.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/SetupStatus"
}
}
}
}
}
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"post": {
"tags": [
"Authentication"
],
"operationId": "setupWorkspace",
"summary": "Create the first workspace administrator",
"description": "Available only while the installation has no users and requires the installer-supplied one-time setup token.",
"security": [],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SetupRequest"
}
}
}
},
"responses": {
"201": {
"description": "Workspace and administrator created; session cookie is set.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Session"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"413": {
"$ref": "#/components/responses/PayloadTooLarge"
},
"415": {
"$ref": "#/components/responses/UnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/auth/login": {
"post": {
"tags": [
"Authentication"
],
"operationId": "login",
"summary": "Create a browser session",
"security": [],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/LoginRequest"
}
}
}
},
"responses": {
"200": {
"description": "Authenticated; an HttpOnly session cookie is set.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Session"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"413": {
"$ref": "#/components/responses/PayloadTooLarge"
},
"415": {
"$ref": "#/components/responses/UnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/auth/logout": {
"post": {
"tags": [
"Authentication"
],
"operationId": "logout",
"summary": "Destroy the current browser session",
"description": "Revokes the presented session when one exists and always expires the browser cookie. A valid session is optional.",
"security": [
{
"sessionCookie": []
},
{}
],
"responses": {
"204": {
"description": "Session destroyed.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/auth/me": {
"get": {
"tags": [
"Authentication"
],
"operationId": "getCurrentUser",
"summary": "Get the current session user",
"security": [
{
"sessionCookie": []
}
],
"responses": {
"200": {
"description": "Current user and workspace.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Session"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/auth/session": {
"get": {
"tags": [
"Authentication"
],
"operationId": "getCurrentSession",
"summary": "Get the current browser session",
"description": "Alias of GET /api/v1/auth/me.",
"security": [
{
"sessionCookie": []
}
],
"responses": {
"200": {
"description": "Current user and workspace.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Session"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/auth/sessions/others": {
"delete": {
"tags": [
"Authentication"
],
"operationId": "revokeOtherSessions",
"summary": "Revoke the current user's other browser sessions",
"security": [
{
"sessionCookie": []
}
],
"x-required-roles": [
"owner",
"admin"
],
"responses": {
"200": {
"description": "Other sessions revoked.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/RevokedSessions"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/dashboard": {
"get": {
"tags": [
"Dashboard"
],
"operationId": "getDashboard",
"summary": "Get CRM dashboard metrics",
"security": [
{
"sessionCookie": []
}
],
"responses": {
"200": {
"description": "Dashboard metrics and recent records.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Dashboard"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/search": {
"get": {
"tags": [
"Search"
],
"operationId": "searchCrm",
"summary": "Search CRM records",
"security": [
{
"sessionCookie": []
}
],
"parameters": [
{
"name": "q",
"in": "query",
"required": true,
"description": "Case-insensitive search query.",
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 120
}
},
{
"name": "limit",
"in": "query",
"description": "Maximum total results across all resource types.",
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"default": 20
}
}
],
"responses": {
"200": {
"description": "Matching CRM records ordered by most recently updated.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/SearchResult"
}
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/settings": {
"get": {
"tags": [
"Settings"
],
"operationId": "getWorkspaceSettings",
"summary": "Get workspace settings",
"security": [
{
"sessionCookie": []
}
],
"responses": {
"200": {
"description": "Workspace settings.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/WorkspaceSettings"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"patch": {
"tags": [
"Settings"
],
"operationId": "updateWorkspaceSettings",
"summary": "Replace editable workspace settings",
"security": [
{
"sessionCookie": []
}
],
"x-required-roles": [
"owner",
"admin"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/WorkspaceSettingsUpdate"
}
}
}
},
"responses": {
"200": {
"description": "Workspace settings updated.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/WorkspaceSettings"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"413": {
"$ref": "#/components/responses/PayloadTooLarge"
},
"415": {
"$ref": "#/components/responses/UnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/companies": {
"get": {
"tags": [
"Companies"
],
"operationId": "listCompanies",
"summary": "List companies",
"security": [
{
"sessionCookie": []
},
{
"bearerApiKey": []
}
],
"x-required-scopes": [
"companies:read"
],
"parameters": [
{
"$ref": "#/components/parameters/Page"
},
{
"$ref": "#/components/parameters/PageSize"
},
{
"$ref": "#/components/parameters/Search"
},
{
"name": "sort",
"in": "query",
"schema": {
"type": "string",
"enum": [
"name",
"status",
"createdAt",
"updatedAt"
],
"default": "updatedAt"
}
},
{
"name": "order",
"in": "query",
"schema": {
"type": "string",
"enum": [
"asc",
"desc"
],
"default": "desc"
}
},
{
"name": "status",
"in": "query",
"schema": {
"type": "string",
"enum": [
"prospect",
"active",
"inactive",
"client"
]
}
}
],
"responses": {
"200": {
"description": "Companies page.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Company"
}
},
"meta": {
"$ref": "#/components/schemas/PaginationMeta"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"post": {
"tags": [
"Companies"
],
"operationId": "createCompany",
"summary": "Create company",
"security": [
{
"sessionCookie": []
},
{
"bearerApiKey": []
}
],
"x-required-scopes": [
"companies:write"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CompanyCreate"
}
}
}
},
"responses": {
"201": {
"description": "Companies record created.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Company"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"413": {
"$ref": "#/components/responses/PayloadTooLarge"
},
"415": {
"$ref": "#/components/responses/UnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/companies/{id}": {
"parameters": [
{
"$ref": "#/components/parameters/Id"
}
],
"get": {
"tags": [
"Companies"
],
"operationId": "getCompany",
"summary": "Get company",
"security": [
{
"sessionCookie": []
},
{
"bearerApiKey": []
}
],
"x-required-scopes": [
"companies:read"
],
"responses": {
"200": {
"description": "Companies record.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Company"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"patch": {
"tags": [
"Companies"
],
"operationId": "updateCompany",
"summary": "Update company",
"security": [
{
"sessionCookie": []
},
{
"bearerApiKey": []
}
],
"x-required-scopes": [
"companies:write"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CompanyUpdate"
}
}
}
},
"responses": {
"200": {
"description": "Companies record updated.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Company"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"413": {
"$ref": "#/components/responses/PayloadTooLarge"
},
"415": {
"$ref": "#/components/responses/UnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"delete": {
"tags": [
"Companies"
],
"operationId": "deleteCompany",
"summary": "Delete company",
"security": [
{
"sessionCookie": []
},
{
"bearerApiKey": []
}
],
"x-required-scopes": [
"companies:write"
],
"responses": {
"204": {
"description": "Companies record deleted.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/contacts": {
"get": {
"tags": [
"Contacts"
],
"operationId": "listContacts",
"summary": "List contacts",
"security": [
{
"sessionCookie": []
},
{
"bearerApiKey": []
}
],
"x-required-scopes": [
"contacts:read"
],
"parameters": [
{
"$ref": "#/components/parameters/Page"
},
{
"$ref": "#/components/parameters/PageSize"
},
{
"$ref": "#/components/parameters/Search"
},
{
"name": "sort",
"in": "query",
"schema": {
"type": "string",
"enum": [
"firstName",
"lastName",
"name",
"email",
"status",
"createdAt",
"updatedAt"
],
"default": "updatedAt"
}
},
{
"name": "order",
"in": "query",
"schema": {
"type": "string",
"enum": [
"asc",
"desc"
],
"default": "desc"
}
},
{
"name": "companyId",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "status",
"in": "query",
"schema": {
"type": "string",
"enum": [
"active",
"inactive"
]
}
}
],
"responses": {
"200": {
"description": "Contacts page.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Contact"
}
},
"meta": {
"$ref": "#/components/schemas/PaginationMeta"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"post": {
"tags": [
"Contacts"
],
"operationId": "createContact",
"summary": "Create contact",
"security": [
{
"sessionCookie": []
},
{
"bearerApiKey": []
}
],
"x-required-scopes": [
"contacts:write"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ContactCreate"
}
}
}
},
"responses": {
"201": {
"description": "Contacts record created.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Contact"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"413": {
"$ref": "#/components/responses/PayloadTooLarge"
},
"415": {
"$ref": "#/components/responses/UnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/contacts/{id}": {
"parameters": [
{
"$ref": "#/components/parameters/Id"
}
],
"get": {
"tags": [
"Contacts"
],
"operationId": "getContact",
"summary": "Get contact",
"security": [
{
"sessionCookie": []
},
{
"bearerApiKey": []
}
],
"x-required-scopes": [
"contacts:read"
],
"responses": {
"200": {
"description": "Contacts record.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Contact"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"patch": {
"tags": [
"Contacts"
],
"operationId": "updateContact",
"summary": "Update contact",
"security": [
{
"sessionCookie": []
},
{
"bearerApiKey": []
}
],
"x-required-scopes": [
"contacts:write"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ContactUpdate"
}
}
}
},
"responses": {
"200": {
"description": "Contacts record updated.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Contact"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"413": {
"$ref": "#/components/responses/PayloadTooLarge"
},
"415": {
"$ref": "#/components/responses/UnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"delete": {
"tags": [
"Contacts"
],
"operationId": "deleteContact",
"summary": "Delete contact",
"security": [
{
"sessionCookie": []
},
{
"bearerApiKey": []
}
],
"x-required-scopes": [
"contacts:write"
],
"responses": {
"204": {
"description": "Contacts record deleted.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/opportunities": {
"get": {
"tags": [
"Opportunities"
],
"operationId": "listOpportunities",
"summary": "List opportunities",
"security": [
{
"sessionCookie": []
},
{
"bearerApiKey": []
}
],
"x-required-scopes": [
"opportunities:read"
],
"parameters": [
{
"$ref": "#/components/parameters/Page"
},
{
"$ref": "#/components/parameters/PageSize"
},
{
"$ref": "#/components/parameters/Search"
},
{
"name": "sort",
"in": "query",
"schema": {
"type": "string",
"enum": [
"title",
"estimatedValue",
"probability",
"priority",
"expectedCloseDate",
"status",
"createdAt",
"updatedAt"
],
"default": "updatedAt"
}
},
{
"name": "order",
"in": "query",
"schema": {
"type": "string",
"enum": [
"asc",
"desc"
],
"default": "desc"
}
},
{
"name": "companyId",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "stageId",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "ownerUserId",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "status",
"in": "query",
"schema": {
"type": "string",
"enum": [
"open",
"won",
"lost"
]
}
}
],
"responses": {
"200": {
"description": "Opportunities page.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Opportunity"
}
},
"meta": {
"$ref": "#/components/schemas/PaginationMeta"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"post": {
"tags": [
"Opportunities"
],
"operationId": "createOpportunity",
"summary": "Create opportunity",
"security": [
{
"sessionCookie": []
},
{
"bearerApiKey": []
}
],
"x-required-scopes": [
"opportunities:create"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/OpportunityCreate"
}
}
}
},
"responses": {
"201": {
"description": "Opportunities record created.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Opportunity"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"413": {
"$ref": "#/components/responses/PayloadTooLarge"
},
"415": {
"$ref": "#/components/responses/UnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/opportunities/{id}": {
"parameters": [
{
"$ref": "#/components/parameters/Id"
}
],
"get": {
"tags": [
"Opportunities"
],
"operationId": "getOpportunity",
"summary": "Get opportunity",
"security": [
{
"sessionCookie": []
},
{
"bearerApiKey": []
}
],
"x-required-scopes": [
"opportunities:read"
],
"responses": {
"200": {
"description": "Opportunities record.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Opportunity"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"patch": {
"tags": [
"Opportunities"
],
"operationId": "updateOpportunity",
"summary": "Update opportunity",
"security": [
{
"sessionCookie": []
},
{
"bearerApiKey": []
}
],
"x-required-scopes": [
"opportunities:write"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/OpportunityUpdate"
}
}
}
},
"responses": {
"200": {
"description": "Opportunities record updated.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Opportunity"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"413": {
"$ref": "#/components/responses/PayloadTooLarge"
},
"415": {
"$ref": "#/components/responses/UnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"delete": {
"tags": [
"Opportunities"
],
"operationId": "deleteOpportunity",
"summary": "Delete opportunity",
"security": [
{
"sessionCookie": []
},
{
"bearerApiKey": []
}
],
"x-required-scopes": [
"opportunities:write"
],
"responses": {
"204": {
"description": "Opportunities record deleted.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/opportunities/{id}/stage": {
"parameters": [
{
"$ref": "#/components/parameters/Id"
}
],
"patch": {
"tags": [
"Opportunities"
],
"operationId": "changeOpportunityStage",
"summary": "Move an opportunity to another pipeline stage",
"security": [
{
"sessionCookie": []
},
{
"bearerApiKey": []
}
],
"x-required-scopes": [
"opportunities:write"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/OpportunityStageChange"
}
}
}
},
"responses": {
"200": {
"description": "Opportunity stage changed.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Opportunity"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"413": {
"$ref": "#/components/responses/PayloadTooLarge"
},
"415": {
"$ref": "#/components/responses/UnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/pipeline-stages": {
"get": {
"tags": [
"Pipeline stages"
],
"operationId": "listPipelineStages",
"summary": "List pipeline stages",
"security": [
{
"sessionCookie": []
}
],
"parameters": [
{
"$ref": "#/components/parameters/Page"
},
{
"$ref": "#/components/parameters/PageSize"
},
{
"$ref": "#/components/parameters/Search"
},
{
"name": "sort",
"in": "query",
"schema": {
"type": "string",
"enum": [
"position",
"name",
"type",
"probability",
"createdAt",
"updatedAt"
],
"default": "position"
}
},
{
"name": "order",
"in": "query",
"schema": {
"type": "string",
"enum": [
"asc",
"desc"
],
"default": "asc"
}
},
{
"name": "type",
"in": "query",
"schema": {
"type": "string",
"enum": [
"open",
"won",
"lost"
]
}
}
],
"responses": {
"200": {
"description": "Pipeline stages page.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/PipelineStage"
}
},
"meta": {
"$ref": "#/components/schemas/PaginationMeta"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"post": {
"tags": [
"Pipeline stages"
],
"operationId": "createPipelineStage",
"summary": "Create pipeline stage",
"security": [
{
"sessionCookie": []
}
],
"x-required-roles": [
"owner",
"admin"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PipelineStageCreate"
}
}
}
},
"responses": {
"201": {
"description": "Pipeline stages record created.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/PipelineStage"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"413": {
"$ref": "#/components/responses/PayloadTooLarge"
},
"415": {
"$ref": "#/components/responses/UnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/pipeline-stages/{id}": {
"parameters": [
{
"$ref": "#/components/parameters/Id"
}
],
"get": {
"tags": [
"Pipeline stages"
],
"operationId": "getPipelineStage",
"summary": "Get pipeline stage",
"security": [
{
"sessionCookie": []
}
],
"responses": {
"200": {
"description": "Pipeline stages record.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/PipelineStage"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"patch": {
"tags": [
"Pipeline stages"
],
"operationId": "updatePipelineStage",
"summary": "Update pipeline stage",
"security": [
{
"sessionCookie": []
}
],
"x-required-roles": [
"owner",
"admin"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PipelineStageUpdate"
}
}
}
},
"responses": {
"200": {
"description": "Pipeline stages record updated.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/PipelineStage"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"413": {
"$ref": "#/components/responses/PayloadTooLarge"
},
"415": {
"$ref": "#/components/responses/UnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"delete": {
"tags": [
"Pipeline stages"
],
"operationId": "deletePipelineStage",
"summary": "Delete pipeline stage",
"security": [
{
"sessionCookie": []
}
],
"x-required-roles": [
"owner",
"admin"
],
"responses": {
"204": {
"description": "Pipeline stages record deleted.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/tasks": {
"get": {
"tags": [
"Tasks"
],
"operationId": "listTasks",
"summary": "List tasks",
"security": [
{
"sessionCookie": []
},
{
"bearerApiKey": []
}
],
"x-required-scopes": [
"tasks:read"
],
"parameters": [
{
"$ref": "#/components/parameters/Page"
},
{
"$ref": "#/components/parameters/PageSize"
},
{
"$ref": "#/components/parameters/Search"
},
{
"name": "sort",
"in": "query",
"schema": {
"type": "string",
"enum": [
"title",
"status",
"priority",
"dueAt",
"createdAt",
"updatedAt"
],
"default": "updatedAt"
}
},
{
"name": "order",
"in": "query",
"schema": {
"type": "string",
"enum": [
"asc",
"desc"
],
"default": "desc"
}
},
{
"name": "status",
"in": "query",
"schema": {
"type": "string",
"enum": [
"open",
"in_progress",
"completed",
"cancelled"
]
}
},
{
"name": "assignedUserId",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "companyId",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "contactId",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "opportunityId",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
}
],
"responses": {
"200": {
"description": "Tasks page.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Task"
}
},
"meta": {
"$ref": "#/components/schemas/PaginationMeta"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"post": {
"tags": [
"Tasks"
],
"operationId": "createTask",
"summary": "Create task",
"security": [
{
"sessionCookie": []
},
{
"bearerApiKey": []
}
],
"x-required-scopes": [
"tasks:write"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TaskCreate"
}
}
}
},
"responses": {
"201": {
"description": "Tasks record created.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Task"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"413": {
"$ref": "#/components/responses/PayloadTooLarge"
},
"415": {
"$ref": "#/components/responses/UnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/tasks/{id}": {
"parameters": [
{
"$ref": "#/components/parameters/Id"
}
],
"get": {
"tags": [
"Tasks"
],
"operationId": "getTask",
"summary": "Get task",
"security": [
{
"sessionCookie": []
},
{
"bearerApiKey": []
}
],
"x-required-scopes": [
"tasks:read"
],
"responses": {
"200": {
"description": "Tasks record.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Task"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"patch": {
"tags": [
"Tasks"
],
"operationId": "updateTask",
"summary": "Update task",
"security": [
{
"sessionCookie": []
},
{
"bearerApiKey": []
}
],
"x-required-scopes": [
"tasks:write"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TaskUpdate"
}
}
}
},
"responses": {
"200": {
"description": "Tasks record updated.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Task"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"413": {
"$ref": "#/components/responses/PayloadTooLarge"
},
"415": {
"$ref": "#/components/responses/UnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"delete": {
"tags": [
"Tasks"
],
"operationId": "deleteTask",
"summary": "Delete task",
"security": [
{
"sessionCookie": []
},
{
"bearerApiKey": []
}
],
"x-required-scopes": [
"tasks:write"
],
"responses": {
"204": {
"description": "Tasks record deleted.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/notes": {
"get": {
"tags": [
"Notes"
],
"operationId": "listNotes",
"summary": "List notes",
"security": [
{
"sessionCookie": []
}
],
"parameters": [
{
"$ref": "#/components/parameters/Page"
},
{
"$ref": "#/components/parameters/PageSize"
},
{
"$ref": "#/components/parameters/Search"
},
{
"name": "sort",
"in": "query",
"schema": {
"type": "string",
"enum": [
"createdAt",
"updatedAt",
"isPinned"
],
"default": "createdAt"
}
},
{
"name": "order",
"in": "query",
"schema": {
"type": "string",
"enum": [
"asc",
"desc"
],
"default": "desc"
}
},
{
"name": "companyId",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "contactId",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "opportunityId",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
}
],
"responses": {
"200": {
"description": "Notes page.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Note"
}
},
"meta": {
"$ref": "#/components/schemas/PaginationMeta"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"post": {
"tags": [
"Notes"
],
"operationId": "createNote",
"summary": "Create note",
"security": [
{
"sessionCookie": []
}
],
"x-required-roles": [
"owner",
"admin",
"member"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/NoteCreate"
}
}
}
},
"responses": {
"201": {
"description": "Notes record created.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Note"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"413": {
"$ref": "#/components/responses/PayloadTooLarge"
},
"415": {
"$ref": "#/components/responses/UnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/notes/{id}": {
"parameters": [
{
"$ref": "#/components/parameters/Id"
}
],
"get": {
"tags": [
"Notes"
],
"operationId": "getNote",
"summary": "Get note",
"security": [
{
"sessionCookie": []
}
],
"responses": {
"200": {
"description": "Notes record.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Note"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"patch": {
"tags": [
"Notes"
],
"operationId": "updateNote",
"summary": "Update note",
"security": [
{
"sessionCookie": []
}
],
"x-required-roles": [
"owner",
"admin",
"member"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/NoteUpdate"
}
}
}
},
"responses": {
"200": {
"description": "Notes record updated.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Note"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"413": {
"$ref": "#/components/responses/PayloadTooLarge"
},
"415": {
"$ref": "#/components/responses/UnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"delete": {
"tags": [
"Notes"
],
"operationId": "deleteNote",
"summary": "Delete note",
"security": [
{
"sessionCookie": []
}
],
"x-required-roles": [
"owner",
"admin",
"member"
],
"responses": {
"204": {
"description": "Notes record deleted.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/activities": {
"get": {
"tags": [
"Activities"
],
"operationId": "listActivities",
"summary": "List immutable CRM activity records",
"security": [
{
"sessionCookie": []
},
{
"bearerApiKey": []
}
],
"x-required-scopes": [
"activities:read"
],
"parameters": [
{
"$ref": "#/components/parameters/Page"
},
{
"$ref": "#/components/parameters/PageSize"
},
{
"$ref": "#/components/parameters/Search"
},
{
"name": "sort",
"in": "query",
"schema": {
"type": "string",
"enum": [
"occurredAt",
"createdAt",
"eventType"
],
"default": "occurredAt"
}
},
{
"name": "order",
"in": "query",
"schema": {
"type": "string",
"enum": [
"asc",
"desc"
],
"default": "desc"
}
},
{
"name": "eventType",
"in": "query",
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 120
}
},
{
"name": "relatedEntityType",
"in": "query",
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 80
}
},
{
"name": "relatedEntityId",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "companyId",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "contactId",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "opportunityId",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "taskId",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
}
],
"responses": {
"200": {
"description": "Activity page.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Activity"
}
},
"meta": {
"$ref": "#/components/schemas/PaginationMeta"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/activities/{id}": {
"parameters": [
{
"$ref": "#/components/parameters/Id"
}
],
"get": {
"tags": [
"Activities"
],
"operationId": "getActivity",
"summary": "Get an immutable activity record",
"security": [
{
"sessionCookie": []
},
{
"bearerApiKey": []
}
],
"x-required-scopes": [
"activities:read"
],
"responses": {
"200": {
"description": "Activity record.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Activity"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/tags": {
"get": {
"tags": [
"Tags"
],
"operationId": "listTags",
"summary": "List tags",
"security": [
{
"sessionCookie": []
}
],
"parameters": [
{
"$ref": "#/components/parameters/Page"
},
{
"$ref": "#/components/parameters/PageSize"
},
{
"$ref": "#/components/parameters/Search"
},
{
"name": "sort",
"in": "query",
"schema": {
"type": "string",
"enum": [
"name",
"color",
"createdAt",
"updatedAt"
],
"default": "name"
}
},
{
"name": "order",
"in": "query",
"schema": {
"type": "string",
"enum": [
"asc",
"desc"
],
"default": "asc"
}
}
],
"responses": {
"200": {
"description": "Tags page.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Tag"
}
},
"meta": {
"$ref": "#/components/schemas/PaginationMeta"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"post": {
"tags": [
"Tags"
],
"operationId": "createTag",
"summary": "Create tag",
"security": [
{
"sessionCookie": []
}
],
"x-required-roles": [
"owner",
"admin",
"member"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TagCreate"
}
}
}
},
"responses": {
"201": {
"description": "Tags record created.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Tag"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"413": {
"$ref": "#/components/responses/PayloadTooLarge"
},
"415": {
"$ref": "#/components/responses/UnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/tags/{id}": {
"parameters": [
{
"$ref": "#/components/parameters/Id"
}
],
"get": {
"tags": [
"Tags"
],
"operationId": "getTag",
"summary": "Get tag",
"security": [
{
"sessionCookie": []
}
],
"responses": {
"200": {
"description": "Tags record.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Tag"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"patch": {
"tags": [
"Tags"
],
"operationId": "updateTag",
"summary": "Update tag",
"security": [
{
"sessionCookie": []
}
],
"x-required-roles": [
"owner",
"admin",
"member"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TagUpdate"
}
}
}
},
"responses": {
"200": {
"description": "Tags record updated.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Tag"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"413": {
"$ref": "#/components/responses/PayloadTooLarge"
},
"415": {
"$ref": "#/components/responses/UnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"delete": {
"tags": [
"Tags"
],
"operationId": "deleteTag",
"summary": "Delete tag",
"security": [
{
"sessionCookie": []
}
],
"x-required-roles": [
"owner",
"admin",
"member"
],
"responses": {
"204": {
"description": "Tags record deleted.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/api-keys": {
"get": {
"tags": [
"API keys"
],
"operationId": "listApiKeys",
"summary": "List API-key metadata",
"description": "Stored digests and full API-key secrets are never returned.",
"security": [
{
"sessionCookie": []
}
],
"x-required-roles": [
"owner",
"admin"
],
"parameters": [
{
"$ref": "#/components/parameters/Page"
},
{
"$ref": "#/components/parameters/PageSize"
},
{
"$ref": "#/components/parameters/Search"
}
],
"responses": {
"200": {
"description": "API-key metadata page.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ApiKey"
}
},
"meta": {
"$ref": "#/components/schemas/PaginationMeta"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"post": {
"tags": [
"API keys"
],
"operationId": "createApiKey",
"summary": "Create an API key",
"description": "The plaintext key is returned exactly once in this response. Store it securely.",
"security": [
{
"sessionCookie": []
}
],
"x-required-roles": [
"owner",
"admin"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ApiKeyCreate"
}
}
}
},
"responses": {
"201": {
"description": "API key created; plaintext key shown once.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/ApiKeyCreated"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"413": {
"$ref": "#/components/responses/PayloadTooLarge"
},
"415": {
"$ref": "#/components/responses/UnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/api-keys/{id}": {
"parameters": [
{
"$ref": "#/components/parameters/Id"
}
],
"get": {
"tags": [
"API keys"
],
"operationId": "getApiKey",
"summary": "Get API-key metadata",
"description": "The plaintext key and stored digest are never returned.",
"security": [
{
"sessionCookie": []
}
],
"x-required-roles": [
"owner",
"admin"
],
"responses": {
"200": {
"description": "API-key metadata.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/ApiKey"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/api-keys/{id}/revoke": {
"parameters": [
{
"$ref": "#/components/parameters/Id"
}
],
"post": {
"tags": [
"API keys"
],
"operationId": "revokeApiKey",
"summary": "Revoke an API key",
"security": [
{
"sessionCookie": []
}
],
"x-required-roles": [
"owner",
"admin"
],
"responses": {
"200": {
"description": "API key revoked.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/ApiKey"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/integrations/website/opportunities": {
"post": {
"tags": [
"Website integration"
],
"operationId": "ingestWebsiteOpportunity",
"summary": "Ingest a website lead",
"description": "Atomically creates or links the company and contact, creates an opportunity, and optionally creates a follow-up task. Idempotency records live for 24 hours: replaying the same key and normalized body returns the original IDs, while reusing a key with a different body returns 409. Requests are limited to 32 KiB and rate-limited per API key.",
"security": [
{
"bearerApiKey": []
}
],
"x-required-scopes": [
"opportunities:create"
],
"parameters": [
{
"$ref": "#/components/parameters/IdempotencyKey"
}
],
"requestBody": {
"required": true,
"description": "JSON body; maximum encoded size is 32 KiB.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/WebsiteLeadRequest"
}
}
}
},
"responses": {
"200": {
"description": "Previously created result replayed.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/WebsiteLeadResult"
}
}
}
}
}
},
"201": {
"description": "Website lead ingested.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/WebsiteLeadResult"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"413": {
"$ref": "#/components/responses/PayloadTooLarge"
},
"415": {
"$ref": "#/components/responses/UnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/webhooks": {
"get": {
"tags": [
"Webhooks"
],
"operationId": "listWebhooks",
"summary": "List webhooks",
"security": [
{
"sessionCookie": []
}
],
"x-required-roles": [
"owner",
"admin"
],
"parameters": [
{
"$ref": "#/components/parameters/Page"
},
{
"$ref": "#/components/parameters/PageSize"
},
{
"$ref": "#/components/parameters/Search"
}
],
"responses": {
"200": {
"description": "Webhooks page.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Webhook"
}
},
"meta": {
"$ref": "#/components/schemas/PaginationMeta"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"post": {
"tags": [
"Webhooks"
],
"operationId": "createWebhook",
"summary": "Create a webhook endpoint",
"description": "A signing secret is generated and returned exactly once.",
"security": [
{
"sessionCookie": []
}
],
"x-required-roles": [
"owner",
"admin"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/WebhookCreate"
}
}
}
},
"responses": {
"201": {
"description": "Webhook created; signing secret shown once.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/WebhookCreated"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"413": {
"$ref": "#/components/responses/PayloadTooLarge"
},
"415": {
"$ref": "#/components/responses/UnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/webhooks/{id}": {
"parameters": [
{
"$ref": "#/components/parameters/Id"
}
],
"get": {
"tags": [
"Webhooks"
],
"operationId": "getWebhook",
"summary": "Get webhook",
"security": [
{
"sessionCookie": []
}
],
"x-required-roles": [
"owner",
"admin"
],
"responses": {
"200": {
"description": "Webhooks record.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Webhook"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"patch": {
"tags": [
"Webhooks"
],
"operationId": "updateWebhook",
"summary": "Update webhook",
"security": [
{
"sessionCookie": []
}
],
"x-required-roles": [
"owner",
"admin"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/WebhookUpdate"
}
}
}
},
"responses": {
"200": {
"description": "Webhooks record updated.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/Webhook"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"413": {
"$ref": "#/components/responses/PayloadTooLarge"
},
"415": {
"$ref": "#/components/responses/UnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
},
"delete": {
"tags": [
"Webhooks"
],
"operationId": "deleteWebhook",
"summary": "Delete webhook",
"security": [
{
"sessionCookie": []
}
],
"x-required-roles": [
"owner",
"admin"
],
"responses": {
"204": {
"description": "Webhooks record deleted.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/webhooks/{id}/deliveries": {
"parameters": [
{
"$ref": "#/components/parameters/Id"
}
],
"get": {
"tags": [
"Webhooks"
],
"operationId": "listWebhookDeliveries",
"summary": "List delivery attempts for a webhook",
"security": [
{
"sessionCookie": []
}
],
"x-required-roles": [
"owner",
"admin"
],
"parameters": [
{
"$ref": "#/components/parameters/Page"
},
{
"$ref": "#/components/parameters/PageSize"
}
],
"responses": {
"200": {
"description": "Webhook delivery page.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/WebhookDelivery"
}
},
"meta": {
"$ref": "#/components/schemas/PaginationMeta"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/webhooks/{id}/deliveries/{deliveryId}/retry": {
"parameters": [
{
"$ref": "#/components/parameters/Id"
},
{
"$ref": "#/components/parameters/DeliveryId"
}
],
"post": {
"tags": [
"Webhooks"
],
"operationId": "retryWebhookDelivery",
"summary": "Queue a failed webhook delivery for retry",
"description": "Only failed deliveries belonging to an enabled webhook can be queued again. Each delivery permits at most 3 manual retries and 9 lifetime attempts. Manual retries are limited to 20 per owner and 60 per workspace per minute, with active-work bounds of 50 per webhook and 100 per workspace.",
"security": [
{
"sessionCookie": []
}
],
"x-required-roles": [
"owner",
"admin"
],
"responses": {
"202": {
"description": "Delivery queued for retry.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/WebhookDelivery"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
},
"/api/v1/webhooks/{id}/test": {
"parameters": [
{
"$ref": "#/components/parameters/Id"
}
],
"post": {
"tags": [
"Webhooks"
],
"operationId": "testWebhook",
"summary": "Send a test webhook delivery",
"description": "Queues a synthetic webhook.test delivery. Tests are limited to 10 per owner and 30 per workspace per minute, with active-work bounds of 50 per webhook and 100 per workspace.",
"security": [
{
"sessionCookie": []
}
],
"x-required-roles": [
"owner",
"admin"
],
"responses": {
"202": {
"description": "Test delivery queued.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"$ref": "#/components/schemas/WebhookDelivery"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"403": {
"$ref": "#/components/responses/Forbidden"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"409": {
"$ref": "#/components/responses/Conflict"
},
"422": {
"$ref": "#/components/responses/ValidationError"
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/InternalError"
}
}
}
}
},
"webhooks": {
"crmEvent": {
"post": {
"tags": [
"Webhooks"
],
"summary": "CRM event delivery sent by Braiventh",
"description": "Receivers should compute HMAC-SHA256 over `<timestamp>.<raw request body>` and compare it in constant time with X-Braiventh-Signature.",
"parameters": [
{
"name": "X-Braiventh-Delivery",
"in": "header",
"required": true,
"description": "Webhook delivery UUID.",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "X-Braiventh-Event",
"in": "header",
"required": true,
"schema": {
"$ref": "#/components/schemas/DeliveryWebhookEvent"
}
},
{
"name": "X-Braiventh-Timestamp",
"in": "header",
"required": true,
"description": "Unix timestamp in whole seconds, serialized as a decimal header value.",
"schema": {
"type": "string",
"pattern": "^[0-9]+$"
}
},
{
"name": "X-Braiventh-Signature",
"in": "header",
"required": true,
"description": "`sha256=` followed by the lowercase hexadecimal HMAC digest.",
"schema": {
"type": "string",
"pattern": "^sha256=[0-9a-f]{64}$"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/WebhookPayload"
}
}
}
},
"responses": {
"200": {
"description": "Delivery accepted."
},
"204": {
"description": "Delivery accepted without a response body."
}
}
}
}
},
"components": {
"securitySchemes": {
"sessionCookie": {
"type": "apiKey",
"in": "cookie",
"name": "braiventh_session",
"description": "HttpOnly, Secure, SameSite browser session cookie."
},
"bearerApiKey": {
"type": "http",
"scheme": "bearer",
"bearerFormat": "Braiventh API key",
"description": "Send a scoped API key in `Authorization: Bearer <key>`. Keys are only displayed at creation.",
"x-scopes": {
"companies:read": "Read companies.",
"companies:write": "Create, update, and delete companies.",
"contacts:read": "Read contacts.",
"contacts:write": "Create, update, and delete contacts.",
"opportunities:read": "Read opportunities and pipeline information.",
"opportunities:create": "Create opportunities through the CRM or approved ingestion endpoints.",
"opportunities:write": "Update, move, and delete opportunities.",
"tasks:read": "Read tasks.",
"tasks:write": "Create, update, and delete tasks.",
"activities:read": "Read immutable activity records."
}
}
},
"parameters": {
"Id": {
"name": "id",
"in": "path",
"required": true,
"description": "Resource UUID.",
"schema": {
"type": "string",
"format": "uuid"
}
},
"DeliveryId": {
"name": "deliveryId",
"in": "path",
"required": true,
"description": "Webhook delivery UUID.",
"schema": {
"type": "string",
"format": "uuid"
}
},
"Page": {
"name": "page",
"in": "query",
"schema": {
"type": "integer",
"minimum": 1,
"default": 1
}
},
"PageSize": {
"name": "pageSize",
"in": "query",
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 25
}
},
"Search": {
"name": "search",
"in": "query",
"schema": {
"type": "string",
"maxLength": 120
}
},
"Sort": {
"name": "sort",
"in": "query",
"schema": {
"type": "string",
"maxLength": 64
}
},
"Order": {
"name": "order",
"in": "query",
"schema": {
"type": "string",
"enum": [
"asc",
"desc"
],
"default": "desc"
}
},
"IdempotencyKey": {
"name": "Idempotency-Key",
"in": "header",
"required": true,
"description": "Opaque caller-generated key. It must have no leading/trailing whitespace or control characters. Reuse it only to retry the same normalized JSON body; records expire after 24 hours.",
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 200,
"pattern": "^(?!\\s)(?:[^\\u0000-\\u001F\\u007F]){8,200}(?<!\\s)$"
}
}
},
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"responses": {
"BadRequest": {
"description": "Malformed request.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"Unauthorized": {
"description": "Authentication failed or is missing.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"Forbidden": {
"description": "The caller lacks the required role or API-key scope.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"NotFound": {
"description": "Resource not found.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"Conflict": {
"description": "The operation conflicts with current state or an idempotency record.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"ValidationError": {
"description": "Request validation failed.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"PayloadTooLarge": {
"description": "Request body exceeded the configured byte limit.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"UnsupportedMediaType": {
"description": "Content-Type must be application/json.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"RateLimited": {
"description": "Rate limit exceeded.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
},
"Retry-After": {
"description": "Seconds before retrying.",
"schema": {
"type": "integer",
"minimum": 1
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"InternalError": {
"description": "Unexpected server failure.",
"headers": {
"X-Request-Id": {
"description": "Request correlation identifier.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"schemas": {
"Error": {
"type": "object",
"required": [
"code",
"message"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"details": {}
}
},
"ErrorResponse": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"$ref": "#/components/schemas/Error"
}
}
},
"Pagination": {
"type": "object",
"required": [
"page",
"pageSize",
"total",
"pageCount"
],
"properties": {
"page": {
"type": "integer",
"minimum": 1
},
"pageSize": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"total": {
"type": "integer",
"minimum": 0
},
"pageCount": {
"type": "integer",
"minimum": 0
}
}
},
"PaginationMeta": {
"type": "object",
"required": [
"pagination"
],
"properties": {
"pagination": {
"$ref": "#/components/schemas/Pagination"
}
}
},
"ApiScope": {
"type": "string",
"enum": [
"companies:read",
"companies:write",
"contacts:read",
"contacts:write",
"opportunities:read",
"opportunities:create",
"opportunities:write",
"tasks:read",
"tasks:write",
"activities:read"
]
},
"WebhookEvent": {
"type": "string",
"enum": [
"company.created",
"contact.created",
"opportunity.created",
"opportunity.updated",
"opportunity.stage_changed",
"opportunity.won",
"opportunity.lost",
"task.created",
"task.completed"
]
},
"DeliveryWebhookEvent": {
"type": "string",
"enum": [
"company.created",
"contact.created",
"opportunity.created",
"opportunity.updated",
"opportunity.stage_changed",
"opportunity.won",
"opportunity.lost",
"task.created",
"task.completed",
"webhook.test"
]
},
"User": {
"type": "object",
"required": [
"id",
"email",
"displayName",
"role"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"displayName": {
"type": "string",
"minLength": 1,
"maxLength": 160
},
"email": {
"type": "string",
"format": "email"
},
"role": {
"type": "string",
"enum": [
"owner",
"admin",
"member",
"viewer"
]
}
}
},
"Session": {
"type": "object",
"required": [
"user",
"workspace"
],
"properties": {
"user": {
"$ref": "#/components/schemas/User"
},
"workspace": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
}
}
}
}
},
"SetupStatus": {
"type": "object",
"required": [
"required"
],
"properties": {
"required": {
"type": "boolean"
}
}
},
"RevokedSessions": {
"type": "object",
"required": [
"revokedCount"
],
"properties": {
"revokedCount": {
"type": "integer",
"minimum": 0
}
}
},
"SetupRequest": {
"type": "object",
"required": [
"setupToken",
"name",
"email",
"password"
],
"properties": {
"setupToken": {
"type": "string",
"minLength": 32,
"maxLength": 256,
"writeOnly": true,
"description": "High-entropy installer proof supplied through the deployment secret mechanism."
},
"workspaceName": {
"type": "string",
"minLength": 2,
"maxLength": 120,
"default": "Braiventh"
},
"name": {
"type": "string",
"minLength": 2,
"maxLength": 120
},
"email": {
"type": "string",
"format": "email",
"maxLength": 254
},
"password": {
"type": "string",
"format": "password",
"minLength": 12,
"maxLength": 128,
"writeOnly": true,
"description": "Must contain lowercase, uppercase, numeric, and symbol characters."
}
}
},
"LoginRequest": {
"type": "object",
"required": [
"email",
"password"
],
"properties": {
"email": {
"type": "string",
"format": "email",
"maxLength": 254
},
"password": {
"type": "string",
"format": "password",
"minLength": 1,
"maxLength": 256,
"writeOnly": true
}
}
},
"CompanyCreate": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 160
},
"website": {
"anyOf": [
{
"type": "string",
"format": "uri",
"maxLength": 2048
},
{
"type": "string",
"const": ""
},
{
"type": "null"
}
]
},
"email": {
"anyOf": [
{
"type": "string",
"format": "email",
"maxLength": 254
},
{
"type": "string",
"const": ""
},
{
"type": "null"
}
]
},
"phone": {
"type": [
"string",
"null"
],
"maxLength": 40
},
"address": {
"type": [
"string",
"null"
],
"maxLength": 240
},
"city": {
"type": [
"string",
"null"
],
"maxLength": 100
},
"postalCode": {
"type": [
"string",
"null"
],
"maxLength": 24
},
"country": {
"type": "string",
"minLength": 2,
"maxLength": 80,
"default": "Belgium"
},
"vatNumber": {
"type": [
"string",
"null"
],
"maxLength": 40
},
"industry": {
"type": [
"string",
"null"
],
"maxLength": 120
},
"source": {
"type": [
"string",
"null"
],
"maxLength": 80
},
"status": {
"type": "string",
"enum": [
"prospect",
"active",
"inactive",
"client"
],
"default": "prospect"
}
}
},
"CompanyUpdate": {
"type": "object",
"minProperties": 1,
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 160
},
"website": {
"anyOf": [
{
"type": "string",
"format": "uri",
"maxLength": 2048
},
{
"type": "string",
"const": ""
},
{
"type": "null"
}
]
},
"email": {
"anyOf": [
{
"type": "string",
"format": "email",
"maxLength": 254
},
{
"type": "string",
"const": ""
},
{
"type": "null"
}
]
},
"phone": {
"type": [
"string",
"null"
],
"maxLength": 40
},
"address": {
"type": [
"string",
"null"
],
"maxLength": 240
},
"city": {
"type": [
"string",
"null"
],
"maxLength": 100
},
"postalCode": {
"type": [
"string",
"null"
],
"maxLength": 24
},
"country": {
"type": "string",
"minLength": 2,
"maxLength": 80,
"default": "Belgium"
},
"vatNumber": {
"type": [
"string",
"null"
],
"maxLength": 40
},
"industry": {
"type": [
"string",
"null"
],
"maxLength": 120
},
"source": {
"type": [
"string",
"null"
],
"maxLength": 80
},
"status": {
"type": "string",
"enum": [
"prospect",
"active",
"inactive",
"client"
],
"default": "prospect"
}
}
},
"Company": {
"allOf": [
{
"$ref": "#/components/schemas/CompanyCreate"
},
{
"type": "object",
"required": [
"id",
"workspaceId",
"status",
"country",
"customFields",
"createdAt",
"updatedAt",
"deletedAt"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"workspaceId": {
"type": "string",
"format": "uuid"
},
"ownerUserId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"createdByUserId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"updatedByUserId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"legalName": {
"type": [
"string",
"null"
],
"maxLength": 240
},
"customFields": {
"type": "object",
"additionalProperties": true
},
"contactsCount": {
"type": "integer",
"minimum": 0
},
"opportunitiesCount": {
"type": "integer",
"minimum": 0
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"format": "date-time"
},
"deletedAt": {
"type": [
"string",
"null"
],
"format": "date-time"
}
}
}
]
},
"ContactCreate": {
"type": "object",
"required": [
"firstName",
"lastName"
],
"properties": {
"companyId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"firstName": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"lastName": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"email": {
"anyOf": [
{
"type": "string",
"format": "email",
"maxLength": 254
},
{
"type": "string",
"const": ""
},
{
"type": "null"
}
]
},
"phone": {
"type": [
"string",
"null"
],
"maxLength": 40
},
"jobTitle": {
"type": [
"string",
"null"
],
"maxLength": 120
},
"preferredLanguage": {
"type": "string",
"enum": [
"nl",
"fr",
"en",
"de"
],
"default": "nl"
},
"source": {
"type": [
"string",
"null"
],
"maxLength": 80
},
"status": {
"type": "string",
"enum": [
"active",
"inactive"
],
"default": "active"
}
}
},
"ContactUpdate": {
"type": "object",
"minProperties": 1,
"properties": {
"companyId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"firstName": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"lastName": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"email": {
"anyOf": [
{
"type": "string",
"format": "email",
"maxLength": 254
},
{
"type": "string",
"const": ""
},
{
"type": "null"
}
]
},
"phone": {
"type": [
"string",
"null"
],
"maxLength": 40
},
"jobTitle": {
"type": [
"string",
"null"
],
"maxLength": 120
},
"preferredLanguage": {
"type": "string",
"enum": [
"nl",
"fr",
"en",
"de"
],
"default": "nl"
},
"source": {
"type": [
"string",
"null"
],
"maxLength": 80
},
"status": {
"type": "string",
"enum": [
"active",
"inactive"
],
"default": "active"
}
}
},
"Contact": {
"allOf": [
{
"$ref": "#/components/schemas/ContactCreate"
},
{
"type": "object",
"required": [
"id",
"workspaceId",
"company",
"customFields",
"createdAt",
"updatedAt",
"deletedAt"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"workspaceId": {
"type": "string",
"format": "uuid"
},
"ownerUserId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"createdByUserId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"updatedByUserId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"companyName": {
"type": [
"string",
"null"
]
},
"company": {
"oneOf": [
{
"$ref": "#/components/schemas/CompanySummary"
},
{
"type": "null"
}
]
},
"customFields": {
"type": "object",
"additionalProperties": true
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"format": "date-time"
},
"deletedAt": {
"type": [
"string",
"null"
],
"format": "date-time"
}
}
}
]
},
"OpportunityCreate": {
"type": "object",
"required": [
"title"
],
"properties": {
"companyId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"primaryContactId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"description": {
"type": [
"string",
"null"
],
"maxLength": 8000
},
"stageId": {
"type": "string",
"format": "uuid"
},
"serviceInterest": {
"type": [
"string",
"null"
],
"maxLength": 160
},
"estimatedValue": {
"oneOf": [
{
"type": "number",
"minimum": 0,
"maximum": 999999999.99
},
{
"type": "string",
"maxLength": 128,
"pattern": "^\\s*(?:\\+?(?:(?:[0-9]+(?:\\.[0-9]*)?)|(?:\\.[0-9]+))(?:[eE][+-]?[0-9]+)?)?\\s*$"
}
],
"description": "A value coercible to a finite number from 0 through 999999999.99; surrounding whitespace is ignored.",
"default": 0
},
"currency": {
"type": "string",
"minLength": 3,
"maxLength": 3,
"default": "EUR"
},
"probability": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"source": {
"type": [
"string",
"null"
],
"maxLength": 80
},
"priority": {
"type": "string",
"enum": [
"low",
"normal",
"high",
"urgent"
],
"default": "normal"
},
"expectedCloseDate": {
"anyOf": [
{
"type": "string",
"format": "date"
},
{
"type": "string",
"const": ""
},
{
"type": "null"
}
]
},
"lostReason": {
"type": [
"string",
"null"
],
"maxLength": 1000
},
"nextAction": {
"type": [
"string",
"null"
],
"maxLength": 500
}
}
},
"OpportunityUpdate": {
"type": "object",
"minProperties": 1,
"properties": {
"companyId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"primaryContactId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"description": {
"type": [
"string",
"null"
],
"maxLength": 8000
},
"stageId": {
"type": "string",
"format": "uuid"
},
"serviceInterest": {
"type": [
"string",
"null"
],
"maxLength": 160
},
"estimatedValue": {
"oneOf": [
{
"type": "number",
"minimum": 0,
"maximum": 999999999.99
},
{
"type": "string",
"maxLength": 128,
"pattern": "^\\s*(?:\\+?(?:(?:[0-9]+(?:\\.[0-9]*)?)|(?:\\.[0-9]+))(?:[eE][+-]?[0-9]+)?)?\\s*$"
}
],
"description": "A value coercible to a finite number from 0 through 999999999.99; surrounding whitespace is ignored.",
"default": 0
},
"currency": {
"type": "string",
"minLength": 3,
"maxLength": 3,
"default": "EUR"
},
"probability": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"source": {
"type": [
"string",
"null"
],
"maxLength": 80
},
"priority": {
"type": "string",
"enum": [
"low",
"normal",
"high",
"urgent"
],
"default": "normal"
},
"expectedCloseDate": {
"anyOf": [
{
"type": "string",
"format": "date"
},
{
"type": "string",
"const": ""
},
{
"type": "null"
}
]
},
"lostReason": {
"type": [
"string",
"null"
],
"maxLength": 1000
},
"nextAction": {
"type": [
"string",
"null"
],
"maxLength": 500
}
}
},
"Opportunity": {
"allOf": [
{
"$ref": "#/components/schemas/OpportunityCreate"
},
{
"type": "object",
"required": [
"id",
"workspaceId",
"stageId",
"status",
"estimatedValue",
"currency",
"priority",
"company",
"primaryContact",
"stage",
"customFields",
"createdAt",
"updatedAt",
"deletedAt"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"workspaceId": {
"type": "string",
"format": "uuid"
},
"ownerUserId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"createdByUserId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"updatedByUserId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"status": {
"type": "string",
"enum": [
"open",
"won",
"lost"
]
},
"estimatedValue": {
"type": "string",
"pattern": "^[0-9]+(?:\\.[0-9]+)?$"
},
"probability": {
"type": [
"integer",
"null"
],
"minimum": 0,
"maximum": 100
},
"wonAt": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"lostAt": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"customFields": {
"type": "object",
"additionalProperties": true
},
"companyName": {
"type": [
"string",
"null"
]
},
"primaryContactFirstName": {
"type": [
"string",
"null"
]
},
"primaryContactLastName": {
"type": [
"string",
"null"
]
},
"stageName": {
"type": "string"
},
"stageType": {
"type": "string",
"enum": [
"open",
"won",
"lost"
]
},
"stageColor": {
"type": [
"string",
"null"
],
"pattern": "^#[0-9a-fA-F]{6}$"
},
"company": {
"oneOf": [
{
"$ref": "#/components/schemas/CompanySummary"
},
{
"type": "null"
}
]
},
"primaryContact": {
"oneOf": [
{
"$ref": "#/components/schemas/ContactSummary"
},
{
"type": "null"
}
]
},
"stage": {
"oneOf": [
{
"$ref": "#/components/schemas/PipelineStageSummary"
},
{
"type": "null"
}
]
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"format": "date-time"
},
"deletedAt": {
"type": [
"string",
"null"
],
"format": "date-time"
}
}
}
]
},
"CompanySummary": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
}
}
},
"ContactSummary": {
"type": "object",
"required": [
"id",
"firstName",
"lastName"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
}
}
},
"PipelineStageSummary": {
"type": "object",
"required": [
"id",
"name",
"type",
"color"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"open",
"won",
"lost"
]
},
"color": {
"type": [
"string",
"null"
],
"pattern": "^#[0-9a-fA-F]{6}$"
}
}
},
"OpportunityStageChange": {
"type": "object",
"required": [
"stageId"
],
"properties": {
"stageId": {
"type": "string",
"format": "uuid"
},
"lostReason": {
"type": [
"string",
"null"
],
"maxLength": 1000
}
}
},
"PipelineStageCreate": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"type": {
"type": "string",
"enum": [
"open",
"won",
"lost"
],
"default": "open"
},
"probability": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"position": {
"type": "integer",
"minimum": 0
},
"color": {
"type": [
"string",
"null"
],
"pattern": "^#[0-9a-fA-F]{6}$"
}
}
},
"PipelineStageUpdate": {
"type": "object",
"minProperties": 1,
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"type": {
"type": "string",
"enum": [
"open",
"won",
"lost"
]
},
"probability": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"position": {
"type": "integer",
"minimum": 0
},
"color": {
"type": [
"string",
"null"
],
"pattern": "^#[0-9a-fA-F]{6}$"
}
}
},
"PipelineStage": {
"allOf": [
{
"$ref": "#/components/schemas/PipelineStageCreate"
},
{
"type": "object",
"required": [
"id",
"workspaceId",
"name",
"type",
"position",
"probability",
"color",
"isClosed",
"isWon",
"isLost",
"createdAt",
"updatedAt",
"deletedAt"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"workspaceId": {
"type": "string",
"format": "uuid"
},
"isClosed": {
"type": "boolean"
},
"isWon": {
"type": "boolean"
},
"isLost": {
"type": "boolean"
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"format": "date-time"
},
"deletedAt": {
"type": [
"string",
"null"
],
"format": "date-time"
}
}
}
]
},
"TaskCreate": {
"type": "object",
"required": [
"title"
],
"description": "At most one of companyId, contactId, and opportunityId may be non-null.",
"properties": {
"title": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"description": {
"type": [
"string",
"null"
],
"maxLength": 4000
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"completed",
"cancelled"
],
"default": "open"
},
"priority": {
"type": "string",
"enum": [
"low",
"normal",
"high",
"urgent"
],
"default": "normal"
},
"dueAt": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "string",
"const": ""
},
{
"type": "null"
}
]
},
"assignedUserId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"companyId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"contactId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"opportunityId": {
"type": [
"string",
"null"
],
"format": "uuid"
}
}
},
"TaskUpdate": {
"type": "object",
"minProperties": 1,
"properties": {
"title": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"description": {
"type": [
"string",
"null"
],
"maxLength": 4000
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"completed",
"cancelled"
],
"default": "open"
},
"priority": {
"type": "string",
"enum": [
"low",
"normal",
"high",
"urgent"
],
"default": "normal"
},
"dueAt": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "string",
"const": ""
},
{
"type": "null"
}
]
},
"assignedUserId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"companyId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"contactId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"opportunityId": {
"type": [
"string",
"null"
],
"format": "uuid"
}
}
},
"Task": {
"allOf": [
{
"$ref": "#/components/schemas/TaskCreate"
},
{
"type": "object",
"required": [
"id",
"workspaceId",
"assignedUser",
"company",
"contact",
"opportunity",
"completedAt",
"createdAt",
"updatedAt",
"deletedAt"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"workspaceId": {
"type": "string",
"format": "uuid"
},
"createdByUserId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"updatedByUserId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"assignedUserName": {
"type": [
"string",
"null"
]
},
"assignedUserEmail": {
"type": [
"string",
"null"
],
"format": "email"
},
"companyName": {
"type": [
"string",
"null"
]
},
"contactFirstName": {
"type": [
"string",
"null"
]
},
"contactLastName": {
"type": [
"string",
"null"
]
},
"opportunityTitle": {
"type": [
"string",
"null"
]
},
"assignedUser": {
"oneOf": [
{
"type": "object",
"required": [
"id",
"name",
"email"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": [
"string",
"null"
]
},
"email": {
"type": [
"string",
"null"
],
"format": "email"
}
}
},
{
"type": "null"
}
]
},
"company": {
"oneOf": [
{
"$ref": "#/components/schemas/CompanySummary"
},
{
"type": "null"
}
]
},
"contact": {
"oneOf": [
{
"$ref": "#/components/schemas/ContactSummary"
},
{
"type": "null"
}
]
},
"opportunity": {
"oneOf": [
{
"type": "object",
"required": [
"id",
"title"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"title": {
"type": "string"
}
}
},
{
"type": "null"
}
]
},
"completedAt": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"format": "date-time"
},
"deletedAt": {
"type": [
"string",
"null"
],
"format": "date-time"
}
}
}
]
},
"NoteCreate": {
"type": "object",
"required": [
"body"
],
"description": "Exactly one of companyId, contactId, and opportunityId must be non-null.",
"properties": {
"body": {
"type": "string",
"minLength": 1,
"maxLength": 20000
},
"companyId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"contactId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"opportunityId": {
"type": [
"string",
"null"
],
"format": "uuid"
}
}
},
"NoteUpdate": {
"type": "object",
"required": [
"body"
],
"properties": {
"body": {
"type": "string",
"minLength": 1,
"maxLength": 20000
}
}
},
"Note": {
"allOf": [
{
"$ref": "#/components/schemas/NoteCreate"
},
{
"type": "object",
"required": [
"id",
"workspaceId",
"isPinned",
"createdAt",
"updatedAt",
"deletedAt"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"workspaceId": {
"type": "string",
"format": "uuid"
},
"authorUserId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"authorName": {
"type": [
"string",
"null"
]
},
"authorEmail": {
"type": [
"string",
"null"
],
"format": "email"
},
"isPinned": {
"type": "boolean"
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"format": "date-time"
},
"deletedAt": {
"type": [
"string",
"null"
],
"format": "date-time"
}
}
}
]
},
"Activity": {
"type": "object",
"required": [
"id",
"workspaceId",
"eventType",
"event",
"metadata",
"occurredAt",
"createdAt"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"workspaceId": {
"type": "string",
"format": "uuid"
},
"eventType": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"event": {
"type": "string"
},
"actorUserId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"actorApiKeyId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"actorType": {
"type": [
"string",
"null"
],
"maxLength": 32
},
"actorUserName": {
"type": [
"string",
"null"
]
},
"actorUserEmail": {
"type": [
"string",
"null"
],
"format": "email"
},
"actorName": {
"type": [
"string",
"null"
]
},
"companyId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"contactId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"opportunityId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"taskId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"type": {
"type": [
"string",
"null"
]
},
"source": {
"type": [
"string",
"null"
],
"maxLength": 80
},
"relatedEntityType": {
"type": [
"string",
"null"
],
"maxLength": 80
},
"relatedEntityId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"entityType": {
"type": [
"string",
"null"
],
"maxLength": 80
},
"entityId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"subject": {
"type": [
"string",
"null"
],
"maxLength": 240
},
"title": {
"type": [
"string",
"null"
],
"maxLength": 240
},
"description": {
"type": [
"string",
"null"
]
},
"metadata": {
"type": "object",
"additionalProperties": true
},
"occurredAt": {
"type": "string",
"format": "date-time"
},
"createdAt": {
"type": "string",
"format": "date-time"
}
}
},
"TagCreate": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"color": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"default": "#715CFF"
}
}
},
"TagUpdate": {
"type": "object",
"minProperties": 1,
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"color": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$"
}
}
},
"Tag": {
"allOf": [
{
"$ref": "#/components/schemas/TagCreate"
},
{
"type": "object",
"required": [
"id",
"workspaceId",
"name",
"color",
"createdAt",
"updatedAt",
"deletedAt"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"workspaceId": {
"type": "string",
"format": "uuid"
},
"usageCount": {
"type": "integer",
"minimum": 0
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"format": "date-time"
},
"deletedAt": {
"type": [
"string",
"null"
],
"format": "date-time"
}
}
}
]
},
"ApiKeyCreate": {
"type": "object",
"required": [
"name",
"scopes"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"scopes": {
"type": "array",
"minItems": 1,
"maxItems": 10,
"items": {
"$ref": "#/components/schemas/ApiScope"
}
},
"expiresAt": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "string",
"const": ""
},
{
"type": "null"
}
],
"description": "Optional expiry strictly in the future; an empty string is normalized to null."
}
}
},
"ApiKey": {
"type": "object",
"required": [
"id",
"name",
"prefix",
"scopes",
"status",
"expiresAt",
"lastUsedAt",
"revokedAt",
"createdAt"
],
"description": "Safe API-key metadata. Neither the plaintext key nor its digest is exposed.",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
},
"prefix": {
"type": "string",
"description": "Non-secret prefix used to identify the key."
},
"scopes": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ApiScope"
}
},
"status": {
"type": "string",
"enum": [
"active",
"revoked"
]
},
"expiresAt": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"lastUsedAt": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"revokedAt": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"createdAt": {
"type": "string",
"format": "date-time"
}
}
},
"ApiKeyCreated": {
"allOf": [
{
"$ref": "#/components/schemas/ApiKey"
},
{
"type": "object",
"required": [
"key"
],
"properties": {
"key": {
"type": "string",
"readOnly": true,
"description": "Plaintext API key. Returned once and never retrievable again."
}
}
}
]
},
"WebsiteLeadRequest": {
"type": "object",
"required": [
"company",
"contact",
"opportunity"
],
"properties": {
"company": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 160
},
"website": {
"type": "string",
"format": "uri",
"maxLength": 2048
},
"vatNumber": {
"type": "string",
"maxLength": 40
}
}
},
"contact": {
"type": "object",
"required": [
"firstName",
"lastName",
"email"
],
"properties": {
"firstName": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"lastName": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"email": {
"type": "string",
"format": "email",
"maxLength": 254
},
"phone": {
"type": "string",
"maxLength": 40
},
"preferredLanguage": {
"type": "string",
"enum": [
"nl",
"fr",
"en",
"de"
],
"default": "nl"
}
}
},
"opportunity": {
"type": "object",
"required": [
"title"
],
"properties": {
"title": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"description": {
"type": "string",
"maxLength": 8000
},
"serviceInterest": {
"type": "string",
"maxLength": 160
},
"estimatedValue": {
"oneOf": [
{
"type": "number",
"minimum": 0,
"maximum": 999999999.99
},
{
"type": "string",
"maxLength": 128,
"pattern": "^\\s*(?:\\+?(?:(?:[0-9]+(?:\\.[0-9]*)?)|(?:\\.[0-9]+))(?:[eE][+-]?[0-9]+)?)?\\s*$"
}
],
"description": "A value coercible to a finite number from 0 through 999999999.99; surrounding whitespace is ignored.",
"default": 0
},
"source": {
"type": "string",
"maxLength": 80,
"default": "website"
}
}
},
"createFollowUpTask": {
"type": "boolean",
"default": true
}
}
},
"WebsiteLeadResult": {
"type": "object",
"required": [
"companyId",
"contactId",
"opportunityId",
"followUpTaskId",
"replayed"
],
"properties": {
"companyId": {
"type": "string",
"format": "uuid"
},
"contactId": {
"type": "string",
"format": "uuid"
},
"opportunityId": {
"type": "string",
"format": "uuid"
},
"followUpTaskId": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"replayed": {
"type": "boolean",
"description": "True when the result came from an earlier Idempotency-Key request."
}
}
},
"WebhookCreate": {
"type": "object",
"required": [
"name",
"destinationUrl",
"events"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"destinationUrl": {
"type": "string",
"format": "uri",
"pattern": "^https://",
"maxLength": 2048,
"description": "HTTPS URL without credentials or a fragment. Its hostname must resolve exclusively to public IP addresses."
},
"events": {
"type": "array",
"minItems": 1,
"maxItems": 9,
"items": {
"$ref": "#/components/schemas/WebhookEvent"
}
},
"enabled": {
"type": "boolean",
"default": true
}
}
},
"WebhookUpdate": {
"type": "object",
"minProperties": 1,
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"destinationUrl": {
"type": "string",
"format": "uri",
"pattern": "^https://",
"maxLength": 2048,
"description": "HTTPS URL without credentials or a fragment. Its hostname must resolve exclusively to public IP addresses."
},
"events": {
"type": "array",
"minItems": 1,
"maxItems": 9,
"items": {
"$ref": "#/components/schemas/WebhookEvent"
}
},
"enabled": {
"type": "boolean",
"default": true
}
}
},
"Webhook": {
"allOf": [
{
"$ref": "#/components/schemas/WebhookCreate"
},
{
"type": "object",
"required": [
"id",
"name",
"destinationUrl",
"events",
"enabled",
"createdAt",
"updatedAt"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"format": "date-time"
}
}
}
]
},
"WebhookCreated": {
"allOf": [
{
"$ref": "#/components/schemas/Webhook"
},
{
"type": "object",
"required": [
"signingSecret"
],
"properties": {
"signingSecret": {
"type": "string",
"readOnly": true,
"description": "Signing secret returned once. Only an AES-GCM encrypted value is persisted."
}
}
}
]
},
"WebhookDelivery": {
"type": "object",
"required": [
"id",
"webhookId",
"eventId",
"event",
"status",
"attemptCount",
"manualRetryCount",
"nextAttemptAt",
"lastAttemptAt",
"responseStatus",
"responseBody",
"error",
"deliveredAt",
"createdAt"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"webhookId": {
"type": "string",
"format": "uuid"
},
"eventId": {
"type": "string",
"format": "uuid"
},
"event": {
"$ref": "#/components/schemas/DeliveryWebhookEvent"
},
"status": {
"type": "string",
"enum": [
"pending",
"processing",
"delivered",
"failed"
]
},
"responseStatus": {
"type": [
"integer",
"null"
],
"minimum": 100,
"maximum": 599
},
"responseBody": {
"type": [
"string",
"null"
]
},
"error": {
"type": [
"string",
"null"
]
},
"attemptCount": {
"type": "integer",
"minimum": 0,
"maximum": 9
},
"manualRetryCount": {
"type": "integer",
"minimum": 0,
"maximum": 3
},
"nextAttemptAt": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"lastAttemptAt": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"deliveredAt": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"createdAt": {
"type": "string",
"format": "date-time"
}
}
},
"WebhookPayload": {
"type": "object",
"required": [
"id",
"event",
"createdAt",
"data"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"event": {
"$ref": "#/components/schemas/DeliveryWebhookEvent"
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"data": {
"type": "object",
"additionalProperties": true
}
}
},
"Dashboard": {
"type": "object",
"required": [
"companies",
"contacts",
"openOpportunities",
"openPipelineValue",
"weightedPipelineValue",
"tasks",
"outcomes",
"stages",
"recentActivities"
],
"properties": {
"companies": {
"type": "integer",
"minimum": 0
},
"contacts": {
"type": "integer",
"minimum": 0
},
"openOpportunities": {
"type": "integer",
"minimum": 0
},
"openPipelineValue": {
"type": "number",
"minimum": 0
},
"weightedPipelineValue": {
"type": "number",
"minimum": 0
},
"tasks": {
"type": "object",
"required": [
"open",
"overdue",
"dueToday"
],
"properties": {
"open": {
"type": "integer",
"minimum": 0
},
"overdue": {
"type": "integer",
"minimum": 0
},
"dueToday": {
"type": "integer",
"minimum": 0
}
}
},
"outcomes": {
"type": "object",
"required": [
"won",
"lost",
"wonValue",
"wonThisMonth",
"wonThisMonthValue",
"conversionRate"
],
"properties": {
"won": {
"type": "integer",
"minimum": 0
},
"lost": {
"type": "integer",
"minimum": 0
},
"wonValue": {
"type": "number",
"minimum": 0
},
"wonThisMonth": {
"type": "integer",
"minimum": 0
},
"wonThisMonthValue": {
"type": "number",
"minimum": 0
},
"conversionRate": {
"type": "number",
"minimum": 0,
"maximum": 100
}
}
},
"stages": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DashboardStage"
}
},
"recentActivities": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Activity"
}
}
}
},
"DashboardStage": {
"type": "object",
"required": [
"id",
"name",
"type",
"color",
"position",
"probability",
"opportunityCount",
"totalValue"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"open",
"won",
"lost"
]
},
"color": {
"type": [
"string",
"null"
],
"pattern": "^#[0-9a-fA-F]{6}$"
},
"position": {
"type": "integer",
"minimum": 0
},
"probability": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"opportunityCount": {
"type": "integer",
"minimum": 0
},
"totalValue": {
"type": "number",
"minimum": 0
}
}
},
"SearchResult": {
"type": "object",
"required": [
"type",
"id",
"title",
"subtitle",
"path",
"href",
"updatedAt"
],
"properties": {
"type": {
"type": "string",
"enum": [
"company",
"contact",
"opportunity",
"task"
]
},
"id": {
"type": "string",
"format": "uuid"
},
"title": {
"type": "string"
},
"subtitle": {
"type": [
"string",
"null"
]
},
"path": {
"type": "string",
"pattern": "^/(companies|contacts|opportunities|tasks)/[0-9a-f-]+$"
},
"href": {
"type": "string",
"pattern": "^/(companies|contacts|opportunities|tasks)\\?selected=[0-9a-f-]+$"
},
"updatedAt": {
"type": "string",
"format": "date-time"
}
}
},
"WorkspaceSettingsUpdate": {
"type": "object",
"required": [
"workspaceName",
"currency",
"timezone",
"locale"
],
"properties": {
"workspaceName": {
"type": "string",
"minLength": 2,
"maxLength": 160
},
"currency": {
"type": "string",
"minLength": 3,
"maxLength": 3
},
"timezone": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"locale": {
"type": "string",
"minLength": 2,
"maxLength": 16,
"pattern": "^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$"
}
}
},
"WorkspaceSettings": {
"allOf": [
{
"$ref": "#/components/schemas/WorkspaceSettingsUpdate"
},
{
"type": "object",
"required": [
"id",
"workspaceName",
"name",
"currency",
"timezone",
"locale"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string",
"minLength": 2,
"maxLength": 160
}
}
}
]
},
"Health": {
"type": "object",
"required": [
"status"
],
"properties": {
"status": {
"type": "string",
"const": "ok"
}
}
},
"Readiness": {
"type": "object",
"required": [
"status",
"checks"
],
"properties": {
"status": {
"type": "string",
"enum": [
"ready",
"not_ready"
]
},
"checks": {
"type": "object",
"required": [
"database"
],
"properties": {
"database": {
"type": "string",
"enum": [
"up",
"down"
]
}
}
}
}
}
}
}
}