Something new is coming up soon from Kanishu — stay tuned.

Developers › API reference

ITAM

Base address https://itam.kanishu.com/api/v1 · Download the OpenAPI description (for Postman, code generators and the like).

Conventions shared by every endpoint — tokens, headers, lists, safe retries, versions, limits — are in the developer guide; error codes are on Error codes. Each endpoint below names the scope a token needs.

Jump to: API access · Assets · Configuration · Discovery · Licenses · People · Vendors

API access

POST /api/v1/api-access-requests

Create in api access requests

Request fields (JSON body)

allowed_ipsstring (up to 2000), can be null
api_client_idinteger, can be null
purpose requiredstring (up to 1000)
scopes requiredlist of string
validity_daysinteger: 30, 60, 90, can be null

201 — Created. The record is in `data`; its address in `Location`.

GET /api/v1/api-access-requests/pending

Pending (api access requests pending)

ParameterInTypeAbout
fieldsquerystringOnly these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back.

200 — OK.

POST /api/v1/api-access-requests/{apiAccessRequest}/approve

Approve (api access requests approve)

ParameterInTypeAbout
apiAccessRequest requiredpathinteger

200 — OK.

POST /api/v1/api-access-requests/{apiAccessRequest}/reject

Reject (api access requests reject)

ParameterInTypeAbout
apiAccessRequest requiredpathinteger

Request fields (JSON body)

reason requiredstring (up to 500)

200 — OK.

GET /api/v1/api-access-requests/{apiAccessRequest}/reveal

Reveal (api access requests reveal)

ParameterInTypeAbout
apiAccessRequest requiredpathinteger
fieldsquerystringOnly these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back.

200 — OK.

Reply fields (1)
tokenstringThe API token, shown this once. Store it in your secrets manager and send it as Authorization: Bearer <token>.

Need fewer? Add ?fields= with the names you want, e.g. ?fields=token.

Assets

GET /api/v1/assets

List assets · scope assets:read

ParameterInTypeAbout
pagequeryintegerPage number, from 1.
per_pagequeryintegerItems a page (default 25, at most 100).
qquerystringSearch text.
filter[category]querystringOnly records with this value; several values comma-separated mean "any of".
filter[status]querystringOnly records with this value; several values comma-separated mean "any of".
filter[department]querystringOnly records with this value; several values comma-separated mean "any of".
filter[vendor]querystringOnly records with this value; several values comma-separated mean "any of".
filter[external_vendor_id]querystringOnly records with this value; several values comma-separated mean "any of".
fieldsquerystringOnly these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back.
includequerystringRelated records in the same answer, comma-separated: `licenses` — The software licences allocated to the asset, as GET /licenses returns them (needs `licenses:read`).

200 — A page of results.

Reply fields (32) — each record in data

Also in the answer: meta, links.

idinteger
asset_tagstringYour organisation's tag for the asset (unique).
namestring
categorystringAsset category (e.g. Laptop, Server).
sub_categorystring, can be nullFiner category within it.
statusstringin_stock, assigned, in_repair, retired or disposed.
assigned_toobject, can be nullThe person the asset is assigned to (id, name, email), or null.
assigned_to.idstring (uuid)
assigned_to.namestring
assigned_to.emailstring
departmentstring
locationstring
warranty_end_datestring (date)
purchase_coststringPurchase price in the asset's currency.
currencystring
created_atstring (date and time, ISO 8601)
updated_atstring (date and time, ISO 8601)
processorstring, can be null
ramstring, can be nullMemory, as recorded (e.g. 16 GB).
storagestring, can be nullDisk storage, as recorded (e.g. 512 GB SSD).
operating_systemstring, can be null
os_versionstring, can be null
purchase_datestring (date)
manufacturerstring
model_numberstring
warranty_statusstringactive or expired, from warranty_end_date; null when no warranty date is recorded.
amc_statusstring, can be nullactive or expired, from the maintenance contract (AMC) end date; null when none.
service_record_summaryobjectRepairs and services recorded for the asset: count and the most recent service date.
service_record_summary.countinteger
service_record_summary.most_recent_service_datestring (date), can be null
license_countintegerHow many software licences are allocated to the asset (?include=licenses lists them).
licenseslistOnly with ?include=licenses. The software licences allocated to the asset, as GET /licenses returns them.

Need fewer? Add ?fields= with the names you want, e.g. ?fields=asset_tag,name.

POST /api/v1/assets

Create in assets · scope assets:write

Request fields (JSON body)

amc_costnumber, can be null
amc_end_datestring (date), can be null
amc_providerstring (up to 255), can be nullWho provides the annual maintenance contract (AMC).
amc_start_datestring (date), can be null
asset_tag requiredstring (up to 100)Your organisation's tag for the asset (unique).
category_id requiredinteger
currencystring, can be null
current_book_valuenumber, can be nullValue after depreciation (audit feed).
custom_fields_jsonstring, can be nullYour organisation's own extra fields, by field name.
department_idinteger, can be null
depreciation_methodstring (up to 100), can be nullHow the book value is worked out over the asset's life.
expected_useful_life_yearsinteger, can be nullYears over which the asset is depreciated.
funding_sourcestring (up to 255), can be nullWhich budget paid for it (e.g. capex, a project).
fx_rate_overridenumber, can be nullAn exchange rate to use instead of the day's reference rate (1 unit of currency in home currency).
hostnamestring (up to 255), can be null
ip_addressstring (up to 100), can be null
location_idinteger, can be null
mac_addressstring (up to 100), can be null
manufacturerstring (up to 255), can be null
model_numberstring (up to 255), can be null
name requiredstring (up to 255)
operating_systemstring (up to 100), can be null
os_versionstring (up to 100), can be null
payment_termsstring (up to 255), can be null
processorstring (up to 255), can be null
purchase_costnumber, can be nullPurchase price in the asset's currency.
purchase_datestring (date), can be null
purchase_order_numberstring (up to 100), can be null
ramstring (up to 100), can be nullMemory, as recorded (e.g. 16 GB).
screen_sizestring (up to 50), can be null
serial_numberstring (up to 255), can be null
storagestring (up to 100), can be nullDisk storage, as recorded (e.g. 512 GB SSD).
sub_categorystring (up to 100), can be nullFiner category within it.
vendor_idinteger, can be nullThe supplier, from Vendor management (if you use it); vendor_name otherwise.
vendor_namestring (up to 255), can be null
warranty_end_datestring (date), can be null
warranty_start_datestring (date), can be null

