openapi: '3.0.3'
info:
title: Backbone API
version: '1.0.0'
description: |
Auto-generated by backbone-cli.
This API provides 11 standard CRUD endpoints for each model.
servers:
- url: /
description: Development server
tags:
- name: Activities
description: Activity management endpoints
paths:
/api/v1/activity/activities:
get:
tags:
- Activities
summary: List Activities
description: Get a paginated list of Activities with optional filtering and sorting
operationId: listActivities
parameters:
- $ref: '#/components/parameters/PageParam'
- $ref: '#/components/parameters/PerPageParam'
- $ref: '#/components/parameters/SortByParam'
- $ref: '#/components/parameters/SortOrderParam'
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/ActivityList'
'401':
$ref: '#/components/responses/Unauthorized'
post:
tags:
- Activities
summary: Create Activity
description: Create a new Activity
operationId: createActivity
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateActivityRequest'
responses:
'201':
description: Created
content:
application/json:
schema:
$ref: '#/components/schemas/Activity'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
/api/v1/activity/activities/{id}:
parameters:
- $ref: '#/components/parameters/IdParam'
get:
tags:
- Activities
summary: Get Activity by ID
operationId: getActivity
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/Activity'
'404':
$ref: '#/components/responses/NotFound'
put:
tags:
- Activities
summary: Update Activity (full)
operationId: updateActivity
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateActivityRequest'
responses:
'200':
description: Updated
content:
application/json:
schema:
$ref: '#/components/schemas/Activity'
'404':
$ref: '#/components/responses/NotFound'
patch:
tags:
- Activities
summary: Update Activity (partial)
operationId: patchActivity
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PatchActivityRequest'
responses:
'200':
description: Updated
content:
application/json:
schema:
$ref: '#/components/schemas/Activity'
'404':
$ref: '#/components/responses/NotFound'
delete:
tags:
- Activities
summary: Delete Activity (soft)
operationId: deleteActivity
responses:
'204':
description: Deleted
'404':
$ref: '#/components/responses/NotFound'
/api/v1/activity/activities/bulk:
post:
tags:
- Activities
summary: Bulk create Activities
operationId: bulkCreateActivities
requestBody:
required: true
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/CreateActivityRequest'
responses:
'201':
description: Created
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Activity'
put:
tags:
- Activities
summary: Bulk update Activities (full, atomic)
operationId: bulkUpdateActivities
requestBody:
required: true
content:
application/json:
schema:
type: array
items:
allOf:
- type: object
required: [id]
properties:
id:
type: string
- $ref: '#/components/schemas/UpdateActivityRequest'
responses:
'200':
description: Updated
content:
application/json:
schema:
$ref: '#/components/schemas/ActivityBulkResult'
'400':
$ref: '#/components/responses/BadRequest'
patch:
tags:
- Activities
summary: Bulk partial-update Activities (atomic)
operationId: bulkPatchActivities
requestBody:
required: true
content:
application/json:
schema:
oneOf:
- type: object
required: [ids, patch]
properties:
ids:
type: array
items: { type: string }
patch:
type: object
additionalProperties: true
- type: object
required: [items]
properties:
items:
type: array
items:
type: object
required: [id, patch]
properties:
id: { type: string }
patch: { type: object, additionalProperties: true }
responses:
'200':
description: Updated
content:
application/json:
schema:
$ref: '#/components/schemas/ActivityBulkResult'
'400':
$ref: '#/components/responses/BadRequest'
/api/v1/activity/activities/upsert:
post:
tags:
- Activities
summary: Upsert Activity
operationId: upsertActivity
parameters:
- name: key_field
in: query
schema:
type: string
- name: key_value
in: query
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateActivityRequest'
responses:
'200':
description: Upserted
content:
application/json:
schema:
$ref: '#/components/schemas/Activity'
/api/v1/activity/activities/trash:
get:
tags:
- Activities
summary: List deleted Activities
operationId: listDeletedActivities
parameters:
- $ref: '#/components/parameters/PageParam'
- $ref: '#/components/parameters/PerPageParam'
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/ActivityList'
/api/v1/activity/activities/{id}/restore:
parameters:
- $ref: '#/components/parameters/IdParam'
post:
tags:
- Activities
summary: Restore deleted Activity
operationId: restoreActivity
responses:
'200':
description: Restored
content:
application/json:
schema:
$ref: '#/components/schemas/Activity'
'404':
$ref: '#/components/responses/NotFound'
/api/v1/activity/activities/empty:
delete:
tags:
- Activities
summary: Empty trash for Activities
operationId: emptyTrashActivities
responses:
'200':
description: Trash emptied
content:
application/json:
schema:
type: object
properties:
deleted_count:
type: integer
/api/v1/activity/activities/delete/bulk:
post:
tags:
- Activities
summary: Bulk soft-delete Activities by ids (atomic)
operationId: bulkDeleteActivities
requestBody:
$ref: '#/components/requestBodies/BatchIds'
responses:
'200':
description: Soft-deleted
content:
application/json:
schema:
type: object
properties:
soft_deleted: { type: integer }
'400':
$ref: '#/components/responses/BadRequest'
/api/v1/activity/activities/restore/bulk:
post:
tags:
- Activities
summary: Bulk restore Activities by ids (atomic)
operationId: bulkRestoreActivities
requestBody:
$ref: '#/components/requestBodies/BatchIds'
responses:
'200':
description: Restored
content:
application/json:
schema:
$ref: '#/components/schemas/ActivityBulkResult'
'400':
$ref: '#/components/responses/BadRequest'
/api/v1/activity/activities/restore/all:
post:
tags:
- Activities
summary: Restore all soft-deleted Activities
operationId: restoreAllActivities
responses:
'200':
description: Restored
content:
application/json:
schema:
type: object
properties:
restored: { type: integer }
/api/v1/activity/activities/trash/bulk:
delete:
tags:
- Activities
summary: Bulk permanently-delete Activities from trash by ids (atomic)
operationId: bulkPermanentDeleteActivities
requestBody:
$ref: '#/components/requestBodies/BatchIds'
responses:
'200':
description: Permanently deleted
content:
application/json:
schema:
type: object
properties:
permanently_deleted: { type: integer }
'400':
$ref: '#/components/responses/BadRequest'
components:
schemas:
Activity:
type: object
required:
- id
- subject
- activity_type
- status
- metadata
properties:
id:
type: string
format: uuid
subject:
type: string
maxLength: 200
activity_type:
type: string
direction:
nullable: true
type: string
lead_id:
nullable: true
type: string
format: uuid
opportunity_id:
nullable: true
type: string
format: uuid
party_id:
nullable: true
type: string
format: uuid
status:
type: string
scheduled_at:
nullable: true
type: string
format: date-time
occurred_at:
nullable: true
type: string
format: date-time
assignee_id:
nullable: true
type: string
format: uuid
outcome:
nullable: true
type: string
maxLength: 280
notes:
nullable: true
type: string
maxLength: 4000
metadata:
type: object
ActivityBulkResult:
type: object
properties:
items:
type: array
items:
$ref: '#/components/schemas/Activity'
total: { type: integer }
failed: { type: integer }
errors:
type: array
items: { type: string }
CreateActivityRequest:
type: object
required:
- subject
- activity_type
- status
- metadata
properties:
subject:
type: string
maxLength: 200
activity_type:
type: string
direction:
nullable: true
type: string
lead_id:
nullable: true
type: string
format: uuid
opportunity_id:
nullable: true
type: string
format: uuid
party_id:
nullable: true
type: string
format: uuid
status:
type: string
scheduled_at:
nullable: true
type: string
format: date-time
occurred_at:
nullable: true
type: string
format: date-time
assignee_id:
nullable: true
type: string
format: uuid
outcome:
nullable: true
type: string
maxLength: 280
notes:
nullable: true
type: string
maxLength: 4000
metadata:
type: object
UpdateActivityRequest:
type: object
required:
- subject
- activity_type
- status
- metadata
properties:
subject:
type: string
maxLength: 200
activity_type:
type: string
direction:
nullable: true
type: string
lead_id:
nullable: true
type: string
format: uuid
opportunity_id:
nullable: true
type: string
format: uuid
party_id:
nullable: true
type: string
format: uuid
status:
type: string
scheduled_at:
nullable: true
type: string
format: date-time
occurred_at:
nullable: true
type: string
format: date-time
assignee_id:
nullable: true
type: string
format: uuid
outcome:
nullable: true
type: string
maxLength: 280
notes:
nullable: true
type: string
maxLength: 4000
metadata:
type: object
PatchActivityRequest:
type: object
properties:
subject:
type: string
maxLength: 200
activity_type:
type: string
direction:
nullable: true
type: string
lead_id:
nullable: true
type: string
format: uuid
opportunity_id:
nullable: true
type: string
format: uuid
party_id:
nullable: true
type: string
format: uuid
status:
type: string
scheduled_at:
nullable: true
type: string
format: date-time
occurred_at:
nullable: true
type: string
format: date-time
assignee_id:
nullable: true
type: string
format: uuid
outcome:
nullable: true
type: string
maxLength: 280
notes:
nullable: true
type: string
maxLength: 4000
metadata:
type: object
ActivityList:
type: object
properties:
items:
type: array
items:
$ref: '#/components/schemas/Activity'
meta:
$ref: '#/components/schemas/PaginationMeta'
PaginationMeta:
type: object
properties:
total:
type: integer
example: 100
page:
type: integer
example: 1
per_page:
type: integer
example: 20
total_pages:
type: integer
example: 5
Error:
type: object
required:
- code
- message
properties:
code:
type: string
example: VALIDATION_ERROR
message:
type: string
example: Invalid input data
details:
type: object
additionalProperties: true
parameters:
IdParam:
name: id
in: path
required: true
schema:
type: string
format: uuid
PageParam:
name: page
in: query
schema:
type: integer
minimum: 1
default: 1
PerPageParam:
name: per_page
in: query
schema:
type: integer
minimum: 1
maximum: 100
default: 20
SortByParam:
name: sort_by
in: query
schema:
type: string
SortOrderParam:
name: sort_order
in: query
schema:
type: string
enum: [asc, desc]
default: asc
responses:
BadRequest:
description: Bad request
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
Unauthorized:
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
NotFound:
description: Resource not found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
requestBodies:
BatchIds:
required: true
content:
application/json:
schema:
type: object
required: [ids]
properties:
ids:
type: array
items: { type: string }
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
security:
- bearerAuth: []