openapi: 3.0.3 info: title: Facilio REST Assets Picklists 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.\n\nBuild integrations that connect Facilio with your ERP, accounting systems, BMS, IoT platforms, and other business tools. Automate work order creation from external triggers, synchronize asset data across systems, push tenant and vendor records from your CRM, or pull maintenance data into your reporting dashboards.\n\n**What you can do with this API:**\n- **Work Orders & Service Requests** — Create, assign, track, and close maintenance tasks programmatically\n- **Assets** — Manage your equipment registry, track asset lifecycle, and sync with external asset management systems\n- **Portfolio (Sites, Buildings, Floors, Spaces)** — Maintain your facility hierarchy and space data\n- **People (Tenants, Vendors, Clients)** — Synchronize contacts and stakeholder records\n- **Inventory (Item Types, Tool Types, Items & Tools, Services, Storerooms)** — Master data, per-storeroom item/tool balances (read), per-bin quantities by item or tool record, quantity adjustments, and warehouse locations\n- **Procurement (Quotes, Purchase Requests, Purchase Orders, Receivable receiving, Invoices)** — Procurement with line items; receive against a PO via receivable APIs\n- **Credit Notes (Vendor Credits, Client Credits)** — Manage credit notes for refunds and transaction adjustments with line items\n- **Inventory Requests** — Track material requisitions from work orders to storerooms\n- **Custom Modules** — Manage your organization's custom modules — record types you define for the data and workflows that are specific to your business\n- **Schema Discovery** — List all accessible modules and inspect field schemas (name, type, required, readOnly, lookup target) via `GET /modules` and `GET /{moduleName}/metadata`\n- **Attachments & Comments** — Attach documents, photos, and notes to work orders and service requests\n- **Picklists** — Discover available values for status, priority, category, and other configurable fields\n\nThe API follows REST conventions with JSON request/response bodies, standard HTTP methods (GET, POST, PATCH, DELETE), and consistent error handling across all endpoints.\n\n## Base URL\n\n```\nhttps://{region}.facilioapis.com/{app_name}/api/v5\n```\n\n| Variable | Description | Values |\n|----------|-------------|--------|\n| `region` | Your deployment region | `us`, `au`, `ae`, `uk`, `us-azure`, `sa` |\n| `app_name` | `maintenance` for API Key auth, `developer` for OAuth2 auth | `maintenance`, `developer` |\n\n## Authentication\n\nAll API requests must be authenticated using one of the following methods:\n\n### API Key (Personal Access Token)\nGenerate an API key from your Facilio account settings and pass it in the `x-api-key` header.\nThe key inherits the permissions of the user who created it.\n\n```\nx-api-key: your-api-key-here\n```\n\n### OAuth2\nFor developer app integrations. Supports **authorization_code** and **password** grant types.\n\n| Endpoint | URL |\n|----------|-----|\n| Authorize | `https://{region}.facilioapis.com/identity/oauth2/authorize` |\n| Token | `https://{region}.facilioapis.com/identity/oauth2/token` |\n| Refresh | `https://{region}.facilioapis.com/identity/oauth2/token` (with `grant_type=refresh_token`) |\n| Revoke | `https://{region}.facilioapis.com/identity/oauth2/revoke` |\n\nPass the access token as:\n```\nAuthorization: Bearer oauth2 \n```\n\n---\n\n## List Operations\n\nAll list endpoints (`GET /{module}`) support these query parameters:\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `page` | integer | 1 | Page number (1-based) |\n| `pageSize` | integer | 50 | Number of records per page. Maximum is 200. |\n| `select` | string | — | Comma-separated field names to include in the response. If omitted, module default fields are returned. |\n| `expand` | string | — | Comma-separated lookup field names to expand with full details (max 5). By default, lookup fields return only `{id}`. |\n| `search` | string | — | Free-text search on the module's primary field (e.g. subject for work orders, name for assets). |\n| `sortBy` | string | — | Field name to sort by. Only sortable fields are accepted (see each module's documentation). |\n| `sortOrder` | string | `desc` | Sort direction: `asc` (ascending) or `desc` (descending). |\n| `count` | boolean | false | When `true`, the response includes a `count` field with the total number of matching records. |\n| `view` | string | — | Name of a saved view. Applies the view's columns, filters, and sort order. |\n| `changed` | string | — | UTC timestamp for delta sync (format: `yyyy-MM-dd'T'HH:mm:ss'Z'`). Returns records created or modified after this time. |\n\n---\n\n## Filtering\n\nApply filters by adding query parameters to any list endpoint. Filters are combined with AND logic.\n\n**Exact match:**\n```\nGET /workorder?status=Submitted&priority=High\n```\n\n**Operator match:**\n```\nGET /workorder?subject(contains)=HVAC&createdTime(after)=2026-01-01T00:00:00Z\n```\n\n### Operators by Field Type\n\n| Field Type | Example Fields | Operators | Value Format |\n|------------|----------------|-----------|--------------|\n| String | subject, name, description | `is`, `isn_t`, `contains`, `doesn_t_contain`, `starts_with`, `ends_with` | Text string |\n| Number | serialNumber, area, noOfTasks | `equals`, `not_equals`, `greater_than`, `less_than`, `greater_than_equal`, `less_than_equal`, `between` | Number (for `between`: two comma-separated values) |\n| Date/DateTime | createdTime, dueDate, scheduledStart | `is`, `isn_t`, `before`, `after`, `between`, `today`, `yesterday`, `current_week`, `last_week`, `current_month`, `last_month` | UTC `yyyy-MM-dd'T'HH:mm:ss'Z'` (value-less operators like `today` need no value) |\n| Boolean | highRisk, decommission | `equals`, `is` | `true` or `false` |\n| Lookup | resource, site, assignedTo, createdBy | `is`, `isn_t` | Record ID (integer) |\n| Picklist | status, priority, category, type | `is`, `isn_t` | Display name string (e.g. `Submitted`) or ID |\n| Enum | sourceType, urgency | `is`, `isn_t` | Display name string or index |\n| All types | Any field | `is_empty`, `is_not_empty` | No value needed |\n\n**Multiple values (OR within a field):**\n```\nGET /workorder?priority=High,Medium\n```\n\n---\n\n## Delta Sync\n\nFor incremental data synchronization, use the `changed` parameter to fetch only records that have been created or modified since your last sync:\n\n```\nGET /workorder?changed=2026-02-01T00:00:00Z\n```\n\nThis checks both the created time and modified time of each record (OR condition), so you get both new and updated records. You can combine `changed` with other filters.\n\n---\n\n## Custom Fields\n\nCustom fields are user-defined fields added via Facilio setup. They follow the naming pattern `{field_name}_{module}` (e.g. `po_reference_workorder`, `client_type_site`, `warranty_info_asset`).\n\n| Operation | Behavior |\n|-----------|----------|\n| **Single record GET** | Custom fields are automatically included in the response |\n| **List GET** | Custom fields are excluded by default. Use `?select=subject,po_reference_workorder` to include specific ones |\n| **Create / Update** | Pass custom fields in the request body alongside system fields |\n| **Filtering** | Custom fields can be used as filter parameters |\n| **Sorting** | Custom fields of primitive types (string, number, date) can be used with `sortBy` |\n\n> **Note:** Large text (BIG_STRING) custom fields are always excluded from list responses to prevent excessive memory usage. They are only available on single record GET.\n\n**Example — Create a work order with custom fields:**\n```json\n{\n \"data\": {\n \"subject\": \"HVAC Repair\",\n \"siteId\": 10,\n \"po_reference_workorder\": \"PO-2026-001\",\n \"cost_estimate_workorder\": 1500.00\n }\n}\n```\n\n---\n\n## Lookup fields in responses\n\nA **lookup** links your record to another record or to a controlled list (site, assignee, tenant, status, and so on). The JSON shape depends on which endpoint you call.\n\n### Lists (`GET /{module}`)\n\nBy default, each lookup is compact: `{ \"id\": }`.\n\nTo load more detail on specific lookups, use `?expand=` with a comma-separated list of **lookup field names** (maximum **5** fields).\n\n### Single record, create, and update\n\nOn **GET** by id, **POST** create, and **PATCH** update, lookups that appear in the response are usually **expanded** into a small object instead of only an id.\n\nWhat you get is decided by **what the field points to**:\n\n- **Standard business records** in this API (for example site, tenant, asset, work order): the fields that module normally exposes, **including custom fields** you added on that target record. If the expanded object itself contains another lookup, that inner lookup stays compact: `{ \"id\" }` only.\n- **People and shared reference data** (for example `users`, `people`, `location`, `resource`): a **short, fixed list** of fields the API publishes — e.g. users typically include `id`, `name`, `email`, and `phone` when present. Internal database columns are not returned.\n- **Your org’s custom module** as the target: that module’s usual fields **plus** its custom fields.\n- **Any other target** not covered above: **`id`** and **`name`** only.\n\nSome fields behave as **picklists** (status, priority, category, type, …). They often return a **single text or id value** (e.g. `\"Submitted\"`) instead of a nested object. Check `GET /{moduleName}/metadata` for the field’s `dataType` and picklist details.\n\nProperties that are null are omitted from the JSON body.\n\n---\n\n## Response Format\n\n**Success — single record:**\n```json\n{\n \"success\": true,\n \"data\": { \"id\": 1, \"subject\": \"WO-1\", \"status\": \"Submitted\" }\n}\n```\n\n**Success — list:**\n```json\n{\n \"success\": true,\n \"data\": [ { \"id\": 1, ... }, { \"id\": 2, ... } ],\n \"pagination\": { \"page\": 1, \"pageSize\": 50 },\n \"count\": 120\n}\n```\n\n**Error:**\n```json\n{\n \"success\": false,\n \"error\": {\n \"code\": \"VALIDATION_ERROR\",\n \"message\": \"A specified field does not exist or is not accessible\"\n }\n}\n```\n\n---\n\n## Error Codes\n\n| Code | HTTP | Description |\n|------|------|-------------|\n| `UNAUTHORIZED` | 401 | Missing or invalid authentication |\n| `FORBIDDEN` | 403 | Insufficient permissions for this operation |\n| `MODULE_NOT_FOUND` | 404 | Module does not exist or is not accessible in this app |\n| `RECORD_NOT_FOUND` | 404 | Record with the given ID was not found |\n| `API_NOT_FOUND` | 404 | The API endpoint does not exist |\n| `VIEW_NOT_FOUND` | 404 | The specified saved view was not found |\n| `PICKLIST_NOT_FOUND` | 404 | The specified picklist field was not found |\n| `VALIDATION_ERROR` | 400 | Request body or parameters failed validation |\n| `INVALID_FIELD` | 400 | A specified field does not exist or is not accessible |\n| `INVALID_FILTER` | 400 | Filter syntax is invalid or operator not supported for field type |\n| `EXPAND_LIMIT_EXCEEDED` | 400 | More than 5 fields specified in `expand` parameter |\n| `METHOD_NOT_ALLOWED` | 405 | HTTP method not supported for this endpoint |\n| `CREATE_NOT_ALLOWED` | 403 | Create operation is disabled for this module |\n| `UPDATE_NOT_ALLOWED` | 403 | Update operation is disabled for this module |\n| `DELETE_NOT_ALLOWED` | 403 | Delete operation is disabled for this module |\n| `MODULE_NOT_ENABLED` | 403 | Module is not enabled for this organization |\n| `RATE_LIMITED` | 429 | Rate limit exceeded |\n| `INTERNAL_ERROR` | 500 | Unexpected server error |\n\n---\n\n## Rate Limiting\n\n- **Limit:** 100 requests per minute per API key / OAuth2 token\n- **Response:** HTTP 429 Too Many Requests when exceeded\n- **Recommendation:** Implement exponential backoff when receiving 429 responses\n\n---\n\n## HTTP Method Override\n\nSome systems only support POST and GET requests. To use PATCH, or DELETE through a POST request,\ninclude the `X-HTTP-Method-Override` header with the desired method.\n\n```\nPOST /workorder/13\nX-HTTP-Method-Override: PATCH\nContent-Type: application/json\n\n{ \"data\": { \"priority\": \"Low\" } }\n```\n\nThis is equivalent to `PATCH /workorder/13`. Supported override values: `PATCH`, `DELETE`.\nThe override header is only honored on POST requests.\n\n---\n\n## Field Types and Limits\n\n| Field Type | Max Length | Description |\n|------------|-----------|-------------|\n| String | 255 characters | Short text fields (e.g. subject, name, email) |\n| Large Text | 2,000 characters | Medium text fields (e.g. description) |\n| Big String | 32,000 characters | Long text fields (custom large text fields). Excluded from list API responses. |\n| Number | — | Integer or decimal values |\n| Date / DateTime | — | UTC format: `yyyy-MM-dd'T'HH:mm:ss'Z'` |\n| Boolean | — | `true` or `false` |\n| Lookup | — | Reference to another record. Pass the record ID on create/update. Returns `{id}` on list unless `?expand=` is used. On single-record GET (and typical create/update responses), expanded shape follows **Lookup fields in responses** above — not a single fixed `{id, name, email}` for every field. |\n| Picklist | — | Enumerated values (status, priority, category, type). Pass display name string (e.g. `\"High\"`) or numeric ID. |\n| Enum | — | System enum values. Pass display name string or index. |\n\nValues exceeding the maximum length will be rejected with a `VALIDATION_ERROR`.\n\n---\n\n## Additional Notes\n\n- **Skipping Workflows:** By default, workflow rules (automations, notifications, approvals) execute when you create or update a record. To skip them, pass the header `X-Execute-Workflows: false`. This is useful for bulk data imports or migrations where triggering automations is not desired.\n- **Picklist Fields:** Fields like status, priority, category, and type accept and return display name strings (e.g. `\"Submitted\"`, `\"High\"`, `\"Energy\"`). You can also pass the numeric ID.\n- **Lookup Fields:** On list API, lookup fields return `{id}` only unless `?expand=` is used. On single record GET (and create/update responses), lookups are expanded automatically; the property set depends on the lookup target module — see **Lookup fields in responses**.\n" 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: Picklists description: 'Retrieve picklist values for enum and system lookup fields. Use these to discover valid values for fields like status, priority, category, and type. Custom picklist fields can also be queried using `GET /picklist/{module}/{fieldName}`. ' paths: /picklist/workorder/status: get: tags: - Picklists summary: Work order statuses description: Returns all available status values for work orders. operationId: getWorkOrderStatuses parameters: - $ref: '#/components/parameters/picklistSearch' responses: '200': description: List of status values content: application/json: example: success: true data: - id: 9 status: Submitted displayName: Submitted - id: 10 status: Assigned displayName: Assigned - id: 11 status: Work in Progress displayName: Work in Progress - id: 12 status: Resolved displayName: Resolved - id: 13 status: Closed displayName: Closed schema: $ref: '#/components/schemas/WorkOrderStatus' '401': $ref: '#/components/responses/Unauthorized' /picklist/workorder/priority: get: tags: - Picklists summary: Work order priorities description: Returns all available priority values for work orders. operationId: getWorkOrderPriorities parameters: - $ref: '#/components/parameters/picklistSearch' responses: '200': description: List of priority values content: application/json: example: success: true data: - id: 1 priority: High displayName: High - id: 2 priority: Medium displayName: Medium - id: 3 priority: Low displayName: Low schema: $ref: '#/components/schemas/Priority' '401': $ref: '#/components/responses/Unauthorized' /picklist/workorder/category: get: tags: - Picklists summary: Work order categories description: Returns all available category values for work orders. operationId: getWorkOrderCategories parameters: - $ref: '#/components/parameters/picklistSearch' responses: '200': description: List of category values content: application/json: example: success: true data: - id: 6 name: Energy displayName: Energy - id: 7 name: HVAC displayName: HVAC - id: 8 name: Plumbing displayName: Plumbing schema: $ref: '#/components/schemas/WorkOrderCategory' '401': $ref: '#/components/responses/Unauthorized' /picklist/workorder/type: get: tags: - Picklists summary: Work order types description: Returns all available type values for work orders. operationId: getWorkOrderTypes parameters: - $ref: '#/components/parameters/picklistSearch' responses: '200': description: List of type values content: application/json: example: success: true data: - id: 5 name: Compliance displayName: Compliance - id: 6 name: Corrective displayName: Corrective - id: 7 name: Preventive displayName: Preventive schema: $ref: '#/components/schemas/WorkOrderType' '401': $ref: '#/components/responses/Unauthorized' /picklist/servicerequest/moduleState: get: tags: - Picklists summary: Service request statuses description: Returns all available status values for service requests. operationId: getServiceRequestStatuses parameters: - $ref: '#/components/parameters/picklistSearch' responses: '200': description: List of status values content: application/json: schema: $ref: '#/components/schemas/ServiceRequestStatus' '401': $ref: '#/components/responses/Unauthorized' /picklist/servicerequest/urgency: get: tags: - Picklists summary: Service request urgency levels description: Returns all available urgency levels for service requests (equivalent to priority). operationId: getServiceRequestUrgencyLevels parameters: - $ref: '#/components/parameters/picklistSearch' responses: '200': description: List of urgency values content: application/json: schema: $ref: '#/components/schemas/Priority' '401': $ref: '#/components/responses/Unauthorized' /picklist/asset/category: get: tags: - Picklists summary: Asset categories description: Returns all available category values for assets. operationId: getAssetCategories parameters: - $ref: '#/components/parameters/picklistSearch' responses: '200': description: List of category values content: application/json: schema: $ref: '#/components/schemas/AssetCategory' '401': $ref: '#/components/responses/Unauthorized' /picklist/asset/type: get: tags: - Picklists summary: Asset types description: Returns all available type values for assets. operationId: getAssetTypes parameters: - $ref: '#/components/parameters/picklistSearch' responses: '200': description: List of type values content: application/json: schema: $ref: '#/components/schemas/AssetType' '401': $ref: '#/components/responses/Unauthorized' /picklist/asset/department: get: tags: - Picklists summary: Asset departments description: Returns all available department values for assets. operationId: getAssetDepartments parameters: - $ref: '#/components/parameters/picklistSearch' responses: '200': description: List of department values content: application/json: schema: $ref: '#/components/schemas/AssetDepartment' '401': $ref: '#/components/responses/Unauthorized' /picklist/space/spaceCategory: get: tags: - Picklists summary: Space categories description: Returns all available category values for spaces. operationId: getSpaceCategories parameters: - $ref: '#/components/parameters/picklistSearch' responses: '200': description: List of category values content: application/json: schema: $ref: '#/components/schemas/SpaceCategory' '401': $ref: '#/components/responses/Unauthorized' /picklist/quote/moduleState: get: tags: - Picklists summary: Quote statuses description: Returns all available status values for quotes. operationId: getQuoteStatuses parameters: - $ref: '#/components/parameters/picklistSearch' responses: '200': description: List of status values content: application/json: example: success: true data: - id: 1 status: Draft displayName: Draft - id: 2 status: Sent displayName: Sent - id: 3 status: Approved displayName: Approved - id: 4 status: Rejected displayName: Rejected - id: 5 status: Revised displayName: Revised schema: $ref: '#/components/schemas/CustomPicklistValues' '401': $ref: '#/components/responses/Unauthorized' /picklist/invoice/invoiceStatus: get: tags: - Picklists summary: Invoice statuses description: Returns all available status values for invoices. operationId: getInvoiceStatuses parameters: - $ref: '#/components/parameters/picklistSearch' responses: '200': description: List of status values content: application/json: example: success: true data: - id: 1 displayName: Draft - id: 2 displayName: Invoice Delivered - id: 3 displayName: Invoice Rejected - id: 4 displayName: Invoice Approved - id: 5 displayName: Invoice Cancelled - id: 6 displayName: Payment Acknowledged - id: 7 displayName: Revised schema: $ref: '#/components/schemas/EnumPicklistValues' '401': $ref: '#/components/responses/Unauthorized' /picklist/purchaserequest/moduleState: get: tags: - Picklists summary: Purchase request statuses description: Returns all available status values for purchase requests. operationId: getPurchaseRequestStatuses parameters: - $ref: '#/components/parameters/picklistSearch' responses: '200': description: List of status values content: application/json: example: success: true data: - id: 1 status: Requested displayName: Requested - id: 2 status: Approved displayName: Approved - id: 3 status: Ordered displayName: Ordered - id: 4 status: Rejected displayName: Rejected schema: $ref: '#/components/schemas/CustomPicklistValues' '401': $ref: '#/components/responses/Unauthorized' /picklist/purchaseorder/moduleState: get: tags: - Picklists summary: Purchase order statuses description: Returns all available status values for purchase orders. operationId: getPurchaseOrderStatuses parameters: - $ref: '#/components/parameters/picklistSearch' responses: '200': description: List of status values content: application/json: example: success: true data: - id: 1 status: Requested displayName: Requested - id: 2 status: Approved displayName: Approved - id: 3 status: Received displayName: Received - id: 4 status: Rejected displayName: Rejected schema: $ref: '#/components/schemas/CustomPicklistValues' '401': $ref: '#/components/responses/Unauthorized' /picklist/inventoryrequest/moduleState: get: tags: - Picklists summary: Inventory request statuses description: Returns all available status values for inventory requests. operationId: getInventoryRequestStatuses parameters: - $ref: '#/components/parameters/picklistSearch' responses: '200': description: List of status values content: application/json: example: success: true data: - id: 1 status: pending displayName: Pending - id: 2 status: fullyreserved displayName: Fully Reserved - id: 3 status: partiallyreserved displayName: Partially Reserved - id: 4 status: issued displayName: Issued schema: $ref: '#/components/schemas/CustomPicklistValues' '401': $ref: '#/components/responses/Unauthorized' /picklist/vendorCredit/vendorCreditNoteStatus: get: tags: - Picklists summary: Vendor credit statuses description: Returns all available status values for vendor credits. operationId: getVendorCreditStatuses parameters: - $ref: '#/components/parameters/picklistSearch' responses: '200': description: List of status values content: application/json: example: success: true data: - id: 1 value: Awaiting Refund displayName: Awaiting Refund - id: 2 value: Refunded displayName: Refunded - id: 3 value: Credit Note Revised displayName: Credit Note Revised schema: $ref: '#/components/schemas/CustomPicklistValues' '401': $ref: '#/components/responses/Unauthorized' /picklist/clientCredit/clientCreditNoteStatus: get: tags: - Picklists summary: Client credit statuses description: Returns all available status values for client credits. operationId: getClientCreditStatuses parameters: - $ref: '#/components/parameters/picklistSearch' responses: '200': description: List of status values content: application/json: example: success: true data: - id: 1 value: Awaiting Refund displayName: Awaiting Refund - id: 2 value: Refunded displayName: Refunded - id: 3 value: Credit Note Revised displayName: Credit Note Revised schema: $ref: '#/components/schemas/CustomPicklistValues' '401': $ref: '#/components/responses/Unauthorized' /picklist/{moduleName}/{fieldName}: get: tags: - Picklists summary: Get picklist values for a custom field description: 'Returns picklist values for custom enum or system picklist fields. Only enum-type and system picklist lookup fields are supported. For regular lookup fields (site, building, asset), use the module''s list API instead. ' operationId: getCustomPicklistValues parameters: - name: moduleName in: path required: true description: Module name (e.g. `workorder`, `asset`) schema: type: string - name: fieldName in: path required: true description: Field name (e.g. `urgency`, `warranty_type_asset`) schema: type: string - $ref: '#/components/parameters/picklistSearch' responses: '200': description: List of picklist values content: application/json: schema: $ref: '#/components/schemas/CustomPicklistValues' example: success: true data: - id: 1 displayName: Option A - id: 2 displayName: Option B '401': $ref: '#/components/responses/Unauthorized' components: schemas: WorkOrderCategory: type: object properties: success: type: boolean data: type: array items: type: object properties: id: type: integer name: type: string description: Category name displayName: type: string AssetDepartment: type: object properties: success: type: boolean data: type: array items: type: object properties: id: type: integer name: type: string description: Department name AssetType: type: object properties: success: type: boolean data: type: array items: type: object properties: id: type: integer name: type: string description: Type name displayName: type: string SpaceCategory: type: object properties: success: type: boolean data: type: array items: type: object properties: id: type: integer name: type: string description: Category name (e.g. Office, Conference Room) displayName: type: string EnumPicklistValues: type: object description: Enum picklist values — returns {id, displayName} for each value properties: success: type: boolean data: type: array items: type: object properties: id: type: integer displayName: type: string CustomPicklistValues: type: object description: moduleState picklist values — returns {id, status, displayName} for each state properties: success: type: boolean data: type: array items: type: object properties: id: type: integer status: type: string description: Status value displayName: type: string AssetCategory: type: object properties: success: type: boolean data: type: array items: type: object properties: id: type: integer name: type: string description: Category name (e.g. HVAC, Electrical) displayName: type: string WorkOrderType: type: object properties: success: type: boolean data: type: array items: type: object properties: id: type: integer name: type: string description: Type name displayName: type: string ServiceRequestStatus: type: object properties: success: type: boolean data: type: array items: type: object properties: id: type: integer status: type: string description: Status value displayName: type: string 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 Priority: type: object description: Used for work order priority and service request urgency properties: success: type: boolean data: type: array items: type: object properties: id: type: integer priority: type: string description: Priority value (e.g. High, Medium, Low) displayName: type: string colour: type: string description: 'Hex color code (e.g. #f00)' sequenceNumber: type: integer description: Sort order WorkOrderStatus: type: object properties: success: type: boolean data: type: array items: type: object properties: id: type: integer status: type: string description: Status value (e.g. Submitted, Closed) displayName: type: string parameters: picklistSearch: name: search in: query description: Filter picklist values by name schema: type: string responses: 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: {}