201 — Created. The record is in `data`; its address in `Location`.

Reply fields (31) — in data
idinteger
asset_tagstringYour organisation's tag for the asset (unique).
namestring
categorystringAsset category (e.g. Laptop, Server).
sub_categorystring, can be nullFiner category within it.
statusstringin_stock, assigned, in_repair, retired or disposed.
assigned_toobject, can be nullThe person the asset is assigned to (id, name, email), or null.
assigned_to.idstring (uuid)
assigned_to.namestring
assigned_to.emailstring
departmentstring
locationstring
warranty_end_datestring (date)
purchase_coststringPurchase price in the asset's currency.
currencystring
created_atstring (date and time, ISO 8601)
updated_atstring (date and time, ISO 8601)
processorstring, can be null
ramstring, can be nullMemory, as recorded (e.g. 16 GB).
storagestring, can be nullDisk storage, as recorded (e.g. 512 GB SSD).
operating_systemstring, can be null
os_versionstring, can be null
purchase_datestring (date)
manufacturerstring
model_numberstring
warranty_statusstringactive or expired, from warranty_end_date; null when no warranty date is recorded.
amc_statusstring, can be nullactive or expired, from the maintenance contract (AMC) end date; null when none.
service_record_summaryobjectRepairs and services recorded for the asset: count and the most recent service date.
service_record_summary.countinteger
service_record_summary.most_recent_service_datestring (date), can be null
license_countintegerHow many software licences are allocated to the asset (?include=licenses lists them).

GET /api/v1/assets/audit-feed

Audit Feed (assets audit feed) · scope assets:audit-read

ParameterInTypeAbout
page_sizequeryintegerAnswer in pages of this many records (10–2000). Without it, everything comes back at once.
afterqueryintegerThe `meta.next_after` from the previous page (start with 0).
fieldsquerystringOnly these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back.

200 — Records in id order. With page_size, `meta.next_after` is the `after` for the next page (null on the last).

Reply fields (20) — each record in data

Also in the answer: meta.

idinteger
asset_tagstringYour organisation's tag for the asset (unique).
namestring
categorystringAsset category (e.g. Laptop, Server).
statusstringin_stock, assigned, in_repair, retired or disposed.
current_book_valuestring, can be nullValue after depreciation (audit feed).
expected_useful_life_yearsinteger, can be nullYears over which the asset is depreciated.
purchase_datestring (date), can be null
disposal_datestring (date), can be null
data_wipe_confirmedbooleantrue when wiping the data was confirmed before disposal.
destruction_certificate_referencestring, can be nullReference of the certificate of destruction, for disposed assets.
serial_numberstring, can be null
hostnamestring, can be null
purchase_coststring, can be nullPurchase price in the asset's currency.
last_seen_atstring (date and time, ISO 8601), can be nullWhen network discovery last saw the device.
last_audit_scan_atstring (date and time, ISO 8601), can be nullWhen the asset was last scanned in a physical audit.
assignment_datestring (date), can be null
assignee_namestring, can be null
assignee_emailstring, can be null
assignee_person_uuidstring (uuid), can be nullThe assigned person's People id.

Need fewer? Add ?fields= with the names you want, e.g. ?fields=asset_tag,name.

GET /api/v1/assets/{asset}

Get one of assets · scope assets:read

ParameterInTypeAbout
asset requiredpathinteger
fieldsquerystringOnly these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back.
includequerystringRelated records in the same answer, comma-separated: `licenses` — The software licences allocated to the asset, as GET /licenses returns them (needs `licenses:read`).

200 — OK. The record is in `data`, with its version in the `ETag` header.

Reply fields (32) — in data
idinteger
asset_tagstringYour organisation's tag for the asset (unique).
namestring
categorystringAsset category (e.g. Laptop, Server).
sub_categorystring, can be nullFiner category within it.
statusstringin_stock, assigned, in_repair, retired or disposed.
assigned_toobject, can be nullThe person the asset is assigned to (id, name, email), or null.
assigned_to.idstring (uuid)
assigned_to.namestring
assigned_to.emailstring
departmentstring
locationstring
warranty_end_datestring (date)
purchase_coststringPurchase price in the asset's currency.
currencystring
created_atstring (date and time, ISO 8601)
updated_atstring (date and time, ISO 8601)
processorstring, can be null
ramstring, can be nullMemory, as recorded (e.g. 16 GB).
storagestring, can be nullDisk storage, as recorded (e.g. 512 GB SSD).
operating_systemstring, can be null
os_versionstring, can be null
purchase_datestring (date)
manufacturerstring
model_numberstring
warranty_statusstringactive or expired, from warranty_end_date; null when no warranty date is recorded.
amc_statusstring, can be nullactive or expired, from the maintenance contract (AMC) end date; null when none.
service_record_summaryobjectRepairs and services recorded for the asset: count and the most recent service date.
service_record_summary.countinteger
service_record_summary.most_recent_service_datestring (date), can be null
license_countintegerHow many software licences are allocated to the asset (?include=licenses lists them).
licenseslistOnly with ?include=licenses. The software licences allocated to the asset, as GET /licenses returns them.

