Facilio Custom Modules API
Manage your organization's custom modules — record types you define for the data and workflows that are specific to your business.
Manage your organization's custom modules — record types you define for the data and workflows that are specific to your business.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/facilio-custom-modules-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Facilio REST Custom Modules API
version: 5.0.0
description: The Facilio REST API gives you programmatic access to Facilio's Connected CMMS — the unified platform for managing property operations at portfolio scale.
contact:
name: Facilio Support
url: https://facilio.com
license:
name: Proprietary
servers:
- url: https://{region}.facilioapis.com/{app_name}/api/v5
variables:
region:
description: Regional deployment
default: us
enum:
- us
- au
- ae
- uk
- us-azure
- sa
app_name:
description: '''maintenance'' for API Key, ''developer'' for OAuth2'
default: maintenance
enum:
- maintenance
- developer
security:
- apiKey: []
- oauth2: []
tags:
- name: Custom Modules
description: Manage your organization's custom modules — record types you define for the data and workflows that are specific to your business.
paths:
/{moduleName}:
get:
tags:
- Custom Modules
summary: List custom module records
description: 'Returns a paginated list of records from the custom module. Supports filtering, sorting, field selection, and saved views.
Custom fields are excluded from list responses by default; use `?select=` to include them.'
operationId: listCustomModuleRecords
parameters:
- name: moduleName
in: path
required: true
description: 'Custom module name (e.g. `custom_employees`). Must be a module returned by `GET /modules` with `isCustom: true`.'
schema:
type: string
- $ref: '#/components/parameters/page'
- $ref: '#/components/parameters/pageSize'
- $ref: '#/components/parameters/select'
- $ref: '#/components/parameters/expand'
- $ref: '#/components/parameters/search'
- $ref: '#/components/parameters/count'
- $ref: '#/components/parameters/view'
- $ref: '#/components/parameters/changed'
- name: sortBy
in: query
description: 'Field to sort by. Sortable fields: `name`, `sysCreatedTime`, `sysModifiedTime`. Custom fields of primitive types (string, number, date) are also sortable.'
schema:
type: string
enum:
- name
- sysCreatedTime
- sysModifiedTime
- name: sortOrder
in: query
schema:
type: string
enum:
- asc
- desc
default: desc
responses:
'200':
description: List of records
content:
application/json:
schema:
$ref: '#/components/schemas/ListResponse'
example:
success: true
data:
- id: 1
name: Alice
siteId:
id: 10
moduleState:
id: 1
sysCreatedTime: '2026-01-15T10:00:00Z'
sysModifiedTime: '2026-03-01T14:30:00Z'
- id: 2
name: Bob
siteId:
id: 10
moduleState:
id: 1
sysCreatedTime: '2026-01-16T09:00:00Z'
sysModifiedTime: '2026-03-02T11:00:00Z'
pagination:
page: 1
pageSize: 50
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
post:
tags:
- Custom Modules
summary: Create a custom module record
description: Creates a new record. Pass field values in `data`; see metadata for required fields and types.
operationId: createCustomModuleRecord
parameters:
- name: moduleName
in: path
required: true
description: Custom module name
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- data
properties:
data:
type: object
description: Record field values
example:
data:
name: Alice
department_custom_employees: Engineering
responses:
'201':
description: Record created
content:
application/json:
schema:
$ref: '#/components/schemas/SingleResponse'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/{moduleName}/{id}:
get:
tags:
- Custom Modules
summary: Get a custom module record
description: Returns a single record by ID. All fields are included in the response, including custom fields.
operationId: getCustomModuleRecord
parameters:
- name: moduleName
in: path
required: true
description: Custom module name
schema:
type: string
- $ref: '#/components/parameters/recordId'
- $ref: '#/components/parameters/select'
- $ref: '#/components/parameters/expand'
responses:
'200':
description: Record retrieved
content:
application/json:
schema:
$ref: '#/components/schemas/SingleResponse'
example:
success: true
data:
id: 1
name: Alice
siteId:
id: 10
department_custom_employees: Engineering
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
patch:
tags:
- Custom Modules
summary: Update a custom module record
description: Partially updates a record. Only include the fields you want to change. Pass `null` to clear a field.
operationId: updateCustomModuleRecord
parameters:
- name: moduleName
in: path
required: true
description: Custom module name
schema:
type: string
- $ref: '#/components/parameters/recordId'
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- data
properties:
data:
type: object
example:
data:
department_custom_employees: Finance
responses:
'200':
description: Record updated
content:
application/json:
schema:
$ref: '#/components/schemas/SingleResponse'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
delete:
tags:
- Custom Modules
summary: Delete a custom module record
description: Permanently deletes a record from the custom module.
operationId: deleteCustomModuleRecord
parameters:
- name: moduleName
in: path
required: true
description: Custom module name
schema:
type: string
- $ref: '#/components/parameters/recordId'
responses:
'200':
description: Record deleted
content:
application/json:
example:
success: true
message: Record deleted
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/{moduleName}/metadata:
get:
tags:
- Custom Modules
summary: Get custom module field schema
description: 'Returns module identity and field schema (types, required, readOnly, lookup targets). Each field includes `isCustom` and, for text-style fields, the canonical `max_length` (255 / 2000 / 32000).
Works for any module name returned by `GET /modules`.
Pass `?includeAllowedValues=true` to add `allowed_values` ([{label, value}]) on every picklist-capable field — `ENUM`, `SYSTEM_ENUM`, `MULTI_ENUM`, `STRING_SYSTEM_ENUM`, and `LOOKUP` fields targeting system picklist modules. Default behavior (no flag) is unchanged.'
operationId: getCustomModuleMetadata
parameters:
- name: moduleName
in: path
required: true
description: Module name — any module returned by `GET /modules`
schema:
type: string
- $ref: '#/components/parameters/includeAllowedValues'
responses:
'200':
description: Field schema retrieved successfully
content:
application/json:
schema:
$ref: '#/components/schemas/ModuleMetaResponse'
example:
success: true
data:
module:
name: custom_employees
displayName: Employees
description: Custom employee records
isCustom: true
fields:
- name: name
displayName: Name
dataType: STRING
required: true
readOnly: false
isCustom: false
max_length: 255
- name: siteId
displayName: Site
dataType: LOOKUP
lookupModuleName: site
required: false
readOnly: false
isCustom: false
- name: externalField
displayName: External Field
dataType: STRING
required: false
readOnly: false
isCustom: false
max_length: 255
- name: moduleState
displayName: Status
dataType: LOOKUP
lookupModuleName: ticketstatus
required: false
readOnly: false
isCustom: false
allowed_values:
- label: Submitted
value: Submitted
- label: Open
value: Open
- label: Closed
value: Closed
- name: sysCreatedTime
displayName: Created Time
dataType: DATE_TIME
required: false
readOnly: true
isCustom: false
- name: sysCreatedBy
displayName: Created By
dataType: LOOKUP
lookupModuleName: users
required: false
readOnly: true
isCustom: false
- name: sysModifiedTime
displayName: Modified Time
dataType: DATE_TIME
required: false
readOnly: true
isCustom: false
- name: sysModifiedBy
displayName: Modified By
dataType: LOOKUP
lookupModuleName: users
required: false
readOnly: true
isCustom: false
- name: department_custom_employees
displayName: Department
dataType: STRING
required: false
readOnly: false
isCustom: true
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
components:
schemas:
FacilioField:
type: object
description: Schema descriptor for a single field within a module.
properties:
name:
type: string
description: Field name used in API requests and responses (e.g. `subject`, `po_reference_workorder`)
displayName:
type: string
description: Human-readable field label
dataType:
type: string
description: 'Field data type. Common values:
`STRING`, `NUMBER`, `DECIMAL`, `BOOLEAN`,
`DATE`, `DATE_TIME`,
`BIG_STRING` (large text, excluded from list responses),
`LOOKUP` (reference to another record — see `lookupModuleName`),
`MULTI_LOOKUP` (multi-reference — see `lookupModuleName`),
`ENUM`, `SYSTEM_ENUM`, `STRING_SYSTEM_ENUM` (picklist types)
'
example: STRING
required:
type: boolean
description: '`true` if this field must be provided on record creation'
readOnly:
type: boolean
description: '`true` if this field cannot be set or modified via the API (e.g. auto-generated system fields)'
isCustom:
type: boolean
description: '`true` for fields added by your organization; `false` for standard built-in fields'
sortable:
type: boolean
description: '`true` if this field can be used as a `sortBy` value on the list API'
lookupModuleName:
type: string
description: Present only on `LOOKUP` and `MULTI_LOOKUP` fields. The name of the target module (e.g. `site`, `users`, `ticketstatus`).
max_length:
type: integer
description: 'Maximum number of characters accepted by the V5 write API for text-style fields.
Present only when the field''s `dataType` is one of:
`STRING` (255), `LARGE_TEXT` (2000), `BIG_STRING` (32000).
Omitted for all other data types.
'
example: 255
allowed_values:
type: array
description: 'List of acceptable write values for picklist-capable fields. Present **only when the request includes `?includeAllowedValues=true`** AND the field is one of:
`ENUM`, `SYSTEM_ENUM`, `MULTI_ENUM`, `STRING_SYSTEM_ENUM`, or a `LOOKUP` targeting a system picklist module (e.g. `ticketstatus`, `ticketpriority`, `ticketcategory`, `tickettype`).
Each entry uses `{label, value}`; the `value` is the canonical form accepted by create/update payloads.
'
items:
type: object
properties:
label:
type: string
description: Display label as shown in the UI
value:
type: string
description: Canonical value accepted by create/update for this field and filtering
ModuleMetaResponse:
type: object
description: Response body for GET /{moduleName}/metadata.
properties:
success:
type: boolean
data:
type: object
properties:
module:
$ref: '#/components/schemas/FacilioModule'
fields:
type: array
description: 'Ordered list of fields for the module.
Standard Facilio modules return built-in fields first, followed by any fields your organization added.
Custom modules return all fields.
'
items:
$ref: '#/components/schemas/FacilioField'
SingleResponse:
type: object
properties:
success:
type: boolean
data:
type: object
message:
type: string
FacilioModule:
type: object
description: A single entry in the module catalogue returned by GET /modules.
properties:
name:
type: string
description: Module name used in all API paths (e.g. `workorder`, `custom_employees`)
displayName:
type: string
description: Human-readable module label (e.g. `Work Orders`, `Employees`)
description:
type: string
description: Module description as configured in Facilio Setup. Omitted when blank.
isCustom:
type: boolean
description: '`true` for modules created by your organization; `false` for standard Facilio modules'
ListResponse:
type: object
properties:
success:
type: boolean
data:
type: array
items:
type: object
pagination:
type: object
properties:
page:
type: integer
pageSize:
type: integer
count:
type: integer
description: Total count (only when ?count=true)
Error:
type: object
description: Error response
properties:
success:
type: boolean
example: false
error:
type: object
properties:
code:
type: string
description: Machine-readable error code
message:
type: string
description: Human-readable error message
parameters:
expand:
name: expand
in: query
description: 'Comma-separated lookup field names to expand on **list** endpoints (max 5).
Expanded objects follow the same rules as single-record GET (see **Lookup fields in responses** in the API overview).
'
schema:
type: string
includeAllowedValues:
name: includeAllowedValues
in: query
description: 'When `true`, the metadata response adds `allowed_values` ([{label, value}]) on every picklist-capable field — `ENUM`, `SYSTEM_ENUM`, `MULTI_ENUM`, `STRING_SYSTEM_ENUM`, and `LOOKUP` fields targeting system picklist modules (status, priority, category, type, ...).
Default `false` keeps the original metadata payload (no enrichment, no extra DB calls).
Use this to discover acceptable write values without round-tripping `GET /picklist/{moduleName}/{fieldName}` for every picklist field.
'
schema:
type: boolean
default: false
select:
name: select
in: query
description: Comma-separated field names to include in the response
schema:
type: string
recordId:
name: id
in: path
required: true
description: Record ID
schema:
type: integer
format: int64
changed:
name: changed
in: query
description: 'Delta sync: returns records created/modified after this UTC timestamp'
schema:
type: string
format: date-time
view:
name: view
in: query
description: Saved view name
schema:
type: string
page:
name: page
in: query
description: Page number (1-based)
schema:
type: integer
default: 1
count:
name: count
in: query
description: Include total record count in response
schema:
type: boolean
default: false
search:
name: search
in: query
description: Free-text search on the primary field (subject, name, etc.)
schema:
type: string
pageSize:
name: pageSize
in: query
description: Records per page (max 200)
schema:
type: integer
default: 50
maximum: 200
responses:
BadRequest:
description: Validation error — missing required fields, invalid field values, or malformed request body
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
success: false
error:
code: VALIDATION_ERROR
message: 'Required field(s) missing: name'
NotFound:
description: Record or module not found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
success: false
error:
code: RECORD_NOT_FOUND
message: Record with the given ID was not found
Unauthorized:
description: Missing or invalid authentication credentials
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
success: false
error:
code: UNAUTHORIZED
message: Missing or invalid authentication credentials
securitySchemes:
apiKey:
type: apiKey
in: header
name: x-api-key
description: Personal access token
oauth2:
type: oauth2
description: Supports authorization_code and password grant types
flows:
authorizationCode:
authorizationUrl: https://us.facilioapis.com/identity/oauth2/authorize
tokenUrl: https://us.facilioapis.com/identity/oauth2/token
refreshUrl: https://us.facilioapis.com/identity/oauth2/token
scopes: {}
password:
tokenUrl: https://us.facilioapis.com/identity/oauth2/token
refreshUrl: https://us.facilioapis.com/identity/oauth2/token
scopes: {}