Oxelone Docs

Search docs and API

Find a guide, a section of one, or an API operation by its name.

Open console (opens in a new tab)

API reference Resources

Inventory

AI tools and artifacts found on the fleet.

11 operations

AI tool settings

GET/ai-tool-settings

This workspace's AI tool settings, or the defaults when it has never set any.

An empty corporate_domains is the default and is a working configuration, not an error state: with nothing configured, a built-in list of consumer providers applies.

Response200

The workspace's corporate email domains

corporate_domainsstring[]required

Lower-cased bare domains: northwind.com, never @northwind.com.

In the order they were entered. Empty is valid and is the default: with nothing configured, a built-in list of consumer providers applies.

Errors

401

No valid session

403

Caller lacks machines:read in this workspace

404

No such workspace, or the caller is not a member

Replace this workspace's corporate domain list

PUT/ai-tool-settings

Replace this workspace's corporate domain list.

The list you send replaces the whole list; there is no add or remove.

Every change is recorded in the audit log, with the list as stored, which is the list that will actually be used rather than the one that was sent.

Request bodyPutAiToolSettingsRequest

corporate_domainsstring[]required

Response200

The stored settings, after normalisation

corporate_domainsstring[]required

Lower-cased bare domains: northwind.com, never @northwind.com.

In the order they were entered. Empty is valid and is the default: with nothing configured, a built-in list of consumer providers applies.

Errors

400

Malformed body, or an entry that is not a bare domain — the message names it

401

No valid session

403

Caller lacks fleet:manage in this workspace

404

No such workspace, or the caller is not a member

Unlock a session lock

POST/ai-tools/locks/{lock_id}/unlock

The lock stays in place until the machine's next check-in carries the unlock. Calling this again gives the same answer. Recorded in the audit log.

Path parameters

lock_idstringrequired

Response200

lockSessionLockrequired

The lock, now unlock_pending.

idstringrequired
locked_atstringrequired
machine_idstringrequired
matchedstringrequired

What matched, in a few words.

messagestringrequired

The words the person sees on every refused call.

minted_bystringrequired

agent (a Hook policy) or server (a Session-log policy).

machinestringrequired

The machine the unlock reaches at its next check-in, by hostname.

Errors

403

Unlocking requires policies:write in this workspace

404

No live lock with this id in this workspace

One AI tool on one machine

GET/ai-tools/{artifact}

The tool's header, counts, coverage and the policies that govern it. artifact is the AI tool's artifact id; 404 when this workspace holds no such AI tool.

Path parameters

artifactstringrequired

Response200

artifactArtifactrequired

The single-record artifact view, tool_settings filled.

body_storedbooleanrequired

Whether the server holds the artifact's whole body, matched to the hash this row carries.

Use this, not preview_truncated, to tell whether the whole artifact was scanned: a long artifact can have a truncated preview and still a full scan.

categorystringrequired
content_classstringrequired
first_seen_atstringrequired
idstringrequired
issue_countintegerrequired

Unresolved issues about this artifact, and the worst of them.

0 with a null severity is a real answer: nothing has checked this artifact yet, which is not the same as it being clean.

checksToolCheck[]required

The provided AI-tool checks (AI tool safety, MCP server safety), each policy id with its key. An issue whose source_id is one of these policy ids is a setting issue from that check.

keystringrequired

approval_bypass, shell_auto_approved, …

policystringrequired
countsToolCountsrequired

Counts for the header, tabs and tiles. A count that could not be read is omitted, never `0`.

agents_and_commandsinteger · null
always_allowedinteger · null
marketplacesinteger · null
mcp_serversinteger · null
memory_filesinteger · null
open_issuesinteger · null
fix_capablebooleanrequired

Whether the agent can fix this tool's settings by writing its enforced settings file.

governed_byGovernedBy[]required
holdsbooleanrequired

The agent's last beat reported it holding for this tool.

modestringrequired

enforce or monitor.

namestringrequired
policystringrequired
lockablebooleanrequired