Need fewer? Add ?fields= with the names you want, e.g. ?fields=asset_tag,name.

PATCH /api/v1/assets/{asset}

Change one of assets · scope assets:write

ParameterInTypeAbout
asset requiredpathinteger

Request fields (JSON body) — send only the fields you change

amc_costnumber, can be null
amc_end_datestring (date), can be null
amc_providerstring (up to 255), can be nullWho provides the annual maintenance contract (AMC).
amc_start_datestring (date), can be null
category_idinteger
currencystring, can be null
current_book_valuenumber, can be nullValue after depreciation (audit feed).
custom_fields_jsonstring, can be nullYour organisation's own extra fields, by field name.
department_idinteger, can be null
deployment_notesstring (up to 1000), can be null
depreciation_methodstring (up to 100), can be nullHow the book value is worked out over the asset's life.
enrolled_in_mdm_atstring (date), can be nullWhen the device was enrolled in mobile device management.
expected_useful_life_yearsinteger, can be nullYears over which the asset is depreciated.
funding_sourcestring (up to 255), can be nullWhich budget paid for it (e.g. capex, a project).
fx_rate_overridenumber, can be nullAn exchange rate to use instead of the day's reference rate (1 unit of currency in home currency).
hostnamestring (up to 255), can be null
ip_addressstring (up to 100), can be null
location_idinteger, can be null
mac_addressstring (up to 100), can be null
manufacturerstring (up to 255), can be null
model_numberstring (up to 255), can be null
namestring (up to 255)
operating_systemstring (up to 100), can be null
os_imaged_atstring (date), can be nullWhen the operating system image was installed.
os_versionstring (up to 100), can be null
payment_termsstring (up to 255), can be null
processorstring (up to 255), can be null
purchase_costnumber, can be nullPurchase price in the asset's currency.
purchase_datestring (date), can be null
purchase_order_numberstring (up to 100), can be null
ramstring (up to 100), can be nullMemory, as recorded (e.g. 16 GB).
screen_sizestring (up to 50), can be null
security_agent_installed_atstring (date), can be nullWhen the security agent was installed.
serial_numberstring (up to 255), can be null
storagestring (up to 100), can be nullDisk storage, as recorded (e.g. 512 GB SSD).
sub_categorystring (up to 100), can be nullFiner category within it.
vendor_idinteger, can be nullThe supplier, from Vendor management (if you use it); vendor_name otherwise.
vendor_namestring (up to 255), can be null
warranty_end_datestring (date), can be null
warranty_start_datestring (date), can be null

200 — OK. The record is in `data`, with its version in the `ETag` header.

Reply fields (31) — in data
idinteger
asset_tagstringYour organisation's tag for the asset (unique).
namestring
categorystringAsset category (e.g. Laptop, Server).
sub_categorystring, can be nullFiner category within it.
statusstringin_stock, assigned, in_repair, retired or disposed.
assigned_toobject, can be nullThe person the asset is assigned to (id, name, email), or null.
assigned_to.idstring (uuid)
assigned_to.namestring
assigned_to.emailstring
departmentstring
locationstring
warranty_end_datestring (date)
purchase_coststringPurchase price in the asset's currency.
currencystring
created_atstring (date and time, ISO 8601)
updated_atstring (date and time, ISO 8601)
processorstring, can be null
ramstring, can be nullMemory, as recorded (e.g. 16 GB).
storagestring, can be nullDisk storage, as recorded (e.g. 512 GB SSD).
operating_systemstring, can be null
os_versionstring, can be null
purchase_datestring (date)
manufacturerstring
model_numberstring
warranty_statusstringactive or expired, from warranty_end_date; null when no warranty date is recorded.
amc_statusstring, can be nullactive or expired, from the maintenance contract (AMC) end date; null when none.
service_record_summaryobjectRepairs and services recorded for the asset: count and the most recent service date.
service_record_summary.countinteger
service_record_summary.most_recent_service_datestring (date), can be null
license_countintegerHow many software licences are allocated to the asset (?include=licenses lists them).

DELETE /api/v1/assets/{asset}

Delete one of assets · scope assets:write

ParameterInTypeAbout
asset requiredpathinteger

204 — Deleted.

POST /api/v1/assets/{asset}/reclaim

Reclaim (assets reclaim) · scope assets:write

ParameterInTypeAbout
asset requiredpathinteger

200 — OK. The record is in `data`, with its version in the `ETag` header.

Reply fields (31) — in data
idinteger
asset_tagstringYour organisation's tag for the asset (unique).
namestring
categorystringAsset category (e.g. Laptop, Server).
sub_categorystring, can be nullFiner category within it.
statusstringin_stock, assigned, in_repair, retired or disposed.
assigned_toobject, can be nullThe person the asset is assigned to (id, name, email), or null.
assigned_to.idstring (uuid)
assigned_to.namestring
assigned_to.emailstring
departmentstring
locationstring
warranty_end_datestring (date)
purchase_coststringPurchase price in the asset's currency.
currencystring
created_atstring (date and time, ISO 8601)
updated_atstring (date and time, ISO 8601)
processorstring, can be null
ramstring, can be nullMemory, as recorded (e.g. 16 GB).
storagestring, can be nullDisk storage, as recorded (e.g. 512 GB SSD).
operating_systemstring, can be null
os_versionstring, can be null
purchase_datestring (date)
manufacturerstring
model_numberstring
warranty_statusstringactive or expired, from warranty_end_date; null when no warranty date is recorded.
amc_statusstring, can be nullactive or expired, from the maintenance contract (AMC) end date; null when none.
service_record_summaryobjectRepairs and services recorded for the asset: count and the most recent service date.
service_record_summary.countinteger
service_record_summary.most_recent_service_datestring (date), can be null
license_countintegerHow many software licences are allocated to the asset (?include=licenses lists them).

