openapi: 3.0.1
info:
title: Smokeball Activity Codes Firm API
version: '1.0'
description: REST API for integrating with Smokeball legal practice management software. Supports matters, contacts, documents, time entries, billing, trust accounting, staff, webhooks, and law firm workflows across US, AU, and UK regions. Uses OAuth 2.0 (client credentials) authentication.
contact:
name: Smokeball Developer Support
url: https://docs.smokeball.com/docs/api-docs/1e13a13124aee-introduction
x-api-id: smokeball
x-audience: external-public
servers:
- url: https://api.smokeball.com
- url: https://api.smokeball.com.au
- url: https://api.smokeball.co.uk
- url: https://stagingapi.smokeball.com
- url: https://stagingapi.smokeball.com.au
- url: https://stagingapi.smokeball.co.uk
security:
- api-key: []
token: []
tags:
- name: Firm
paths:
/firm:
get:
tags:
- Firm
summary: Get firm
description: Retrieves the details of the firm associated with the authenticated client.
operationId: GetFirm
responses:
'200':
description: When request is successful. Returns a 'Firm' object.
content:
application/json:
schema:
$ref: '#/components/schemas/Firm'
'404':
description: When firm does not exist.
content:
application/json:
schema:
$ref: '#/components/schemas/ProblemDetails'
put:
tags:
- Firm
summary: Update firm
description: Updates firm details for the current authenticated client.
operationId: UpdateFirm
requestBody:
content:
application/json-patch+json:
schema:
allOf:
- $ref: '#/components/schemas/UpdateFirmDto'
application/json:
schema:
allOf:
- $ref: '#/components/schemas/UpdateFirmDto'
application/*+json:
schema:
allOf:
- $ref: '#/components/schemas/UpdateFirmDto'
responses:
'202':
description: When request is accepted. Returns a hypermedia 'Link' object of the firm to be updated.
content:
application/json:
schema:
$ref: '#/components/schemas/Link'
'404':
description: When firm does not exist.
content:
application/json:
schema:
$ref: '#/components/schemas/ProblemDetails'
post:
tags:
- Firm
summary: Create firm
description: Creates a firm for the current authenticated client and registers an existing user as a staff member and firm owner.
operationId: CreateFirm
requestBody:
content:
application/json-patch+json:
schema:
allOf:
- $ref: '#/components/schemas/CreateFirmDto'
application/json:
schema:
allOf:
- $ref: '#/components/schemas/CreateFirmDto'
application/*+json:
schema:
allOf:
- $ref: '#/components/schemas/CreateFirmDto'
responses:
'202':
description: When request is accepted. Returns a hypermedia 'Link' object of the firm to be created.
content:
application/json:
schema:
$ref: '#/components/schemas/Link'
'400':
description: When staff user does not exist or is already associated with another firm.
content:
application/json:
schema:
$ref: '#/components/schemas/ProblemDetails'
'403':
description: When an unsupported request is made.
content:
application/json:
schema:
$ref: '#/components/schemas/ProblemDetails'
/firmusers:
get:
tags:
- Firm
summary: Get firm user mappings
description: Retrieves a list of user mappings in the firm associated with the authenticated client.
responses:
'200':
description: When request is successful. Returns an array of one or more 'FirmUser' objects.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/FirmUser'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ProblemDetails'
/firmusers/{id}:
get:
tags:
- Firm
summary: Get firm user mapping
description: Retrieves a user mapping (based on staff or user id parameter provided) in the firm associated with the authenticated client.
operationId: GetFirmUserByIdAsync
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: When request is successful. Returns a 'FirmUser' object.
content:
application/json:
schema:
$ref: '#/components/schemas/FirmUser'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ProblemDetails'
put:
tags:
- Firm
summary: Update firm user mapping
description: Updates a user mapping in the firm associated with the authenticated client.
parameters:
- name: id
in: path
required: true
schema:
type: string
requestBody:
content:
application/json-patch+json:
schema:
allOf:
- $ref: '#/components/schemas/FirmUserDto'
description: Represents a mapping between a user and a staff member in a firm.
application/json:
schema:
allOf:
- $ref: '#/components/schemas/FirmUserDto'
description: Represents a mapping between a user and a staff member in a firm.
application/*+json:
schema:
allOf:
- $ref: '#/components/schemas/FirmUserDto'
description: Represents a mapping between a user and a staff member in a firm.
responses:
'202':
description: When request is accepted. Returns a hypermedia 'Link' object of the user to be updated.
content:
application/json:
schema:
$ref: '#/components/schemas/Link'
'400':
description: When staff or user has not been provided.
content:
application/json:
schema:
$ref: '#/components/schemas/ProblemDetails'
'403':
description: When staff does not belong to the firm.
content:
application/json:
schema:
$ref: '#/components/schemas/ProblemDetails'
'404':
description: When 'FirmUser' does not exist.
content:
application/json:
schema:
$ref: '#/components/schemas/ProblemDetails'
delete:
tags:
- Firm
summary: Delete firm user mapping
description: "Removes the user from the firm associated with the authenticated client.\r\n\r\nThe staff member is set as a former staff member and a former user. User access is also disabled."
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/Link'
'202':
description: When request is accepted. Returns a hypermedia 'Link' object of the user to be deleted.
'404':
description: When 'FirmUser' object does not exist.
content:
application/json:
schema:
$ref: '#/components/schemas/ProblemDetails'
components:
schemas:
FirmAddress:
type: object
properties:
buildingLevel:
type: string
description: Building level in address (if applicable).
nullable: true
example: Level 1
unitNumber:
type: string
description: Unit number in address (if applicable).
nullable: true
example: '10'
unitType:
type: string
description: Unit type (e.g. Unit,Flat,Villa,Suite,etc.) in address (if applicable).
nullable: true
example: Suite
streetNumber:
type: string
description: Street number in address.
nullable: true
example: '100'
streetName:
type: string
description: Street name in address.
nullable: true
example: Broad
streetType:
type: string
description: Street type (e.g. Street,Road,Avenue,Lane,etc.) in address.
nullable: true
example: Street
addressLine1:
type: string
description: First line of address.
nullable: true
example: Level 1/10
addressLine2:
type: string
description: Second line of address (if applicable).
nullable: true
example: 100 Broad Street
city:
type: string
description: City, district, suburb, town, or village.
nullable: true
example: Chicago
state:
type: string
description: State, province, or region.
nullable: true
example: IL
zipCode:
type: string
description: Zip or post code.
nullable: true
example: '60606'
county:
type: string
description: County (if applicable)
nullable: true
example: Berkshire
locality:
type: string
description: Locality (if applicable)
nullable: true
example: Windsor
country:
type: string
description: Country.
nullable: true
example: United States
careOf:
type: string
description: Care of the addressee (if applicable).
nullable: true
readOnly: true
example: ''
poBoxType:
type: string
description: PO box type in address (if applicable).
nullable: true
readOnly: true
example: ''
poBoxNumber:
type: string
description: PO box Number in address (if applicable).
nullable: true
readOnly: true
example: ''
additionalProperties: false
Link:
type: object
properties:
id:
type: string
nullable: true
href:
type: string
nullable: true
relation:
type: string
nullable: true
method:
type: string
default: GET
nullable: true
additionalProperties: false
PhoneNumberDto:
type: object
properties:
areaCode:
type: string
description: Phone area code.
nullable: true
example: '555'
number:
type: string
description: Phone number (excluding area code).
nullable: true
example: '1234567'
additionalProperties: false
FirmDxAddressDto:
type: object
properties:
number:
type: string
description: Direct Exchange number (if applicable).
nullable: true
example: '376'
exchange:
type: string
description: Direct Exchange name.
nullable: true
example: DX
state:
type: string
description: State, province, or region.
nullable: true
example: NSW
additionalProperties: false
LicenceNumber:
type: object
properties:
state:
type: string
description: State associated to the licence.
nullable: true
example: IL
type:
type: string
description: Type of the licence.
nullable: true
example: ''
number:
type: string
description: Licence number.
nullable: true
additionalProperties: false
FirmSubscriptionDto:
type: object
properties:
productSuite:
type: string
description: "Optional product suite to use when creating the firm.\r\n\r\nUse 'SMOKEBALL' to use the new product suite."
nullable: true
promotionId:
type: string
description: Optional promotion ID that will be used when the firm is subscribed.
nullable: true
interval:
type: string
description: "Optional interval to register the account subscription with.\r\n\r\nPossible values: Monthly, Yearly"
nullable: true
additionalProperties: false
description: The subscription details for the firm.
CreateFirmDto:
type: object
properties:
productId:
type: string
description: "The product/tier the firm is subscribed to. Must be set when creating the firm and is optional when updating the firm.\r\n\r\nThe supported products are listed in order below, the identifier (in brackets) must be used.\r\n\r\n* Bill (SMK001)\r\n\r\n* Boost (SMK004)\r\n\r\n* Grow (SMK002)\r\n\r\n* Prosper + (SMK003)\r\n\r\nPossible values: SMK001, SMK004, SMK002, SMK003"
nullable: true
example: SMK001
addOnIds:
uniqueItems: true
type: array
items:
type: string
description: "The optional add-ons the firm is subscribed to. Must be specified with an accompanying productId.\r\n\r\nThe supported add-ons are listed below, the identifier (listed in brackets) must be used.\r\n\r\n* Intake (ADD001)\r\n\r\n* AutoTime (ADD003)\r\n\r\n* FamilyPro (ADD004)\r\n\r\n* Api (ADD005)\r\n\r\n* Workflows (ADD006)\r\n\r\n* PowerBI (ADD007)\r\n\r\n* Archie (ADD008)\r\n\r\n* SSO (ADD010)\r\n\r\nPossible values: ADD01, ADD003, ADD004, ADD005, ADD006, ADD007, ADD008, ADD010"
nullable: true
example:
- ADD01
- ADD003
name:
type: string
description: The name of the firm.
nullable: true
example: Brown LLC
email:
type: string
description: "The email of the firm.\r\n\r\nOnly supported in AU."
nullable: true
example: john.smith@law.com
abn:
type: string
description: "Represents a different field depending on the region.\r\n\r\n* For AU: Australian Business Number (ABN) of the firm.\r\n\r\n* For UK: Value-added Tax Number (VAT) of the firm.\r\n\r\nOnly supported in AU and UK."
nullable: true
example: '1234567890'
acn:
type: string
description: "Represents a different field depending on the region.\r\n\r\n* For AU: Australian Company Number (ACN) of the firm.\r\n\r\n* For UK: Company Registration Number (CRN) of the firm.\r\n\r\nOnly supported in AU and UK."
nullable: true
example: '1234567890'
streetAddress:
allOf:
- $ref: '#/components/schemas/FirmAddressDto'
description: Street address of the firm.
nullable: true
mailingAddress:
allOf:
- $ref: '#/components/schemas/FirmAddressDto'
description: Mailing address of the firm.
nullable: true
dxAddress:
allOf:
- $ref: '#/components/schemas/FirmDxAddressDto'
description: "DX address of the firm.\r\n\r\nOnly supported in AU."
nullable: true
phone:
allOf:
- $ref: '#/components/schemas/PhoneNumberDto'
description: Phone number of the firm.
nullable: true
fax:
allOf:
- $ref: '#/components/schemas/PhoneNumberDto'
description: Fax number of the firm.
nullable: true
isInternal:
type: boolean
description: Whether firm is being created for internal use. Internal firms will not be subscribed for payment processing and will not be charged.
example: false
staff:
allOf:
- $ref: '#/components/schemas/StaffDto'
description: The staff member that will be created with the firm. This staff member will become the firm owner.
nullable: true
subscription:
allOf:
- $ref: '#/components/schemas/FirmSubscriptionDto'
description: Optional subscription details that will be used when creating the firm.
nullable: true
additionalProperties: false
FirmAccountStatus:
enum:
- Active
- Warning
- Suspended
type: string
StylingDetails:
type: object
properties:
primaryColorHexCode:
type: string
description: Firm's primary color hex code.
nullable: true
example: '#FF000000'
secondaryColorHexCode:
type: string
description: Firm's secondary color hex code.
nullable: true
example: '#FF000000'
fontFamilyName:
type: string
description: Firm's font family name.
nullable: true
example: Open Sans
additionalProperties: false
UpdateFirmDto:
type: object
properties:
productId:
type: string
description: "The product/tier the firm is subscribed to. Must be set when creating the firm and is optional when updating the firm.\r\n\r\nThe supported products are listed in order below, the identifier (in brackets) must be used.\r\n\r\n* Bill (SMK001)\r\n\r\n* Boost (SMK004)\r\n\r\n* Grow (SMK002)\r\n\r\n* Prosper + (SMK003)\r\n\r\nPossible values: SMK001, SMK004, SMK002, SMK003"
nullable: true
example: SMK001
addOnIds:
uniqueItems: true
type: array
items:
type: string
description: "The optional add-ons the firm is subscribed to. Must be specified with an accompanying productId.\r\n\r\nThe supported add-ons are listed below, the identifier (listed in brackets) must be used.\r\n\r\n* Intake (ADD001)\r\n\r\n* AutoTime (ADD003)\r\n\r\n* FamilyPro (ADD004)\r\n\r\n* Api (ADD005)\r\n\r\n* Workflows (ADD006)\r\n\r\n* PowerBI (ADD007)\r\n\r\n* Archie (ADD008)\r\n\r\n* SSO (ADD010)\r\n\r\nPossible values: ADD01, ADD003, ADD004, ADD005, ADD006, ADD007, ADD008, ADD010"
nullable: true
example:
- ADD01
- ADD003
name:
type: string
description: The name of the firm.
nullable: true
example: Brown LLC
email:
type: string
description: "The email of the firm.\r\n\r\nOnly supported in AU."
nullable: true
example: john.smith@law.com
abn:
type: string
description: "Represents a different field depending on the region.\r\n\r\n* For AU: Australian Business Number (ABN) of the firm.\r\n\r\n* For UK: Value-added Tax Number (VAT) of the firm.\r\n\r\nOnly supported in AU and UK."
nullable: true
example: '1234567890'
acn:
type: string
description: "Represents a different field depending on the region.\r\n\r\n* For AU: Australian Company Number (ACN) of the firm.\r\n\r\n* For UK: Company Registration Number (CRN) of the firm.\r\n\r\nOnly supported in AU and UK."
nullable: true
example: '1234567890'
streetAddress:
allOf:
- $ref: '#/components/schemas/FirmAddressDto'
description: Street address of the firm.
nullable: true
mailingAddress:
allOf:
- $ref: '#/components/schemas/FirmAddressDto'
description: Mailing address of the firm.
nullable: true
dxAddress:
allOf:
- $ref: '#/components/schemas/FirmDxAddressDto'
description: "DX address of the firm.\r\n\r\nOnly supported in AU."
nullable: true
phone:
allOf:
- $ref: '#/components/schemas/PhoneNumberDto'
description: Phone number of the firm.
nullable: true
fax:
allOf:
- $ref: '#/components/schemas/PhoneNumberDto'
description: Fax number of the firm.
nullable: true
status:
allOf:
- $ref: '#/components/schemas/FirmStatusDto'
description: The status of the firm.
nullable: true
additionalProperties: false
FirmUserDto:
type: object
properties:
userId:
type: string
description: Unique identifier of the associated user.
nullable: true
example: b471682e-fa17-4e46-b7fe-9b2b8fdcb3c2
staffId:
type: string
description: Unique identifier of the associated staff member..
nullable: true
example: 750eb5c5-ac0b-7d11-4997-e0ce9d8896c8
additionalProperties: false
description: Represents a mapping between a user and a staff member in a firm.
PhoneNumber:
type: object
properties:
areaCode:
type: string
description: Phone area code.
nullable: true
example: '555'
number:
type: string
description: Phone number (excluding area code).
nullable: true
example: '1234567'
additionalProperties: false
FirmStatus:
type: object
properties:
status:
allOf:
- $ref: '#/components/schemas/FirmAccountStatus'
description: The status of the firm.
example: Active
statusMessage:
type: string
description: The status message of the firm.
nullable: true
additionalProperties: false
description: The status of the firm.
Firm:
type: object
properties:
href:
type: string
nullable: true
relation:
type: string
nullable: true
method:
type: string
default: GET
nullable: true
self:
allOf:
- $ref: '#/components/schemas/Link'
nullable: true
id:
type: string
description: Unique identifier of the firm.
nullable: true
example: f4ff1eff-b7fe-4d46-4e46-01d985838d76
versionId:
type: string
description: Version id of the record.
nullable: true
example: 750eb5c5-ac0b-7d11-4997-e0ce9d8896c8
owner:
type: string
description: "The owner/white-label partner used by the firm.\r\n\r\nPossible values: Smokeball, PracticeEvolve, TriConvey."
nullable: true
example: Smokeball
name:
type: string
description: The name of the firm.
nullable: true
example: Brown LLC
status:
allOf:
- $ref: '#/components/schemas/FirmStatus'
description: The status of the firm.
nullable: true
productId:
type: string
description: "The product/tier the firm is subscribed to. Must be set when creating the firm and is optional when updating the firm.\r\n\r\nThe supported products are listed in order below, the identifier (in brackets) must be used.\r\n\r\n* Bill (SMK001)\r\n\r\n* Boost (SMK004)\r\n\r\n* Grow (SMK002)\r\n\r\n* Prosper + (SMK003)\r\n\r\nPossible values: SMK001, SMK004, SMK002, SMK003"
nullable: true
example: SMK001
addOnIds:
type: array
items:
type: string
description: "The optional add-ons the firm is subscribed to. Must be specified with an accompanying productId.\r\n\r\nThe supported add-ons are listed below, the identifier (listed in brackets) must be used.\r\n\r\n* Intake (ADD001)\r\n\r\n* AutoTime (ADD003)\r\n\r\n* FamilyPro (ADD004)\r\n\r\n* Api (ADD005)\r\n\r\n* Workflows (ADD006)\r\n\r\n* PowerBI (ADD007)\r\n\r\n* Archie (ADD008)\r\n\r\n* SSO (ADD010)\r\n\r\n* PracticeEvolve (ADD011)\r\n\r\n* CustomReporting (ADD012)\r\n\r\nPossible values: ADD001, ADD003, ADD004, ADD005, ADD006, ADD007, ADD008, ADD010, ADD011, ADD012"
nullable: true
example:
- ADD001
- ADD003
email:
type: string
description: "The email of the firm.\r\n\r\nOnly supported in AUS."
nullable: true
example: john.smith@law.com
abn:
type: string
description: "For AU: Australian Business Number (ABN) of the firm.\r\n\r\nFor UK: Value-added Tax Number (VAT) of the firm.\r\n\r\nOnly supported in AU and UK."
nullable: true
example: '1234567890'
acn:
type: string
description: "For AU: Australian Company Number (ACN) of the firm.\r\n\r\nFor UK: Company Registration Number (CRN) of the firm.\r\n\r\nOnly supported in AU and UK."
nullable: true
example: '1234567890'
streetAddress:
allOf:
- $ref: '#/components/schemas/FirmAddress'
description: Street address of the firm.
nullable: true
mailingAddress:
allOf:
- $ref: '#/components/schemas/FirmAddress'
description: Mailing address of the firm.
nullable: true
dxAddress:
allOf:
- $ref: '#/components/schemas/DxAddress'
description: "DX address of the firm.\r\n\r\nOnly supported in AUS."
nullable: true
phone:
allOf:
- $ref: '#/components/schemas/PhoneNumber'
description: Phone number of the firm.
nullable: true
fax:
allOf:
- $ref: '#/components/schemas/PhoneNumber'
description: Fax number of the firm.
nullable: true
logo:
type: string
description: Logo of the firm.
nullable: true
example: https://example-logo-url.com/image
stylingDetails:
allOf:
- $ref: '#/components/schemas/StylingDetails'
description: Styling details of the firm.
nullable: true
licenceNumbers:
type: array
items:
$ref: '#/components/schemas/LicenceNumber'
description: Licence numbers of the firm.
nullable: true
createdDate:
type: string
description: The date when the firm was created in UTC.
format: date-time
nullable: true
example: '2024-01-15T10:30:00Z'
additionalProperties: false
FirmStatusDto:
type: object
properties:
status:
allOf:
- $ref: '#/components/schemas/FirmAccountStatus'
description: The status of the firm account.
example: Active
statusMessage:
type: string
description: The status message of the firm. If left blank, an appropriate message is set depending on the status.
nullable: true
additionalProperties: false
description: The status of the firm.
DxAddress:
type: object
properties:
number:
type: string
description: Direct Exchange number (if applicable).
nullable: true
example: '376'
exchange:
type: string
description: Direct Exchange name.
nullable: true
example: DX
state:
type: string
description: State, province, or region.
nullable: true
example: NSW
additionalProperties: false
ProblemDetails:
type: object
properties:
type:
type: string
nullable: true
title:
type: string
nullable: true
status:
type: integer
format: int32
nullable: true
detail:
type: string
nullable: true
instance:
type: string
nullable: true
additionalProperties: {}
FirmAddressDto:
type: object
properties:
buildingLevel:
type: string
description: Building level in address (if applicable).
nullable: true
example: Level 1
unitNumber:
type: string
description: Unit number in address (if applicable).
nullable: true
example: '10'
unitType:
type: string
description: Unit type (e.g. Unit,Flat,Villa,Suite,etc.) in address (if applicable).
nullable: true
example: Suite
streetNumber:
type: string
description: Street number in address.
nullable: true
example: '100'
streetName:
type: string
description: Street name in address.
nullable: true
example: Broad
streetType:
type: string
description: Street type (e.g. Street,Road,Avenue,Lane,etc.) in address.
nullable: true
example: Street
addressLine1:
type: string
description: First line of address.
nullable: true
example: Level 1/10
addressLine2:
type: string
description: Second line of address (if applicable).
nullable: true
example: 100 Broad Street
city:
type: string
description: City, district, suburb, town, or village.
nullable: true
example: Chicago
state:
type: string
description: State, province, or region (if applicable).
nullable: true
example: IL
zipCode:
type: string
description: Zip or post code.
nullable: true
example: '60606'
county:
type: string
description: County (if applicable).
nullable: true
example: ''
locality:
type: string
description: Locality (if applicable).
nullable: true
example: ''
country:
type: string
description: Country.
nullable: true
example: United States
careOf:
type: string
description: Care of the addressee (if applicable).
nullable: true
example: ''
poBoxType:
type: string
description: PO box type in address (if applicable).
nullable: true
example: ''
poBoxNumber:
type: string
description: PO box Number in address (if applicable).
nullable: true
example: ''
additionalProperties: false
StaffDto:
type: object
properties:
userId:
type: string
description: "Unique identifier of the associated user. Used to map staff member to the specified user id and ignored if left blank.\r\nUse the FirmUsers API to remove a staff/user mapping."
nullable: true
example: b471682e-fa17-4e46-b7fe-9b2b8fdcb3c2
title:
type: string
description: Staff member's title.
nullable: true
example: Mr
firstName:
type: string
description: Staff member's first name.
nullable: true
example: John
middleName:
type: string
description: Staff member's middle name (if applicable).
nullable: true
example: ''
lastName:
type: string
description: Staff member's last name.
nullable: true
example: Smith
initials:
type: string
description: Staff member's initials.
nullable: true
example: JS
phone:
allOf:
- $ref: '#/components/schemas/PhoneNumberDto'
description: Staff member's phone number.
nullable: true
cell:
allOf:
- $ref: '#/components/schemas/PhoneNumberDto'
description: Staff member's cell number.
nullable: true
email:
# --- truncated at 32 KB (34 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/smokeball/refs/heads/main/openapi/smokeball-firm-api-openapi.yml