Facilio Quotes API

Pricing proposals with line items. Line items on PATCH represent the full desired state — omitted items are deleted.

Operations 6

GET /quote List quotes #
POST /quote Create a quote #
GET /quote/{id} Get a quote #
PATCH /quote/{id} Update a quote #
DELETE /quote/{id} Delete a quote #
GET /quote/metadata Get quote field schema #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • 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.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/facilio:facilio-quotes-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

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 Specification

facilio-quotes-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Facilio REST Quotes 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. Build 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. **What you can do with this API:**

    - **Work Orders & Service Requests** — Create, assign, track, and close maintenance tasks programmatically

    - **Assets** — Manage your equipment registry, track asset lifecycle, and sync with external asset management systems

    - **Portfolio (Sites, Buildings, Floors, Spaces)** — Maintain your facility hierarchy and space data

    - **People (Tenants, Vendors, Clients)** — Synchronize contacts and stakeholder records

    - **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

    - **Procurement (Quotes, Purchase Requests, Purchase Orders, Receivable receiving, Invoices)** — Procurement with line items; receive against a PO via receivable APIs

    - **Credit Notes (Vendor Credits, Client Credits)** — Manage credit notes for refunds and transaction adjustments with line items

    - **Inventory Requests** — Track material requisitions from work orders to storerooms

    - **Custom Modules** — Manage your organization''s custom modules — record types you define for the data and workflows that are specific to your business

    - **Schema Discovery** — List all accessible modules and inspect field schemas (name, type, required, readOnly, lookup target) via `GET /modules` and `GET /{moduleName}/metadata`

    - **Attachments & Comments** — Attach documents, photos, and notes to work orders and service requests

    - **Picklists** — Discover available values for status, priority, category, and other configurable fields


    The API follows REST conventions with JSON request/response bodies, standard HTTP methods (GET, POST, PATCH, DELETE), and consistent error handling across all endpoints. ## Base URL


    ```

    https://{region}.facilioapis.com/{app_name}/api/v5

    ```


    | Variable | Description | Values |

    |----------|-------------|--------|

    | `region` | Your deployment region | `us`, `au`, `ae`, `uk`, `us-azure`, `sa` |

    | `app_name` | `maintenance` for API Key auth, `developer` for OAuth2 auth | `maintenance`, `developer` |


    ## Authentication


    All API requests must be authenticated using one of the following methods:


    ### API Key (Personal Access Token)

    Generate an API key from your Facilio account settings and pass it in the `x-api-key` header. The key inherits the permissions of the user who created it. ```

    x-api-key: your-api-key-here

    ```


    ### OAuth2

    For developer app integrations. Supports **authorization_code** and **password** grant types. | Endpoint | URL |

    |----------|-----|

    | Authorize | `https://{region}.facilioapis.com/identity/oauth2/authorize` |

    | Token | `https://{region}.facilioapis.com/identity/oauth2/token` |

    | Refresh | `https://{region}.facilioapis.com/identity/oauth2/token` (with `grant_type=refresh_token`) |

    | Revoke | `https://{region}.facilioapis.com/identity/oauth2/revoke` |


    Pass the access token as:

    ```

    Authorization: Bearer oauth2

    ```


    ---


    ## List Operations


    All list endpoints (`GET /{module}`) support these query parameters:


    | Parameter | Type | Default | Description |

    |-----------|------|---------|-------------|

    | `page` | integer | 1 | Page number (1-based) |

    | `pageSize` | integer | 50 | Number of records per page. Maximum is 200. |

    | `select` | string | — | Comma-separated field names to include in the response. If omitted, module default fields are returned. |

    | `expand` | string | — | Comma-separated lookup field names to expand with full details (max 5).'
  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: Quotes
  description: Pricing proposals with line items. Line items on PATCH represent the full desired state — omitted items are deleted.