GET /api/v1/assets/{asset}/same-model

Same Model (assets same model) · scope assets:read

ParameterInTypeAbout
asset requiredpathinteger
fieldsquerystringOnly these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back.

200 — OK. The record is in `data`, with its version in the `ETag` header.

Reply fields (3) — in data
manufacturerstring
model_numberstring
asset_idslist of integerIds of assets of the same make and model.

Need fewer? Add ?fields= with the names you want, e.g. ?fields=manufacturer,model_number.

Configuration

GET /api/v1/configuration-items

List configuration items · scope cis:read

ParameterInTypeAbout
pagequeryintegerPage number, from 1.
per_pagequeryintegerItems a page (default 25, at most 100).
qquerystringSearch text.
filter[asset_id]querystringOnly records with this value; several values comma-separated mean "any of".
filter[ids]querystringOnly records with this value; several values comma-separated mean "any of".
filter[ci_class]querystringOnly records with this value; several values comma-separated mean "any of".
filter[environment]querystringOnly records with this value; several values comma-separated mean "any of".
filter[criticality]querystringOnly records with this value; several values comma-separated mean "any of".
sortquerystringComma-separated; prefix - for descending. Allowed: name, created_at, updated_at. Default: name.
fieldsquerystringOnly these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back.

200 — A page of results.

Reply fields (26) — each record in data

Also in the answer: meta, links.

idinteger
namestring
classstringWhat kind of item: application, server, database, network, endpoint, cloud_resource, storage_backup, identity_certificate, external_service, software_license or other.
lifecycle_statestringplanned, in_build, live, retiring or retired.
operational_statusstringoperational, degraded, down, maintenance or unknown.
environmentstring, can be nullproduction, test, development or disaster_recovery.
criticalitystring, can be nullBusiness criticality: critical, high, medium or low.
assetobject, can be nullThe asset behind the item, if any.
asset.idinteger
asset.asset_tagstring
asset.namestring
asset.categorystring
license_idinteger, can be nullThe licence behind the item, if it is a software licence.
relationshipslistHow the item connects to others (depends on, runs on, …).
relationships[].typestring
relationships[].labelstringThe relationship in words, as read in that direction.
relationships[].directionstringoutgoing (this item → target) or incoming (target → this item).
relationships[].target_ci_idintegerThe other item's id.
relationships[].targetobject
relationships[].target.idinteger, can be null
relationships[].target.namestring
relationships[].target.asset_tagstring, can be null
serviceslistThe business services that rely on the item.
services[].idinteger
services[].namestring
services[].criticalitystring

Need fewer? Add ?fields= with the names you want, e.g. ?fields=name,class.

GET /api/v1/configuration-items/{configurationItem}

Get one of configuration items · scope cis:read

ParameterInTypeAbout
configurationItem requiredpathinteger
fieldsquerystringOnly these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back.

200 — OK. The record is in `data`, with its version in the `ETag` header.

Reply fields (23) — in data
idinteger
namestring
classstringWhat kind of item: application, server, database, network, endpoint, cloud_resource, storage_backup, identity_certificate, external_service, software_license or other.
lifecycle_statestringplanned, in_build, live, retiring or retired.
operational_statusstringoperational, degraded, down, maintenance or unknown.
environmentstring, can be nullproduction, test, development or disaster_recovery.
criticalitystring, can be nullBusiness criticality: critical, high, medium or low.
assetobject, can be nullThe asset behind the item, if any.
asset.idinteger
asset.asset_tagstring
asset.namestring
asset.categorystring
license_idinteger, can be nullThe licence behind the item, if it is a software licence.
relationshipslistHow the item connects to others (depends on, runs on, …).
relationships[].typestring
relationships[].labelstringThe relationship in words, as read in that direction.
relationships[].directionstringoutgoing (this item → target) or incoming (target → this item).
relationships[].target_ci_idintegerThe other item's id.
relationships[].targetobject
relationships[].target.idinteger, can be null
relationships[].target.namestring
relationships[].target.asset_tagstring, can be null
serviceslistThe business services that rely on the item.

Need fewer? Add ?fields= with the names you want, e.g. ?fields=name,class.

Discovery

GET /api/v1/discovery/config

Config (discovery config) · scope discovery:report

ParameterInTypeAbout
fieldsquerystringOnly these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back.

200 — OK. The record is in `data`, with its version in the `ETag` header.

Reply fields (11) — in data
namestringThe collector's name.
subnetslist of stringNetwork ranges the collector should scan.
scan_frequency_hoursintegerHow often to scan.
credentialsstringAlways stored_on_collector: scan credentials stay on your collector and are never sent to Kanishu.
settingsobjectScan limits and timeouts the collector should use (addresses, ports, timeouts, batch size).
settings.max_addressesinteger
settings.tcp_portslist
settings.ping_timeout_msinteger
settings.snmp_timeout_msinteger
settings.cim_timeout_secinteger
settings.batch_sizeinteger

Need fewer? Add ?fields= with the names you want, e.g. ?fields=name,subnets.

POST /api/v1/discovery/scans

Submit Scan (discovery scans) · scope discovery:report

Request fields (JSON body)