Whether this tool can be locked: its hooks can refuse.

machineToolMachinerequired
hostnamestringrequired
idstringrequired
statusstringrequired

active, suspended, archived, uninstalled or deleted.

agent_versionstring · null

The agent build the machine last reported; null when unknown.

last_seen_atstring · null

The machine's last check-in, RFC 3339; null when it has never checked in or the read failed. The Sessions tab's nothing received yet checklist names it.

rule_additionsRuleAddition[]required

At most 200, newest first.

first_seen_atstringrequired
keystringrequired

auto_approved, asked or denied.

projectstringrequired
rulestringrequired
session_idstring · null

The session it is attributed to, or null: Saved outside a known session.

sessions_readbooleanrequired

Whether the agent can read this tool's sessions. When false, there are no sessions to list.

coverageToolPageCoverage · null
fixesToolFix[]required
layersToolPageLayer[]required
recentToolRecent · null

The tool's last seven days of sessions. Absent when they could not be read, never reported as zeros.

daysToolDay[]required

Seven UTC days ending today, oldest first; a day with no session is 0.

projectsintegerrequired

Distinct named projects across those sessions.

promptsintegerrequired

Prompts across those sessions.

sessionsintegerrequired

The sum of days.

last_session_atstring · null

The newest last_at of any session ever received; null when none ever was.

tool_lockSessionLock · null

One live session lock, and the decision that locked it.

idstringrequired
locked_atstringrequired
machine_idstringrequired
matchedstringrequired

What matched, in a few words.

messagestringrequired

The words the person sees on every refused call.

minted_bystringrequired

agent (a Hook policy) or server (a Session-log policy).

Errors

404

No such AI tool in this workspace

List an AI tool's sessions

GET/ai-tools/{artifact}/sessions

One tool's sessions on one machine, newest first, paged by cursor.

Path parameters

artifactstringrequired

Query parameters

sincestring

1d, 7d or 30d (the default).

projectstring
modestring

An oversight word: the session ran in it at some point.

afterstring

The next of the previous page.

limitinteger

At most 50.

Response200

itemsToolSession[]required
interactionsSessionInteractionsrequired
last_atstringrequired
length_secondsintegerrequired
livebooleanrequired
promptsintegerrequired
saved_rulesSavedRule[]required
totalintegerrequired
nextstring · null

Errors

400

A malformed filter

404

No such AI tool in this workspace

One session of one tool

GET/ai-tools/{artifact}/sessions/{session_id}

Path parameters

artifactstringrequired
session_idstringrequired

Response200

interactionsSessionInteractionsrequired
blockedintegerrequired
countintegerrequired
last_atstringrequired
length_secondsintegerrequired
livebooleanrequired
mcp_serversstring[]required

Derived from mcp__<server>__<tool> names.

modesModeSpan[]required
atstringrequired
modestringrequired
more_toolsintegerrequired
promptsintegerrequired
saved_rulesSavedRule[]required
keystringrequired
rulestringrequired
riskstring · null
session_idstringrequired
started_atstringrequired
tool_callsToolCall[]required
nintegerrequired
namestringrequired
tool_calls_totalintegerrequired
transcriptstringrequired
first_promptFirstPrompt · null
interactionstringrequired
keptstringrequired

kept or not_kept.

textstring · null

What the Interactions list shows for that interaction: null when the logging mode removed it.

lockSessionLock · null

One live session lock, and the decision that locked it.

idstringrequired
locked_atstringrequired
machine_idstringrequired
matchedstringrequired

What matched, in a few words.

messagestringrequired

The words the person sees on every refused call.

minted_bystringrequired

agent (a Hook policy) or server (a Session-log policy).

modelstring · null
oversightstring · null

The session's last permission mode, as an oversight word.

projectstring · null
tool_versionstring · null
withheldboolean

The caller may not read interaction content, so no first prompt is shown.

Errors

404

No such session of this tool

The AI Artifacts index

GET/artifacts

Query parameters

fstring · null