paths:
  /quote:
    get:
      tags:
      - Quotes
      summary: List quotes
      operationId: listQuotes
      parameters:
      - $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/changed'
      - name: sortBy
        in: query
        schema:
          type: string
          enum:
          - id
          - localId
          - subject
          - billDate
          - expiryDate
          - sysCreatedTime
          - sysModifiedTime
      - name: sortOrder
        in: query
        schema:
          type: string
          enum:
          - asc
          - desc
          default: desc
      responses:
        '200':
          description: List of quotes
          content:
            application/json:
              example:
                success: true
                data:
                - id: 7
                  localId: 7
                  subject: Q-01
                  moduleState: Draft
                  vendor:
                    id: 1
                  subTotal: 2500.0
                  totalCost: 2500.0
                  sysCreatedTime: '2026-03-10T06:27:28Z'
                pagination:
                  page: 1
                  pageSize: 50
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      tags:
      - Quotes
      summary: Create a quote
      operationId: createQuote
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - data
              properties:
                data:
                  $ref: '#/components/schemas/Quote'
            example:
              data:
                subject: Q-HVAC-Repair
                vendor:
                  id: 1
                billDate: '2026-04-01T00:00:00Z'
                expiryDate: '2026-04-30T00:00:00Z'
                lineItems:
                - type: Item Type
                  itemType:
                    id: 1
                  quantity: 10
                  unitPrice: 15.0
                  cost: 150.0
                - type: Service
                  service:
                    id: 1
                  quantity: 2
                  unitPrice: 100.0
                  cost: 200.0
      responses:
        '201':
          description: Quote created
          content:
            application/json:
              example:
                success: true
                data:
                  id: 8
                  localId: 8
                  subject: Q-HVAC-Repair
                message: Record created
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /quote/{id}:
    get:
      tags:
      - Quotes
      summary: Get a quote
      description: Returns a single quote with all fields and line items.
      operationId: getQuote
      parameters:
      - $ref: '#/components/parameters/recordId'
      - $ref: '#/components/parameters/select'
      - $ref: '#/components/parameters/expand'
      responses:
        '200':
          description: Quote details with line items
          content:
            application/json:
              example:
                success: true
                data:
                  id: 7
                  localId: 7
                  subject: Q-01
                  moduleState: Draft
                  vendor:
                    id: 1
                    name: Supplier 1
                  contact:
                    id: 4
                    name: ABC
                  billDate: '2026-03-25T04:00:00Z'
                  expiryDate: '2026-03-31T04:00:00Z'
                  subTotal: 350.0
                  totalCost: 350.0
                  totalTaxAmount: 0.0
                  revisionNumber: 1
                  sysCreatedBy:
                    id: 1
                    name: Alex Johnson
                    email: alex@example.com
                  sysCreatedTime: '2026-03-10T06:27:28Z'
                  sysModifiedTime: '2026-03-10T06:27:28Z'
                  lineItems:
                  - id: 1
                    type: Item Type
                    itemType:
                      id: 1
                    quantity: 10.0
                    unitPrice: 15.0
                    cost: 150.0
                    taxAmount: 0.0
                  - id: 2
                    type: Service
                    service:
                      id: 1
                    quantity: 2.0
                    unitPrice: 100.0
                    cost: 200.0
                    taxAmount: 0.0
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    patch:
      tags:
      - Quotes
      summary: Update a quote
      description: 'Updates a quote. When `lineItems` is included, it represents the full desired state.

        Existing line items not in the array are deleted. Include `id` to update an existing line item.'
      operationId: updateQuote
      parameters:
      - $ref: '#/components/parameters/recordId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - data
              properties:
                data:
                  $ref: '#/components/schemas/Quote'
            examples:
              updateFields:
                summary: Update quote fields only
                value:
                  data:
                    description: Updated HVAC repair quote
              replaceLineItems:
                summary: Replace line items (full state)
                value:
                  data:
                    lineItems:
                    - id: 1
                      quantity: 20
                      unitPrice: 15.0
                      cost: 300.0
                    - type: Tool Type
                      toolType:
                        id: 1
                      quantity: 1
                      unitPrice: 120.0
                      cost: 120.0
      responses:
        '200':
          description: Quote updated
          content:
            application/json:
              example:
                success: true
                data:
                  id: 7
                  localId: 7
                  subject: Q-01
                message: Record updated
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      tags:
      - Quotes
      summary: Delete a quote
      operationId: deleteQuote
      parameters:
      - $ref: '#/components/parameters/recordId'
      responses:
        '200':
          description: Deleted
          content:
            application/json:
              example:
                success: true
                message: Record deleted
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /quote/metadata:
    get:
      tags:
      - Quotes
      summary: Get quote field schema
      description: Returns the field schema for the quote module, including all declared system fields and any org-specific custom fields with their data type, required/readOnly flags, and lookup targets.
      operationId: getQuoteMetadata
      parameters:
      - $ref: '#/components/parameters/includeAllowedValues'
      responses:
        '200':
          description: Field schema retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModuleMetaResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  schemas:
    Quote:
      type: object
      description: Quote with line items.
      properties:
        id:
          type: integer
          readOnly: true
          description: Unique record ID
        localId:
          type: integer
          readOnly: true
          description: Sequential quote number (sortable)
        subject:
          type: string
          maxLength: 255
          description: Quote subject (sortable)
        description:
          type: string
          maxLength: 2000
          description: Quote description
        moduleState:
          type: string
          description: Status — pass `status` value (e.g. 'Draft', 'Sent') or numeric ID. Use `GET /picklist/quote/moduleState` for valid values.
        customerType:
          type: string
          enum:
          - Vendor
          - Client
          - Tenant
          description: Customer type
        vendor:
          type: integer
          description: Vendor ID
        client:
          type: integer
          description: Client ID
        tenant:
          type: integer
          description: Tenant ID
        contact:
          type: integer
          description: Contact ID
        billToAddress:
          description: Billing address
          allOf:
          - $ref: '#/components/schemas/Address'
        shipToAddress:
          description: Shipping address
          allOf:
          - $ref: '#/components/schemas/Address'
        billDate:
          type: string
          format: date-time
          description: Bill date (sortable)
        expiryDate:
          type: string
          format: date-time
          description: Expiry date (sortable)
        siteId:
          type: integer
          description: Site ID
        subTotal:
          type: number
          format: double
          readOnly: true
          description: Subtotal before tax
        totalCost:
          type: number
          format: double
          readOnly: true
          description: Total cost including tax
        totalTaxAmount:
          type: number
          format: double
          readOnly: true
          description: Total tax amount
        revisionNumber:
          type: integer
          readOnly: true
          description: Revision number
        workorder:
          type: integer
          description: Related work order ID
        notes:
          type: string
          maxLength: 2000
          description: Additional notes
        lineItems:
          type: array
          description: 'Line items. `type` values: Item Type, Tool Type, Service, Labour, Others.'
          items:
            $ref: '#/components/schemas/QuoteLineItem'
        sysCreatedBy:
          readOnly: true
          allOf:
          - $ref: '#/components/schemas/User'
        sysCreatedTime:
          type: string
          format: date-time
          readOnly: true
          description: Created (sortable)
        sysModifiedBy:
          readOnly: true
          allOf:
          - $ref: '#/components/schemas/User'
        sysModifiedTime:
          type: string
          format: date-time
          readOnly: true
          description: Modified (sortable)
    Address:
      type: object
      description: Postal address. Used for site/building locations, storeroom locations, vendor/client/tenant addresses, and quote/invoice billing & shipping addresses.
      properties:
        id:
          type: integer
          readOnly: true
          description: Address record ID
        name:
          type: string
          maxLength: 255
          description: Location name
        street:
          type: string
          maxLength: 255
          description: Street address
        city:
          type: string
          maxLength: 100
          description: City
        state:
          type: string
          maxLength: 100
          description: State or province
        zip:
          type: string
          maxLength: 20
          description: Postal / ZIP code
        country:
          type: string
          maxLength: 100
          description: Country code (e.g. IN, US)
        lat:
          type: number
          format: double
          description: Latitude
        lng:
          type: number
          format: double
          description: Longitude
    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'
    User:
      type: object
      description: 'Expanded object for lookups to the `users` module.

        On list API, user lookups return `{id}` only unless `?expand=` includes that field.

        When expanded (single-record GET, create/update responses, or list with `expand`): fixed set `id`, `name`, `email`, `phone` (see **Lookup fields in responses**).

        '
      properties:
        id:
          type: integer
          format: int64
          description: User ID
        name:
          type: string
          description: User's full name
        email:
          type: string
          description: User's email address
        phone:
          type: string
          description: Phone number when present
    QuoteLineItem:
      type: object
      description: Quote line item.
      properties:
        id:
          type: integer
          readOnly: true
          description: Line item ID. Include on PATCH to update; omit to create new.
        type:
          type: string
          enum:
          - Item Type
          - Tool Type
          - Service
          - Labour
          - Others
          description: Line item type
        description:
          type: string
          maxLength: 2000
          description: Line item description
        quantity:
          type: number
          format: double
          description: Quantity
        unitPrice:
          type: number
          format: double
          description: Unit price
        cost:
          type: number
          format: double
          description: Total cost (quantity x unitPrice)
        taxAmount:
          type: number
          format: double
          description: Tax amount
        unitOfMeasure:
          type: string
          maxLength: 255
          description: Unit of measure
        itemType:
          type: object
          description: '{id} — required when type is Item Type'
        toolType:
          type: object
          description: '{id} — required when type is Tool Type'
        service:
          type: object
          description: '{id} — required when type is Service'
        labour:
          type: object
          description: '{id} — required when type is Labour'
        tax:
          type: object
          description: '{id} — tax group reference'
    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
    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'
    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
  parameters:
    search:
      name: search
      in: query
      description: Free-text search on the primary field (subject, name, etc.)
      schema:
        type: string
    select:
      name: select
      in: query
      description: Comma-separated field names to include in the response
      schema:
        type: string
    page:
      name: page
      in: query
      description: Page number (1-based)
      schema:
        type: integer
        default: 1
    pageSize:
      name: pageSize
      in: query
      description: Records per page (max 200)
      schema:
        type: integer
        default: 50
        maximum: 200
    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
    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
    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
    count:
      name: count
      in: query
      description: Include total record count in response
      schema:
        type: boolean
        default: false
  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: {}
x-provenance:
  method: harvested
  publisher: Facilio
  source: https://static.facilio.com/developers/api/v5/openapi.yaml
  note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
    stamped by stamp-openapi-provenance.py (roadmap#793)