deviceslist
devices[].bios_uuidstring (up to 64), can be null
devices[].discovery_methodslist, can be nullHow the device was found (e.g. ping, snmp, wmi).
devices[].hostnamestring (up to 255), can be null
devices[].ip_addressstring (up to 45), can be null
devices[].mac_addressstring (up to 64), can be null
devices[].probe_statuslist, can be nullHow far the probe got for this device.
devices[].serial_numberstring (up to 255), can be null
devices[].snmp_datalist, can be null
devices[].vendorstring (up to 255), can be null
devices[].wmi_datalist, can be null
scanobject, can be null
scan.batchinteger
scan.finalbooleantrue on the last batch of a scan.
scan.idstring (up to 64)
scan.started_atstring (date), can be null
scan.summaryobject, can be null
scan.summary.addresses_aliveinteger, can be null
scan.summary.addresses_scannedinteger, can be null
scan.summary.errorslist, can be null
scan.versionstring (up to 20), can be null

200 — OK.

Licenses

GET /api/v1/licenses

List licenses · scope licenses:read

ParameterInTypeAbout
pagequeryintegerPage number, from 1.
per_pagequeryintegerItems a page (default 25, at most 100).
qquerystringSearch text.
filter[vendor]querystringOnly records with this value; several values comma-separated mean "any of".
filter[license_type]querystringOnly records with this value; several values comma-separated mean "any of".
fieldsquerystringOnly these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back.
includequerystringRelated records in the same answer, comma-separated: `assets` — The assets the licence is allocated to, as GET /assets returns them (needs `assets:read`).

200 — A page of results.

Reply fields (12) — each record in data

Also in the answer: meta, links.

idinteger
namestring
vendorstringThe software publisher or reseller.
license_typestringperpetual, subscription_monthly, subscription_annual, per_seat, per_device, concurrent_user or site.
seats_purchasedintegerSeats bought.
seats_allocatedintegerSeats allocated to assets.
seats_availableintegerSeats still free (purchased minus allocated).
compliance_statusstringcompliant, over_allocated (more in use than bought) or under_utilized (many seats unused).
start_datestring (date)
expiry_datestring (date), can be null
created_atstring (date and time, ISO 8601)
assetslistOnly with ?include=assets. The assets the licence is allocated to, as GET /assets returns them.

Need fewer? Add ?fields= with the names you want, e.g. ?fields=name,vendor.

POST /api/v1/licenses

Create in licenses · scope licenses:write

Request fields (JSON body)

currencystring, can be null
department_idinteger, can be null
expiry_datestring (date), can be null
fx_rate_overridenumber, can be null
license_key_encryptedstring (up to 2000), can be nullThe licence key; stored encrypted and never shown in full again.
license_type requiredstring: perpetual, subscription_monthly, subscription_annual, per_seat, per_device, concurrent_user, siteperpetual, subscription_monthly, subscription_annual, per_seat, per_device, concurrent_user or site.
location_idinteger, can be null
name requiredstring (up to 255)
seats_purchased requiredintegerSeats bought.
start_date requiredstring (date)
support_contract_referencestring (up to 255), can be nullReference of the support or maintenance contract.
total_costnumber, can be null
unit_costnumber, can be null
vendor requiredstring (up to 255)The software publisher or reseller.
versionstring (up to 255), can be null

201 — Created. The record is in `data`; its address in `Location`.

Reply fields (11) — in data
idinteger
namestring
vendorstringThe software publisher or reseller.
license_typestringperpetual, subscription_monthly, subscription_annual, per_seat, per_device, concurrent_user or site.
seats_purchasedintegerSeats bought.
seats_allocatedintegerSeats allocated to assets.
seats_availableintegerSeats still free (purchased minus allocated).
compliance_statusstringcompliant, over_allocated (more in use than bought) or under_utilized (many seats unused).
start_datestring (date)
expiry_datestring (date)
created_atstring (date and time, ISO 8601)

GET /api/v1/licenses-compliance-report

Compliance Report (licenses compliance report) · scope reports:read

ParameterInTypeAbout
fieldsquerystringOnly these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back.

200 — OK.

Reply fields (2)
over_allocatedlistLicences with more seats in use than bought.
expiring_soonlistLicences whose expiry date is near.

Need fewer? Add ?fields= with the names you want, e.g. ?fields=over_allocated,expiring_soon.

GET /api/v1/licenses/{license}

Get one of licenses · scope licenses:read

ParameterInTypeAbout
license requiredpathinteger
fieldsquerystringOnly these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back.
includequerystringRelated records in the same answer, comma-separated: `assets` — The assets the licence is allocated to, as GET /assets returns them (needs `assets:read`).

200 — OK. The record is in `data`, with its version in the `ETag` header.

Reply fields (12) — in data
idinteger
namestring
vendorstringThe software publisher or reseller.
license_typestringperpetual, subscription_monthly, subscription_annual, per_seat, per_device, concurrent_user or site.
seats_purchasedintegerSeats bought.
seats_allocatedintegerSeats allocated to assets.
seats_availableintegerSeats still free (purchased minus allocated).
compliance_statusstringcompliant, over_allocated (more in use than bought) or under_utilized (many seats unused).
start_datestring (date)
expiry_datestring (date)
created_atstring (date and time, ISO 8601)
assetslistOnly with ?include=assets. The assets the licence is allocated to, as GET /assets returns them.

Need fewer? Add ?fields= with the names you want, e.g. ?fields=name,vendor.

POST /api/v1/licenses/{license}/allocations

Allocate Seat (licenses allocations) · scope licenses:write

ParameterInTypeAbout
license requiredpathinteger

Request fields (JSON body)

allow_over_allocationbooleantrue to allocate even when no seats are free (the licence then shows as over_allocated).
asset_id requiredintegerThe asset to allocate the seat to, or take it back from.

200 — OK. The record is in `data`, with its version in the `ETag` header.