The filter expression, e.g. all;category~in~agent_skill;severity~nin~low.

A malformed segment is dropped; a field this list does not have is a 400 naming it.

qstring · null

Free text over name and location. ANDs with the expression whichever way its conditions are joined.

cursorstring · null

Where the previous page stopped. Opaque; an unreadable one starts over.

limitinteger · null

Rows wanted, at most 200; a larger value returns 200.

groupstring · null

Fold the matched set instead of paging it.

catalogued_identity, catalogued, machine, owner or category. The rollup covers everything the filter matched, not the page — the deleted AI Components page answered how widely is this in use, and an answer folded from fifty rows would be an answer about fifty rows.

An unknown value is a 400 naming the five, for the reason an unknown filter field is: a silently ignored group returns a page of rows to a caller that asked for groups.

Response200

artifactsArtifact[]required
body_storedbooleanrequired

Whether the server holds the artifact's whole body, matched to the hash this row carries.

Use this, not preview_truncated, to tell whether the whole artifact was scanned: a long artifact can have a truncated preview and still a full scan.

categorystringrequired
content_classstringrequired
first_seen_atstringrequired
idstringrequired
issue_countintegerrequired

Unresolved issues about this artifact, and the worst of them.

0 with a null severity is a real answer: nothing has checked this artifact yet, which is not the same as it being clean.

totalintegerrequired

Everything the filter matched across every page, not just the artifacts on this page.

With group, the number of groups the match folds into, across every page — the count the grouped list is paged against.

groupsArtifactGroup[] · null

Present only when group was asked for, and then artifacts is empty. A page of groups (limit, default 50), continued with next_cursor.

One response type for both shapes, because they are one question asked at two resolutions and a second endpoint would be a second place to add a filter field. Worst first, then largest.

artifact_countintegerrequired
machine_countintegerrequired

Distinct machines. One component on five machines is the reach an operator is asking about.

partsstring[]required

One part per field in ?group=, in the order given, each null where the artifact has no value for that field.

headArtifactLink · null

One end of a parent/child link. The check summary (catalogued, advisory_severity, flags) is that of the artifact this entry names, read from its stored check.

keystring · null

The value grouped on — the first field's part. null is a real group: unowned, no machine, or nothing catalogued.

worst_issue_severitystring · null
next_cursorstring · null

Pass back as cursor for the next page. null means this was the last.

One artifact, for the drawer

GET/artifacts/{artifact}

Path parameters

artifactstringrequired

Response200

body_storedbooleanrequired

Whether the server holds the artifact's whole body, matched to the hash this row carries.

Use this, not preview_truncated, to tell whether the whole artifact was scanned: a long artifact can have a truncated preview and still a full scan.

categorystringrequired
content_classstringrequired
declared_inArtifactLink[]required

The parents that declare it: on its own machine first, then, for a package or an MCP server, on every machine holding the same one.

flagsstring[]required
idstringrequired
locationstringrequired
namestringrequired
typestringrequired
advisory_severitystring · null
declared_in_totalintegerrequired

How many things declare it in all; larger than the length of declared_in when that list stopped at its cap.

declaresArtifactLink[]required

What this artifact declares, by name, at most 200.

flagsstring[]required
idstringrequired
locationstringrequired
namestringrequired
typestringrequired
advisory_severitystring · null
declares_totalintegerrequired

How many things it declares in all; larger than the length of declares when that list stopped at its cap.

factsCatalogueFact[]required

Every effective fact about the component this resolved to, ordered by facet then attribute.

Empty is a real state and there are three of them: the artifact offers no key, the catalogue has never heard of it, or it knows the identity and has classified nothing. catalogued.resolution tells them apart.

attributestringrequired
facetstringrequired
observed_atstringrequired
sourcestringrequired

Which level of the chain spoke: global, curated, curated_over_feed, workspace_override or workspace_added.

All five, because collapsing any pair removes a distinction the operator needs: we decided this and somebody upstream did have different owners and different appeals.

stalebooleanrequired

