Facilio Invoices API
Billing records with line items, typically created from quotes. Track costs, taxes, and approval status.
Billing records with line items, typically created from quotes. Track costs, taxes, and approval status.
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-invoices-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 Invoices 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: Invoices
description: Billing records with line items, typically created from quotes. Track costs, taxes, and approval status.
paths:
/invoice:
get:
tags:
- Invoices
summary: List invoices
operationId: listInvoices
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
- invoiceNumber
- billDate
- expiryDate
- sysCreatedTime
- sysModifiedTime
- name: sortOrder
in: query
schema:
type: string
enum:
- asc
- desc
default: desc
responses:
'200':
description: List of invoices
content:
application/json:
example:
success: true
data:
- id: 1
localId: 1
invoiceNumber: '1'
subject: Q-01
vendor:
id: 1
subTotal: 2.0
totalCost: 2.0
invoiceType: Vendor
invoiceStatus: Draft
sysCreatedTime: '2026-03-10T08:26:21Z'
pagination:
page: 1
pageSize: 50
'401':
$ref: '#/components/responses/Unauthorized'
post:
tags:
- Invoices
summary: Create an invoice
operationId: createInvoice
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- data
properties:
data:
$ref: '#/components/schemas/Invoice'
example:
data:
subject: INV-HVAC-Repair
vendor:
id: 1
quote:
id: 7
invoiceType: Vendor
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: Invoice created
content:
application/json:
example:
success: true
data:
id: 2
localId: 2
subject: INV-HVAC-Repair
message: Record created
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
/invoice/{id}:
get:
tags:
- Invoices
summary: Get an invoice
description: Returns a single invoice with all fields and line items.
operationId: getInvoice
parameters:
- $ref: '#/components/parameters/recordId'
- $ref: '#/components/parameters/select'
- $ref: '#/components/parameters/expand'
responses:
'200':
description: Invoice details with line items
content:
application/json:
example:
success: true
data:
id: 1
localId: 1
invoiceNumber: '1'
subject: Q-01
vendor:
id: 1
name: Supplier 1
quote:
id: 7
subject: Q-01
workorder:
id: 13
subject: WO-1
approvers:
- id: 1
name: Alex Johnson
email: alex@example.com
billDate: '2026-03-25'
expiryDate: '2026-03-31'
subTotal: 350.0
totalCost: 350.0
totalTaxAmount: 0.0
invoiceType: Vendor
invoiceStatus: Draft
revisionNumber: 0
invoiceVersion: 1.0
sysCreatedByPeople:
id: 1
name: Alex Johnson
email: alex@example.com
sysCreatedTime: '2026-03-10T08:26:21Z'
sysModifiedTime: '2026-03-10T08:26:21Z'
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:
- Invoices
summary: Update an invoice
description: 'Updates an invoice. 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: updateInvoice
parameters:
- $ref: '#/components/parameters/recordId'
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- data
properties:
data:
$ref: '#/components/schemas/Invoice'
example:
data:
description: Final invoice
lineItems:
- id: 1
quantity: 20
unitPrice: 15.0
cost: 300.0
- type: Others
description: Miscellaneous charges
quantity: 1
unitPrice: 50.0
cost: 50.0
responses:
'200':
description: Invoice updated
content:
application/json:
example:
success: true
data:
id: 1
localId: 1
subject: Q-01
message: Record updated
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
delete:
tags:
- Invoices
summary: Delete an invoice
operationId: deleteInvoice
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'
/invoice/metadata:
get:
tags:
- Invoices
summary: Get invoice field schema
description: Returns the field schema for the invoice module, including all declared system fields and any org-specific custom fields with their data type, required/readOnly flags, and lookup targets.
operationId: getInvoiceMetadata
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:
InvoiceLineItem:
type: object
description: Invoice 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'
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
Invoice:
type: object
description: Invoice with line items.
properties:
id:
type: integer
readOnly: true
description: Unique record ID
localId:
type: integer
readOnly: true
description: Sequential number (sortable)
invoiceNumber:
type: string
readOnly: true
description: Invoice number (sortable)
subject:
type: string
maxLength: 255
description: Invoice subject
description:
type: string
maxLength: 2000
description: Invoice description
notes:
type: string
maxLength: 2000
description: Additional notes
quote:
type: integer
description: Source quote ID
vendor:
type: integer
description: Vendor ID
client:
type: integer
description: Client ID
tenant:
type: integer
description: Tenant ID
workorder:
type: integer
description: Related work order ID
approvers:
type: array
items:
type: object
readOnly: true
description: Approver list
billToAddress:
description: Billing address
allOf:
- $ref: '#/components/schemas/Address'
shipToAddress:
description: Shipping address
allOf:
- $ref: '#/components/schemas/Address'
billDate:
type: string
format: date
description: Bill date (sortable)
expiryDate:
type: string
format: date
description: Expiry date (sortable)
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
invoiceType:
type: string
enum:
- Vendor
- Client
- Tenant
description: Invoice type
invoiceStatus:
type: string
description: Invoice status — pass display name (e.g. 'Draft', 'Invoice Delivered') or numeric ID. Use `GET /picklist/invoice/invoiceStatus` for valid values.
revisionNumber:
type: integer
readOnly: true
description: Revision number
invoiceVersion:
type: number
readOnly: true
description: Version number
lineItems:
type: array
description: 'Line items. `type` values: Item Type, Tool Type, Service, Labour, Others.'
items:
$ref: '#/components/schemas/InvoiceLineItem'
sysCreatedByPeople:
readOnly: true
allOf:
- $ref: '#/components/schemas/User'
sysCreatedTime:
type: string
format: date-time
readOnly: true
description: Created (sortable)
sysModifiedByPeople:
readOnly: true
allOf:
- $ref: '#/components/schemas/User'
sysModifiedTime:
type: string
format: date-time
readOnly: true
description: Modified (sortable)
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'
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
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
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:
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
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
count:
name: count
in: query
description: Include total record count in response
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
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
responses:
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
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'
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: {}