Reply fields (11) — in data
idinteger
namestring
vendorstringThe software publisher or reseller.
license_typestringperpetual, subscription_monthly, subscription_annual, per_seat, per_device, concurrent_user or site.
seats_purchasedintegerSeats bought.
seats_allocatedintegerSeats allocated to assets.
seats_availableintegerSeats still free (purchased minus allocated).
compliance_statusstringcompliant, over_allocated (more in use than bought) or under_utilized (many seats unused).
start_datestring (date)
expiry_datestring (date)
created_atstring (date and time, ISO 8601)

POST /api/v1/licenses/{license}/reclaim-seat

Reclaim Seat (licenses reclaim seat) · scope licenses:write

ParameterInTypeAbout
license requiredpathinteger

Request fields (JSON body)

asset_id requiredintegerThe asset to allocate the seat to, or take it back from.

200 — OK. The record is in `data`, with its version in the `ETag` header.

Reply fields (11) — in data
idinteger
namestring
vendorstringThe software publisher or reseller.
license_typestringperpetual, subscription_monthly, subscription_annual, per_seat, per_device, concurrent_user or site.
seats_purchasedintegerSeats bought.
seats_allocatedintegerSeats allocated to assets.
seats_availableintegerSeats still free (purchased minus allocated).
compliance_statusstringcompliant, over_allocated (more in use than bought) or under_utilized (many seats unused).
start_datestring (date)
expiry_datestring (date)
created_atstring (date and time, ISO 8601)

People

GET /api/v1/people

List people · scope people:read

ParameterInTypeAbout
pagequeryintegerPage number, from 1.
per_pagequeryintegerItems a page (default 25, at most 100).
fieldsquerystringOnly these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back.

200 — A page of results.

Reply fields (24) — each record in data

Also in the answer: meta, links.

idstring (uuid)The person's id in People (a UUID). Use it with /people/{person}.
display_namestringThe name shown everywhere in Kanishu.
preferred_namestring, can be nullWhat they like to be called, if different.
work_emailstringTheir work email address; how they are matched to logins in the products.
employee_numberstring, can be nullYour own employee number for them (e.g. from payroll or HR).
typestringemployee, contractor, external (auditor, consultant…) or other.
statusstringpre_joining (joining soon), active, on_leave, leaving (last working day set) or left.
joining_datestring (date), can be nullTheir first working day.
last_working_datestring (date), can be nullTheir last working day, once they are leaving; their logins are switched off after it.
access_end_datestring (date), can be nullWhen their access to Kanishu products ends, if earlier or later than the last working day (e.g. contractors).
departmentobject, can be nullTheir department or team (id and name), from GET /people-organisation.
department.idstring (uuid)
department.namestring
positionobject, can be nullTheir job position (id and name).
position.idstring (uuid)
position.namestring
locationobject, can be nullTheir office or site (id and name).
location.idstring (uuid)
location.namestring
managerobject, can be nullTheir manager in People (id and display_name).
manager.idstring (uuid)
manager.display_namestring
created_atstring (date and time, ISO 8601)
updated_atstring (date and time, ISO 8601)

Need fewer? Add ?fields= with the names you want, e.g. ?fields=display_name,preferred_name.

POST /api/v1/people

Create in people · scope people:write

Request fields (JSON body)

access_end_datestring (date), can be nullWhen their access to Kanishu products ends, if earlier or later than the last working day (e.g. contractors).
display_name requiredstring (up to 255)The name shown everywhere in Kanishu.
employee_numberstring (up to 50), can be nullYour own employee number for them (e.g. from payroll or HR).
employment_statusstring: pre_joining, active, on_leave, leaving, leftpre_joining (joining soon), active, on_leave, leaving (last working day set) or left.
joining_datestring (date), can be nullTheir first working day.
location_idstring (uuid), can be null
manager_person_idstring (uuid), can be nullThe manager's People id.
org_unit_idstring (uuid), can be nullThe department or team id, from GET /people-organisation.
person_typestring: employee, contractor, external, otheremployee, contractor, external (auditor, consultant…) or other.
position_idstring (uuid), can be null
preferred_namestring (up to 255), can be nullWhat they like to be called, if different.
work_emailstring (email) (up to 255), can be nullTheir work email address; how they are matched to logins in the products.

201 — Created. The record is in `data`; its address in `Location`.

Reply fields (24) — in data
idstring (uuid)The person's id in People (a UUID). Use it with /people/{person}.
display_namestringThe name shown everywhere in Kanishu.
preferred_namestring, can be nullWhat they like to be called, if different.
work_emailstringTheir work email address; how they are matched to logins in the products.
employee_numberstring, can be nullYour own employee number for them (e.g. from payroll or HR).
typestringemployee, contractor, external (auditor, consultant…) or other.
statusstringpre_joining (joining soon), active, on_leave, leaving (last working day set) or left.
joining_datestring (date)Their first working day.
last_working_datestring (date), can be nullTheir last working day, once they are leaving; their logins are switched off after it.
access_end_datestring (date), can be nullWhen their access to Kanishu products ends, if earlier or later than the last working day (e.g. contractors).
departmentobjectTheir department or team (id and name), from GET /people-organisation.
department.idstring (uuid)
department.namestring
positionobjectTheir job position (id and name).
position.idstring (uuid)
position.namestring
locationobjectTheir office or site (id and name).
location.idstring (uuid)
location.namestring
managerobject, can be nullTheir manager in People (id and display_name).
manager.idstring (uuid)
manager.display_namestring
created_atstring (date and time, ISO 8601)
updated_atstring (date and time, ISO 8601)

GET /api/v1/people-organisation

Organisation (people organisation) · scope people:read

ParameterInTypeAbout
fieldsquerystringOnly these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back.

200 — OK. The record is in `data`, with its version in the `ETag` header.