Whether this fact's feed is older than its declared maximum age. Always false for anything resting on no feed — a curation has no clock to fall behind, and neither does a workspace's own decision.

valuestringrequired

A term, an identifier, or a JSON array for the three list-valued attributes.

first_seen_atstringrequired
idstringrequired
issue_countintegerrequired

Unresolved issues about this artifact, and the worst of them.

0 with a null severity is a real answer: nothing has checked this artifact yet, which is not the same as it being clean.

last_seen_atstringrequired
local_idstringrequired
locationstringrequired
namestringrequired
preview_truncatedbooleanrequired
shapestringrequired

How this kind of artifact relates to others: declares, declared, instructions, model or other.

size_bytesintegerrequired
sourcestringrequired
statestringrequired
state_changed_atstringrequired
supply_chainSupplyChainrequired

The AI supply chain check on this artifact.

advisoriesAdvisory[]required

Advisories that apply, or may; dismissed ones with their dismissal.

advisory_severitystringrequired

critical|high|medium|low|none, over applying, non-dismissed advisories.

categoriesstring[]required

The $slug service categories of the entry.

flagsFlag[]required

Raised flags, and dismissed ones with their dismissal.

found_inFeedAnswer[]required

One entry per feed that answered about this artifact's key.

licence_classstringrequired

permissive|copyleft|use_restricted|none|unknown.

tagsstring[]required

The free-text labels somebody applied, alphabetically. Usually empty.

typestringrequired
cataloguedCatalogue · null

What the registry recognised an artifact as.

This is the outcome of a lookup, distinct from the artifact's category, which says what the artifact is on the machine.

resolutionstringrequired

entry, not_catalogued, nothing_to_look_up or checking (task 6.24): what the supply-chain check stored, so the list, the grouping and the inspector read one value. checking is an artifact the check has not reached yet, and is never shown as clean.

stalebooleanrequired

Whether any fact under this rests on a feed older than that feed's declared maximum age.

categorystring · null

One of the ten component categories. None for unidentified.

display_namestring · null
identitystring · null

The registry's key. None for unidentified.

content_collected_atstring · null
content_hashstring · null
content_previewstring · null

The bounded, redacted excerpt, or null.

null does not mean the artifact was empty. It means content was never collected — because nothing reads it, or because this kind of artifact can never carry any.

declares_untrackedinteger · null

Dependencies a manifest parsed that are out of AI scope, so the band can say "and N other dependencies". null when the agent did not say.

ecosystemstring · null
hash_basisstring · null
launchLaunch · null

How an MCP server is launched or reached. Everything here was made safe on the machine before it was sent: a key-shaped value is redacted, and a URL is stripped of userinfo, query and fragment.

env_namesstring[]required

Names of the environment variables the server is given, as far as its launch arguments show them (-e NAME); never values.

header_namesstring[]required

Names of the request headers the server is given (--header Name); never values.

commandstring · null

The launcher and the package it runs, e.g. npx @playwright/mcp@1.2.3.

transportstring · null

stdio, http or sse.

urlstring · null
machine_idstring · null
matched_signaturestring · null
mtimestring · null
ownerstring · null

Which tool this artifact belongs to, or null.

null means unowned, not unknown: a package.json belongs to a project and a weight file to whatever loads it, not to an AI tool.

package_digeststring · null
package_rangestring · null

The declared range (^4.0.0) beside the resolved package_version; null when the version was pinned.

package_versionstring · null
person_idstring · null

The id of the person this signed-in tool belongs to, resolved from program_account.

null where no tool sign-in points at this artifact — nothing is signed in, the address could not be matched to a person, or it has not been resolved yet since the tool last reported it. It is an id, never a name.

preview_total_charsinteger · null
program_accountstring · null

The full email address a tool is signed in as. This is personal data: it identifies a person.

program_last_used_atstring · null
program_organizationstring · null

The organisation the tool reports being signed in to. null where the tool states none; few tools report one.

program_seat_tierstring · null

The seat tier the tool reports, exactly as reported and not normalised.

