Authentication
Send your key on every request as a header:assets:write) lets the key write by API exactly as a member
with that permission can in the app, provided the creator’s role grants it
too. See Roles and permissions for how
member permissions work, and Developer tools
for the scope picker.
Scopes
Each key is created with one or more scopes, chosen when the key is made. Each scope maps to one or more of the permissions used elsewhere in the app - use this table to work back from an endpoint’s Permission column to the scope that grants it:
No scope grants
asset_schema.manage (asset category writes) or
members.invite (inviting, updating or importing members) on its own -
only the admin scope does. The tables below mark every route that is
reachable only with admin.
Base URL and errors
Every endpoint below is prefixed with/api. Errors share one shape:
message is a list with one entry per
problem. Other errors, such as a duplicate value in a unique field, return
message as a single string.
401 means the key is missing, invalid, expired or revoked. 403 means
the key’s role does not carry the permission the endpoint requires. 429
means the request was rate limited.
Assets
Asset request bodies
The asset endpoints accept only a short list of top-level fields, and they refuse any other field with a400 (for example property serialNumber should not exist). Everything else about an asset, such as its serial
number, location, lifecycle stage or any custom field, goes inside a
customFieldValues object.
The keys inside
customFieldValues are the field keys from your category
tree. Read GET /asset-categories to see the fields each category has.
Built-in keys include serialNumber, locationId, ownerId,
departmentId and lifecycleStage. Relation fields take the id of the
record they point to, for example the id of a location for locationId. A
select field such as lifecycleStage takes one of its listed options. For a
new organisation these are Deployment, In Use, In Repair,
Decommission and Disposed. A key the category does not have is dropped
without an error, so check the spelling against GET /asset-categories. A
field marked required on the category must be sent on create.
Create an asset
201 and the full asset record, including its
generated id. Serial number is a unique field, so a second asset with the
same serial number is refused with a 400.
Update an asset
customFieldValues keep their current values. Use the same top-level
fields as a create.
Create several identical assets
bulkQuantity (from 2 to 500), and
creates that many copies, named Conference room chair #1, #2 and so
on. It does not take a list of different assets. A field that must be
unique, such as serialNumber, cannot be set this way. The response
reports created, ids and createdIds.
You can also send an optional ids array of UUIDs, with exactly
bulkQuantity entries and no repeats, to choose the new assets’ ids. An id
that already exists is skipped, so repeating a request that partly failed
creates only the missing copies.
Update several assets at once
patch object applies the same change to every asset in ids. It
accepts name, category or categoryId, vendorContractIds and
customFieldValues.
Asset categories
No non-admin scope grants
asset_schema.manage - creating, editing or
deleting a category by API requires a key scoped admin.
Locations
Locations follow a four-tier hierarchy (site, facility, level, space).
See Locations and mapping for the full
model.
Departments
Members
No non-admin scope grants
members.invite - every members write above
requires a key scoped admin, even though members:read alone is enough
to list members.
Map and geo
AI assistant
A key with the
ai:use scope drives the same assistant the in-app chat
uses, bound by that key’s own permissions and field access - so an
ai:use-only key can converse but cannot act on anything unless the key
also carries the resource scopes (assets:write, and so on) for what you
want it to do. See AI assistant.
Policies and violations
Violations are not resolved or acknowledged by API. They clear on their own
when the underlying data is fixed and the policy is re-evaluated. See
Policies.
Audit log
No non-admin scope grants
audit.rollback, so rolling back by API requires
a key scoped admin.
Integrations
The organisation id in the path must be the organisation the key belongs to, otherwise the request is refused with403.
Reading an integration never returns its credentials. Tokens, passwords,
API keys and client secrets come back as
••••••••, while connection
details such as the base URL and username are shown as saved. When you
update an integration, a credential you leave out or send back as
•••••••• keeps the saved value, a new value replaces it, and null
clears it.
Asset import
The CSV import endpoints under/imports (for example
/imports/csv/analyze and /imports/csv/execute) require
assets.import, granted by the assets:import scope. See
Importing data for what the import does.
Data export (OData)
A read-only OData v4 feed for BI tools, gated byassets.export
(scope odata:read - the same scope that covers the CSV/JSON export
endpoints above). See Developer tools for
the Power BI/Excel connection walkthrough.
There is no write path on this feed. The feed is on by default for every
organisation; turning it off in Integrations → Power BI answers every
query with
409 Conflict rather than 401/403, so a BI client doesn’t
misread a disabled feed as bad credentials.
Webhooks
A key can configure webhooks as well as receive them. The path carries an organisation id, but the key’s own organisation is always used.
The
webhooks:manage scope grants only integrations.manage, not
integrations.view. A key that should also list webhooks or read their
delivery history needs integrations:read as well.
Once a webhook is registered, every delivery is signed:
asset.created, asset.updated and asset.deleted.
The secret is returned once, in the response to the request that registers
the webhook. Reading a webhook later, or listing webhooks, does not return
it, and it cannot be retrieved or rotated afterwards. If you lose it,
delete the webhook and register it again.
Not available by API key
These stay sign-in only, whatever permissions the key’s role carries:- The data export (OData) on/off toggle for the organisation
- Reports and report templates
- Roles
- Billing
- GDPR export and erasure