Reply fields (18) — in data
departmentslist
departments[].idstring (uuid)
departments[].namestring
departments[].typestringWhat kind of unit it is (e.g. department, team, business unit).
departments[].codestring
departments[].part_of_idinteger or string, can be nullThe unit this one sits under, or null at the top.
departments[].in_usebooleanfalse when the unit is archived and no longer offered.
positionslist
positions[].idstring (uuid)
positions[].namestring
positions[].codestring, can be null
positions[].in_usebooleanfalse when the position is archived.
locationslist
locations[].idstring (uuid)
locations[].namestring
locations[].codestring, can be null
locations[].citystring, can be null
locations[].in_usebooleanfalse when the location is archived.

Need fewer? Add ?fields= with the names you want, e.g. ?fields=departments,positions.

GET /api/v1/people/assets

List people assets · scope assets:read

ParameterInTypeAbout
email requiredquerystring
fieldsquerystringOnly these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back.

200 — Every matching record in one answer.

POST /api/v1/people/joiners

Add a joiner (from their start date) · scope people:write

Request fields (JSON body)

accesslist of string, can be nullLogins they should get, as product key => role (e.g. {"itsm": "agent"}); each one waits for an approval.
access_end_datestring (date), can be nullWhen their access to Kanishu products ends, if earlier or later than the last working day (e.g. contractors).
display_name requiredstring (up to 255)The name shown everywhere in Kanishu.
employee_numberstring (up to 50), can be nullYour own employee number for them (e.g. from payroll or HR).
employment_statusstring: pre_joining, active, on_leave, leaving, leftpre_joining (joining soon), active, on_leave, leaving (last working day set) or left.
joining_datestring (date), can be nullTheir first working day.
location_idstring (uuid), can be null
manager_person_idstring (uuid), can be nullThe manager's People id.
org_unit_idstring (uuid), can be nullThe department or team id, from GET /people-organisation.
person_typestring: employee, contractor, external, otheremployee, contractor, external (auditor, consultant…) or other.
position_idstring (uuid), can be null
preferred_namestring (up to 255), can be nullWhat they like to be called, if different.
start_date requiredstring (date)Their first working day; their logins are prepared for it.
work_emailstring (email) (up to 255), can be nullTheir work email address; how they are matched to logins in the products.

201 — The new person, as GET /people/{person} returns them.

Reply fields (24) — in data
idstring (uuid)The person's id in People (a UUID). Use it with /people/{person}.
display_namestringThe name shown everywhere in Kanishu.
preferred_namestring, can be nullWhat they like to be called, if different.
work_emailstringTheir work email address; how they are matched to logins in the products.
employee_numberstring, can be nullYour own employee number for them (e.g. from payroll or HR).
typestringemployee, contractor, external (auditor, consultant…) or other.
statusstringpre_joining (joining soon), active, on_leave, leaving (last working day set) or left.
joining_datestring (date)Their first working day.
last_working_datestring (date), can be nullTheir last working day, once they are leaving; their logins are switched off after it.
access_end_datestring (date), can be nullWhen their access to Kanishu products ends, if earlier or later than the last working day (e.g. contractors).
departmentobjectTheir department or team (id and name), from GET /people-organisation.
department.idstring (uuid)
department.namestring
positionobjectTheir job position (id and name).
position.idstring (uuid)
position.namestring
locationobjectTheir office or site (id and name).
location.idstring (uuid)
location.namestring
managerobject, can be nullTheir manager in People (id and display_name).
manager.idstring (uuid)
manager.display_namestring
created_atstring (date and time, ISO 8601)
updated_atstring (date and time, ISO 8601)

POST /api/v1/people/reclaim

Reclaim (people reclaim) · scope assets:reclaim

Request fields (JSON body)

email requiredstring (email) (up to 255)
release_licensesboolean

200 — OK.

GET /api/v1/people/{person}

Get one of people · scope people:read

ParameterInTypeAbout
person requiredpathinteger
fieldsquerystringOnly these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back.

200 — OK. The record is in `data`, with its version in the `ETag` header.

Reply fields (24) — in data
idstring (uuid)The person's id in People (a UUID). Use it with /people/{person}.
display_namestringThe name shown everywhere in Kanishu.
preferred_namestring, can be nullWhat they like to be called, if different.
work_emailstringTheir work email address; how they are matched to logins in the products.
employee_numberstring, can be nullYour own employee number for them (e.g. from payroll or HR).
typestringemployee, contractor, external (auditor, consultant…) or other.
statusstringpre_joining (joining soon), active, on_leave, leaving (last working day set) or left.
joining_datestring (date)Their first working day.
last_working_datestring (date), can be nullTheir last working day, once they are leaving; their logins are switched off after it.
access_end_datestring (date), can be nullWhen their access to Kanishu products ends, if earlier or later than the last working day (e.g. contractors).
departmentobjectTheir department or team (id and name), from GET /people-organisation.
department.idstring (uuid)
department.namestring
positionobjectTheir job position (id and name).
position.idstring (uuid)
position.namestring
locationobjectTheir office or site (id and name).
location.idstring (uuid)
location.namestring
managerobject, can be nullTheir manager in People (id and display_name).
manager.idstring (uuid)
manager.display_namestring
created_atstring (date and time, ISO 8601)
updated_atstring (date and time, ISO 8601)

Need fewer? Add ?fields= with the names you want, e.g. ?fields=display_name,preferred_name.

PATCH /api/v1/people/{person}

Change one of people · scope people:write

ParameterInTypeAbout
person requiredpathinteger

Request fields (JSON body) — send only the fields you change