program_versionstring · null

The installed program's posture. All five are null on everything that is not an ai_tool artifact, and independently null on one that is: the six tools differ in what they state about themselves, and a version nobody could read is absent rather than guessed.

publisherstring · null
purlstring · null
scan_rootstring · null
scannerstring · null
settings_flagSettingsFlag · null

The worst open setting issue of an install: what its list row's end says.

rulestringrequired

The provided check's key: approval_bypass, shell_auto_approved, …

severitystringrequired
tool_lockSessionLock · null

One live session lock, and the decision that locked it.

idstringrequired
locked_atstringrequired
machine_idstringrequired
matchedstringrequired

What matched, in a few words.

messagestringrequired

The words the person sees on every refused call.

minted_bystringrequired

agent (a Hook policy) or server (a Session-log policy).

tool_settingsToolSettings · null

One tool's settings on one machine, as last read.

read_atstringrequired

RFC 3339, the endpoint's clock.

received_atstringrequired

RFC 3339, this server's clock.

settingsSetting[]required
sourcesSettingSource[]required
worst_issue_severitystring · null

Errors

404

No such artifact in this workspace

Replace an artifact's tags

PUT/artifacts/{artifact}/tags

Path parameters

artifactstringrequired

Request bodyPutTagsRequest

tagsstring[]required

Response200

The stored set, after normalisation

tagsstring[]required

The tags as saved, after normalisation, alphabetically. Not an echo of what was sent: Needs Review and needs review come back as one tag.

Errors

400

Malformed body, or an entry that is not a tag — the message names it

403

Caller lacks machines:read in this workspace

404

No such artifact in this workspace

Run a connector action on a presence

POST/people/{id}/presences/{presence}/actions

Runs one connector action, such as removing a member, against the record this presence names in the connected service. It applies the same checks and refusals as running the action from the connection: the connection is live, the connector offers the action for this kind of record, and the record is reachable. A vendor's refusal is returned as is, never retried. Needs the permission to manage connections. Only a presence that came from a connector has actions; a tool or machine presence is refused. The attempt appears in the person's history.

Path parameters

idstringrequired
presencestringrequired

Request bodyPresenceActionInput

actionstringrequired

The descriptor's action id, e.g. remove_member. The record it acts on is the presence's own — a caller does not name one, and cannot name another person's.

Response201

The action that was performed

actionstringrequired
atstringrequired
external_idstringrequired
idstringrequired
labelstringrequired

The descriptor's label — Archive repository — so a row reads as a sentence. The id is beside it because a link is built from the id and a sentence is written with the label.

outcomestringrequired

done | failed | refused.

record_kindstringrequired
triggerstringrequired

What started the action: policy (a policy ran it) or operator (a person ran it by hand).

detailstring · null

One short word, never a vendor client's Display: one of the five failure words on a failure, not_applicable on a refusal, and accepted / already_done — the vendor's own distinctions — on the two successes that have one. null on a plain success.

policy_idstring · null
policy_versioninteger · null

Errors

400

No such action, or it does not act on this presence's record kind

401

No valid session

403

Caller lacks connections:manage in this workspace

404

No such person or presence in this workspace, or no such record

409

This presence has no actions; or the connection is not live, cannot reach that action, or the connector declined

502

The vendor could not be reached

503

The vendor is rate-limiting this account

List tags

GET/tags

Every tag in use in this workspace, most-used first.

Response200

Tags in use, most-used first

tagsTagSuggestion[]required

Most-used first. Empty is the honest answer for a workspace that has tagged nothing, and is not an error state — the editor opens with no suggestions and accepts whatever is typed.

namestringrequired
usesintegerrequired

Subjects carrying this tag. What makes the list worth reading: a tag used forty times is the workspace's convention and a tag used once is probably somebody's typo, and an alphabetical list of bare strings cannot tell you which.

Errors

401

No valid session

403

Caller may read neither artifacts nor issues in this workspace

404

No such workspace, or the caller is not a member