access_end_datestring (date), can be nullWhen their access to Kanishu products ends, if earlier or later than the last working day (e.g. contractors).
display_namestring (up to 255)The name shown everywhere in Kanishu.
employee_numberstring (up to 50), can be nullYour own employee number for them (e.g. from payroll or HR).
employment_statusstring: pre_joining, active, on_leave, leaving, leftpre_joining (joining soon), active, on_leave, leaving (last working day set) or left.
joining_datestring (date), can be nullTheir first working day.
location_idstring (uuid), can be null
manager_person_idstring (uuid), can be nullThe manager's People id.
org_unit_idstring (uuid), can be nullThe department or team id, from GET /people-organisation.
person_typestring: employee, contractor, external, otheremployee, contractor, external (auditor, consultant…) or other.
position_idstring (uuid), can be null
preferred_namestring (up to 255), can be nullWhat they like to be called, if different.
work_emailstring (email) (up to 255), can be nullTheir work email address; how they are matched to logins in the products.

200 — OK. The record is in `data`, with its version in the `ETag` header.

Reply fields (24) — in data
idstring (uuid)The person's id in People (a UUID). Use it with /people/{person}.
display_namestringThe name shown everywhere in Kanishu.
preferred_namestring, can be nullWhat they like to be called, if different.
work_emailstringTheir work email address; how they are matched to logins in the products.
employee_numberstring, can be nullYour own employee number for them (e.g. from payroll or HR).
typestringemployee, contractor, external (auditor, consultant…) or other.
statusstringpre_joining (joining soon), active, on_leave, leaving (last working day set) or left.
joining_datestring (date)Their first working day.
last_working_datestring (date), can be nullTheir last working day, once they are leaving; their logins are switched off after it.
access_end_datestring (date), can be nullWhen their access to Kanishu products ends, if earlier or later than the last working day (e.g. contractors).
departmentobjectTheir department or team (id and name), from GET /people-organisation.
department.idstring (uuid)
department.namestring
positionobjectTheir job position (id and name).
position.idstring (uuid)
position.namestring
locationobjectTheir office or site (id and name).
location.idstring (uuid)
location.namestring
managerobject, can be nullTheir manager in People (id and display_name).
manager.idstring (uuid)
manager.display_namestring
created_atstring (date and time, ISO 8601)
updated_atstring (date and time, ISO 8601)

POST /api/v1/people/{person}/leave

Record a leaver (logins switched off after the last working day, or now if urgent) · scope people:write

ParameterInTypeAbout
person requiredpathinteger

Request fields (JSON body)

last_working_date requiredstring (date)Their last working day, once they are leaving; their logins are switched off after it.
reasonstring (up to 500), can be nullWhy they are leaving (kept in People's History).
urgentbooleantrue to switch their logins off now instead of after the last working day.

200 — The person, as GET /people/{person} returns them.

Reply fields (24) — in data
idstring (uuid)The person's id in People (a UUID). Use it with /people/{person}.
display_namestringThe name shown everywhere in Kanishu.
preferred_namestring, can be nullWhat they like to be called, if different.
work_emailstringTheir work email address; how they are matched to logins in the products.
employee_numberstring, can be nullYour own employee number for them (e.g. from payroll or HR).
typestringemployee, contractor, external (auditor, consultant…) or other.
statusstringpre_joining (joining soon), active, on_leave, leaving (last working day set) or left.
joining_datestring (date)Their first working day.
last_working_datestring (date), can be nullTheir last working day, once they are leaving; their logins are switched off after it.
access_end_datestring (date), can be nullWhen their access to Kanishu products ends, if earlier or later than the last working day (e.g. contractors).
departmentobjectTheir department or team (id and name), from GET /people-organisation.
department.idstring (uuid)
department.namestring
positionobjectTheir job position (id and name).
position.idstring (uuid)
position.namestring
locationobjectTheir office or site (id and name).
location.idstring (uuid)
location.namestring
managerobject, can be nullTheir manager in People (id and display_name).
manager.idstring (uuid)
manager.display_namestring
created_atstring (date and time, ISO 8601)
updated_atstring (date and time, ISO 8601)

POST /api/v1/people/{person}/move

Move a person (department, manager, position or location) from a date · scope people:write

ParameterInTypeAbout
person requiredpathinteger

Request fields (JSON body)

department_idstring (uuid), can be nullThe department or team they move to, from GET /people-organisation.
effective_date requiredstring (date)The date the move takes effect.
location_idstring (uuid), can be null
manager_idstring (uuid), can be nullTheir new manager's People id.
position_idstring (uuid), can be null

200 — The person, as GET /people/{person} returns them.

Reply fields (24) — in data
idstring (uuid)The person's id in People (a UUID). Use it with /people/{person}.
display_namestringThe name shown everywhere in Kanishu.
preferred_namestring, can be nullWhat they like to be called, if different.
work_emailstringTheir work email address; how they are matched to logins in the products.
employee_numberstring, can be nullYour own employee number for them (e.g. from payroll or HR).
typestringemployee, contractor, external (auditor, consultant…) or other.
statusstringpre_joining (joining soon), active, on_leave, leaving (last working day set) or left.
joining_datestring (date)Their first working day.
last_working_datestring (date), can be nullTheir last working day, once they are leaving; their logins are switched off after it.
access_end_datestring (date), can be nullWhen their access to Kanishu products ends, if earlier or later than the last working day (e.g. contractors).
departmentobjectTheir department or team (id and name), from GET /people-organisation.
department.idstring (uuid)
department.namestring
positionobjectTheir job position (id and name).
position.idstring (uuid)
position.namestring
locationobjectTheir office or site (id and name).
location.idstring (uuid)
location.namestring
managerobject, can be nullTheir manager in People (id and display_name).
manager.idstring (uuid)
manager.display_namestring
created_atstring (date and time, ISO 8601)
updated_atstring (date and time, ISO 8601)

Vendors

POST /api/v1/vendors/directory-changed

Changed (vendors directory changed) · scope vendors:notify

200 — OK.