modal

v0.2.0 collector

Collects Modal workspace members, tokens, secrets, and web endpoints

v0.1.0 passed its nightly check on Nov 7, 2026: 81 of 81 values matched. See the checked values

Install

epack install collector modal

Adds to epack.yaml, resolves dependencies, downloads binary.

Usage

Run all configured collectors and build a pack:

epack collect

Runs all collectors in epack.yaml and outputs an evidence pack.

Configuration

Or add manually to epack.yaml:

collectors:
  modal:
    source: https://github.com/locktivity/epack-collector-modal

Then run epack install to lock and sync.

epack-collector-modal collects evidence of who can reach a Modal workspace and what the workspace exposes to the internet.

What it collects

From Modal's API, with a token that belongs to the workspace's Owner or a Manager:

  • Members, with each member's role, how they sign in, and when they were last active. A member with no activity in 90 days counts as inactive.
  • Environments, and who holds a role in each restricted environment.
  • Service users, with when each was last used. Only the Team and Enterprise plans have service users.
  • Proxy auth tokens, and the environments each scoped token works in.
  • Secrets in every environment, with the names of their keys and when each was last used.
  • Apps in every environment. For each deployed app, the collector counts its web endpoints, the endpoints anyone can call without a proxy auth token, and its scheduled functions.

Access posture

artifacts/modal.access-posture.json describes access to the workspace in the shared evidencepack/access-posture@v1 format. It is built from the members, service users, and proxy auth tokens, with no other calls.

  • Sign-in. sso_configured is true when any member signs in through SAML SSO.
  • Members. A member who signs in through SAML SSO counts as an SSO member. A member who signs in with GitHub or Google counts as signing in without SSO, even if the workspace requires SSO, since Modal's API does not report that setting. Each Modal account has one way to sign in and no password, so an SSO member can't sign in without SSO.
  • Admins. The Owner and the Managers.
  • Machine credentials. Service users and proxy auth tokens. A credential created more than 90 days ago counts as overdue for rotation. In a workspace without service users, a proxy auth token that works in every environment counts as unrestricted. No proxy auth token counts as having write access, since it is good only for calling web endpoints.

What it never collects

  • Secret values. The collector reads only the names of a secret's keys.
  • The secrets of API tokens and proxy auth tokens.
  • Member names and emails below the audit level.

Values Modal does not report

An environment with no setting of its own for blocking unauthenticated web endpoints follows the workspace default. Modal's API does not report that default, so blocks_unauthenticated is null for that environment.

Modal's API does not report these access-posture values either. Each one is left out of every run with an unsupported gap:

  • Whether the workspace requires SSO, and whether it provisions accounts through SCIM.
  • MFA. Members sign in with GitHub, Google, or SAML SSO, and Modal has no MFA setting of its own.
  • Whether a member comes from outside the organization.
  • When a service user's token or a proxy auth token expires. A service user's token can be given an expiry, but Modal's lists of service users and proxy auth tokens don't include it.
  • Connected apps. Modal also has no root account.

Modal does not report when a proxy auth token was last used. In a workspace with proxy auth tokens, the unused credentials are left out with an unsupported gap.

Values the collector does not read

A service user's access comes from its role in each environment. Modal reports these roles, but the collector reads them only in restricted environments, from the audit level. In a workspace with service users, the unrestricted credentials and those with write access are left out with a not_read gap.

Artifacts

  • artifacts/modal.details.json, described by docs/schema/v1.0.0.json.
  • artifacts/modal.access-posture.json, in the evidencepack/access-posture@v1 format. docs/schema/methods.json says how each of its values is measured.
  • artifacts/modal.collector-result.json, which records each value left out and why, the run's steps, and its calls.

See levels.md for what each collection level adds and examples.md for sample output.

Configuration

The collector reads a Modal workspace through Modal's API with an API token.

1. Create the API token

Create the token as the workspace's Owner or a Manager, since only they can list the workspace's members and service users. With a Member's token, the members and the service users are left out with a permission_denied gap. The sign-in, members, and admins in artifacts/modal.access-posture.json come from the members list, so they are left out too. The credential counts and percentages there need the service users, so they are also left out.

  1. Sign in to Modal as the Owner or a Manager.
  2. In Settings, under API Tokens, create a token for the workspace.
  3. Keep the token ID and the token secret for step 2.

A Modal API token can do anything its user can, so a Manager's token can also change the workspace and its members.

2. Configure epack

collectors:
  modal:
    source: locktivity/epack-collector-modal@^0.1
    config:
      level: audit
    secrets:
      - MODAL_TOKEN_ID
      - MODAL_TOKEN_SECRET
export MODAL_TOKEN_ID=YOUR-TOKEN-ID MODAL_TOKEN_SECRET=YOUR-TOKEN-SECRET

The collector reads the workspace the token belongs to.

Options

Option Required Description
level No trust (the default), audit, or internal. See levels.md.
collect No The kinds of evidence to collect, from access-posture and details. Defaults to both.

Environment Variables

Variable Description
MODAL_TOKEN_ID The API token's ID, which starts with ak-.
MODAL_TOKEN_SECRET The API token's secret, which starts with as-.

Partial Collection and Exit Codes

The run fails only when the configuration is invalid (exit 2), when Modal rejects the token (exit 3), or when Modal's API cannot be reached (exit 4). Every other read that fails leaves its values out of artifacts/modal.details.json and artifacts/modal.access-posture.json. artifacts/modal.collector-result.json records a gap for each, with the call that failed and what to check.

This value is left out every time its condition holds:

Value Code When
members and service_users in artifacts/modal.details.json permission_denied The token belongs to a Member.
sign_in, members, and admins in artifacts/modal.access-posture.json permission_denied The token belongs to a Member.
The counts and percentages under credentials in artifacts/modal.access-posture.json permission_denied The token belongs to a Member.
unused_pct and unused_credential_count in artifacts/modal.access-posture.json unsupported The workspace has a proxy auth token.
unrestricted_pct, write_access_pct, and their counts in artifacts/modal.access-posture.json not_read The workspace has a service user.

Basic Usage

Counts for the workspace, at the default trust level:

collectors:
  modal:
    source: locktivity/epack-collector-modal@^0.1
    secrets:
      - MODAL_TOKEN_ID
      - MODAL_TOKEN_SECRET

With Inventories

At audit, each count has its rows beside it:

collectors:
  modal:
    source: locktivity/epack-collector-modal@^0.1
    config:
      level: audit
    secrets:
      - MODAL_TOKEN_ID
      - MODAL_TOKEN_SECRET

Example Output

For a Team workspace read with a Manager's token, at the trust level, artifacts/modal.details.json holds:

{
  "schema_version": "1.0.0",
  "collected_at": "2026-10-22T12:00:00Z",
  "collected_at_level": "trust",
  "workspace": {"id": "ac-0123456789abcdefghijkl", "name": "example-workspace"},
  "members": {
    "total_count": 3,
    "owner_count": 1,
    "manager_count": 1,
    "member_count": 1,
    "sign_in": {"github_count": 1, "google_count": 2, "saml_count": 0, "other_count": 0},
    "inactive_count": 2
  },
  "environments": {"total_count": 3, "restricted_count": 1},
  "service_users": {"total_count": 2, "never_used_count": 1},
  "proxy_auth_tokens": {"total_count": 2, "unscoped_count": 1},
  "secrets": {"total_count": 3, "never_used_count": 2},
  "apps": {
    "deployed_count": 3,
    "web_endpoint_count": 2,
    "unauthenticated_endpoint_count": 1,
    "scheduled_function_count": 1
  }
}

For the same workspace, artifacts/modal.access-posture.json holds:

{
  "schema_version": "1.0.0",
  "collected_at": "2026-10-22T12:00:00Z",
  "provider": "modal",
  "system_type": "platform",
  "sign_in": {"sso_configured": false},
  "members": {
    "members_present": true,
    "sso_coverage_pct": 0,
    "local_members_present": true,
    "inactive_pct": 67
  },
  "admins": {
    "admins_present": true,
    "admin_share_pct": 67,
    "local_admins_present": true
  },
  "credentials": {
    "credentials_present": true,
    "rotation_overdue_pct": 25
  }
}

The workspace has service users, so unrestricted_pct and write_access_pct are left out with a not_read gap.

With a Member's token, members and service_users are absent and artifacts/modal.collector-result.json has a gap for each. The access-posture artifact leaves out sign_in, members, and admins, and the credential counts and percentages. Each has a permission_denied gap. At audit, the detailed artifact's gap on the members is:

"gaps": [
  {
    "path": "artifacts/modal.details.json",
    "pointer": "/members",
    "status": "not_collected",
    "code": "permission_denied",
    "owner": "customer",
    "vendor_code": "PERMISSION_DENIED",
    "operation": "modal.members.list",
    "call": 2,
    "source": "internal/collector/members.go:25",
    "missing_permission": "Manager",
    "warning": "Reading members needs a token that belongs to the workspace's Owner or a Manager.",
    "detail": "modal.members.list: PERMISSION_DENIED: User example-member does not have manage access to workspace example-workspace. Contact your workspace administrator to update permissions."
  }
]

At audit, a restricted environment's row lists who holds a role in it:

{
  "name": "prod",
  "default": false,
  "restricted": true,
  "created_at": "2026-10-02T12:00:00Z",
  "default_member_role": "no_access",
  "blocks_unauthenticated": true,
  "roles": [
    {"principal": "member@example.com", "kind": "member", "role": "viewer"},
    {"principal": "ci-deployer", "kind": "service_user", "role": "contributor"}
  ]
}

A deployed app's row:

{
  "name": "public-api",
  "environment": "dev",
  "state": "deployed",
  "created_at": "2026-10-19T12:00:00Z",
  "web_endpoints": 1,
  "unauthenticated_endpoints": 1,
  "scheduled_functions": 0
}

Modal

Passed

A Modal workspace on the Starter plan, used only for these checks. It has an owner, a manager, and a member, three environments, three secrets, one proxy auth token, and three deployed apps: a web endpoint anyone can call, one that needs a proxy auth token, and a job that runs every day. The collector reads the workspace at the audit level with the manager's token.

Runs at Audit, which includes Trust. Internal isn't checked.

v0.1.0 · Nov 7, 2026 · 81 of 81 values matched

16 of 16 nights passed, Oct 23 to Nov 7.

Passed
Every value matched.
Failed
At least one value didn't match. The maintainers add a note when they know why.
Not run
The run didn't finish, or the test account had changed. It doesn't count for or against the collector.

What this account doesn't cover

  • Starter has no service users, restricted environments, or environment roles, so service users are checked only at 0 and no environment has roles.
  • Starter can't limit a proxy auth token to environments, so tokens limited that way aren't checked.
  • The collector signs in as a Manager, so the sandbox does not check a Member's token, which can't list members.
  • The members' addresses aren't published, so their rows are checked by count only.
See the checked values

How the checks work

A test account with known settings

The test account is set up only for these checks. Its settings are kept in code, so the value the collector should report for each field is known ahead of time.

Every night, and before every release

Every night at 05:00 UTC, the newest published version runs against the test account. Each value it reports is compared with the known value. New versions go through the same check before they're published.

What's withheld

Values that could identify a test account, such as its domain, IDs, or user logins, aren't shown here. They're still checked.

Raw results

The same results, with the same values withheld, are published as sandbox-results.json.

v0.2.0 Latest Passed Release check b3c2bc6
2026-11-05

What's Changed

New Contributors

Full Changelog: https://github.com/locktivity/epack-collector-modal/compare/v0.1.0...v0.2.0

darwin/amd64 darwin/arm64 linux/amd64 linux/arm64
v0.1.0 Passed Release check 8f87185
2026-10-22

Nightly checks: 16 passed.

darwin/amd64 darwin/arm64 linux/amd64 linux/arm64

Field reference

268 fields. The test account checks 51 of them.

Summary values modal.access-posture.json

The values Foundational Controls and other profiles read.

General 4 fields · from trust Not checked
Collected at collected_at
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The test account doesn't have a known value for this field.

Provider provider The system's vendor, such as github, aws, or clickhouse
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The system's vendor, such as github, aws, or clickhouse

The test account doesn't have a known value for this field.

Schema version schema_version
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The test account doesn't have a known value for this field.

System type system_type The kind of system
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
value

The kind of system

The test account doesn't have a known value for this field.

Admins 14 fields · 4 trust, 10 audit Not checked
Admin count admins.admin_count Admins
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Admins

The test account doesn't have a known value for this field.

Admin share admins.admin_share_pct Admins as a percentage of members. Null when there are no members
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
number, can be null
Counted over
admins.1.members.member_count

Admins as a percentage of members. Null when there are no members

The test account doesn't have a known value for this field.

Admins present admins.admins_present Whether the system has any admins
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
boolean, can be null

Whether the system has any admins

The test account doesn't have a known value for this field.

Local admin count admins.local_admin_count Admins who can sign in without SSO. An admin linked to SSO counts when the system still lets them sign in another way
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Admins who can sign in without SSO. An admin linked to SSO counts when the system still lets them sign in another way

The test account doesn't have a known value for this field.

Local admin MFA coverage admins.local_admin_mfa_coverage_pct Percentage of admins who can sign in without SSO and have MFA. Null when no admin can sign in without SSO
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
number, can be null
Counted over
admins.local_admin_count

Percentage of admins who can sign in without SSO and have MFA. Null when no admin can sign in without SSO

The test account doesn't have a known value for this field.

Local admins present admins.local_admins_present Whether any admins can sign in without SSO. An admin linked to SSO counts too when the system still lets them sign in another way. When f...
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
boolean, can be null

Whether any admins can sign in without SSO. An admin linked to SSO counts too when the system still lets them sign in another way. When false, local_admin_mfa_coverage_pct has no admins to count

The test account doesn't have a known value for this field.

Local MFA admin count admins.local_mfa_admin_count Admins counted in local_admin_count who have MFA
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Admins counted in local_admin_count who have MFA

The test account doesn't have a known value for this field.

Admin count scopes[].admins.admin_count Admins
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Admins

The test account doesn't have a known value for this field.

Admin share scopes[].admins.admin_share_pct Admins as a percentage of members. Null when there are no members
Audit
Not checked
Collected in
Audit and internal runs
Type
number, can be null
Counted over
scopes[].admins.1.members.member_count

Admins as a percentage of members. Null when there are no members

The test account doesn't have a known value for this field.

Admins present scopes[].admins.admins_present Whether the system has any admins
Audit
Not checked
Collected in
Audit and internal runs
Type
boolean, can be null

Whether the system has any admins

The test account doesn't have a known value for this field.

Local admin count scopes[].admins.local_admin_count Admins who can sign in without SSO. An admin linked to SSO counts when the system still lets them sign in another way
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Admins who can sign in without SSO. An admin linked to SSO counts when the system still lets them sign in another way

The test account doesn't have a known value for this field.

Local admin MFA coverage scopes[].admins.local_admin_mfa_coverage_pct Percentage of admins who can sign in without SSO and have MFA. Null when no admin can sign in without SSO
Audit
Not checked
Collected in
Audit and internal runs
Type
number, can be null
Counted over
scopes[].admins.local_admin_count

Percentage of admins who can sign in without SSO and have MFA. Null when no admin can sign in without SSO

The test account doesn't have a known value for this field.

Local admins present scopes[].admins.local_admins_present Whether any admins can sign in without SSO. An admin linked to SSO counts too when the system still lets them sign in another way. When f...
Audit
Not checked
Collected in
Audit and internal runs
Type
boolean, can be null

Whether any admins can sign in without SSO. An admin linked to SSO counts too when the system still lets them sign in another way. When false, local_admin_mfa_coverage_pct has no admins to count

The test account doesn't have a known value for this field.

Local MFA admin count scopes[].admins.local_mfa_admin_count Admins counted in local_admin_count who have MFA
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Admins counted in local_admin_count who have MFA

The test account doesn't have a known value for this field.

Connected apps 2 fields · 1 trust, 1 audit Not checked
App count connected_apps.app_count Third-party apps with access
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Third-party apps with access

The test account doesn't have a known value for this field.

Apps present connected_apps.apps_present Whether any third-party app has access
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
boolean, can be null

Whether any third-party app has access

The test account doesn't have a known value for this field.

Credentials 24 fields · 6 trust, 18 audit Not checked
Credential count credentials.credential_count Machine credentials
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Machine credentials

The test account doesn't have a known value for this field.

Credentials present credentials.credentials_present Whether the system has any machine credentials. When false, the credential percentages have none to count
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
boolean, can be null

Whether the system has any machine credentials. When false, the credential percentages have none to count

The test account doesn't have a known value for this field.

Never expiring credential count credentials.never_expiring_credential_count Credentials that never expire
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Credentials that never expire

The test account doesn't have a known value for this field.

Never expiring credentials.never_expiring_pct Percentage of credentials that never expire. Null when there are none
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
number, can be null
Counted over
credentials.credential_count

Percentage of credentials that never expire. Null when there are none

The test account doesn't have a known value for this field.

Rotation overdue credential count credentials.rotation_overdue_credential_count Credentials older than 90 days. When the system does not record when a credential was created, this is left out with a gap
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Credentials older than 90 days. When the system does not record when a credential was created, this is left out with a gap

The test account doesn't have a known value for this field.

Rotation overdue credentials.rotation_overdue_pct Percentage of credentials older than 90 days. Left out with a gap when the system does not record when a credential was created. Null whe...
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
number, can be null
Counted over
credentials.credential_count

Percentage of credentials older than 90 days. Left out with a gap when the system does not record when a credential was created. Null when there are none

The test account doesn't have a known value for this field.

Unrestricted credential count credentials.unrestricted_credential_count Credentials with neither an IP limit nor a scope narrower than full access. A credential limited to chosen permissions or resources has a...
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Credentials with neither an IP limit nor a scope narrower than full access. A credential limited to chosen permissions or resources has a narrower scope. A credential with either limit is restricted

The test account doesn't have a known value for this field.

Unrestricted credentials.unrestricted_pct Percentage of credentials with neither an IP limit nor a scope narrower than full access. Null when there are none
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
number, can be null
Counted over
credentials.credential_count

Percentage of credentials with neither an IP limit nor a scope narrower than full access. Null when there are none

The test account doesn't have a known value for this field.

Unused credential count credentials.unused_credential_count Credentials never used, or unused in the last 90 days
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Credentials never used, or unused in the last 90 days

The test account doesn't have a known value for this field.

Unused credentials.unused_pct Percentage of credentials never used, or unused in the last 90 days. Null when there are none
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
number, can be null
Counted over
credentials.credential_count

Percentage of credentials never used, or unused in the last 90 days. Null when there are none

The test account doesn't have a known value for this field.

Write access credential count credentials.write_access_credential_count Credentials that can write or administer
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Credentials that can write or administer

The test account doesn't have a known value for this field.

Write access credentials.write_access_pct Percentage of credentials that can write or administer. Null when there are none
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
number, can be null
Counted over
credentials.credential_count

Percentage of credentials that can write or administer. Null when there are none

The test account doesn't have a known value for this field.

Credential count scopes[].credentials.credential_count Machine credentials
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Machine credentials

The test account doesn't have a known value for this field.

Credentials present scopes[].credentials.credentials_present Whether the system has any machine credentials. When false, the credential percentages have none to count
Audit
Not checked
Collected in
Audit and internal runs
Type
boolean, can be null

Whether the system has any machine credentials. When false, the credential percentages have none to count

The test account doesn't have a known value for this field.

Never expiring credential count scopes[].credentials.never_expiring_credential_count Credentials that never expire
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Credentials that never expire

The test account doesn't have a known value for this field.

Never expiring scopes[].credentials.never_expiring_pct Percentage of credentials that never expire. Null when there are none
Audit
Not checked
Collected in
Audit and internal runs
Type
number, can be null
Counted over
scopes[].credentials.credential_count

Percentage of credentials that never expire. Null when there are none

The test account doesn't have a known value for this field.

Rotation overdue credential count scopes[].credentials.rotation_overdue_credential_count Credentials older than 90 days. When the system does not record when a credential was created, this is left out with a gap
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Credentials older than 90 days. When the system does not record when a credential was created, this is left out with a gap

The test account doesn't have a known value for this field.

Rotation overdue scopes[].credentials.rotation_overdue_pct Percentage of credentials older than 90 days. Left out with a gap when the system does not record when a credential was created. Null whe...
Audit
Not checked
Collected in
Audit and internal runs
Type
number, can be null
Counted over
scopes[].credentials.credential_count

Percentage of credentials older than 90 days. Left out with a gap when the system does not record when a credential was created. Null when there are none

The test account doesn't have a known value for this field.

Unrestricted credential count scopes[].credentials.unrestricted_credential_count Credentials with neither an IP limit nor a scope narrower than full access. A credential limited to chosen permissions or resources has a...
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Credentials with neither an IP limit nor a scope narrower than full access. A credential limited to chosen permissions or resources has a narrower scope. A credential with either limit is restricted

The test account doesn't have a known value for this field.

Unrestricted scopes[].credentials.unrestricted_pct Percentage of credentials with neither an IP limit nor a scope narrower than full access. Null when there are none
Audit
Not checked
Collected in
Audit and internal runs
Type
number, can be null
Counted over
scopes[].credentials.credential_count

Percentage of credentials with neither an IP limit nor a scope narrower than full access. Null when there are none

The test account doesn't have a known value for this field.

Unused credential count scopes[].credentials.unused_credential_count Credentials never used, or unused in the last 90 days
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Credentials never used, or unused in the last 90 days

The test account doesn't have a known value for this field.

Unused scopes[].credentials.unused_pct Percentage of credentials never used, or unused in the last 90 days. Null when there are none
Audit
Not checked
Collected in
Audit and internal runs
Type
number, can be null
Counted over
scopes[].credentials.credential_count

Percentage of credentials never used, or unused in the last 90 days. Null when there are none

The test account doesn't have a known value for this field.

Write access credential count scopes[].credentials.write_access_credential_count Credentials that can write or administer
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Credentials that can write or administer

The test account doesn't have a known value for this field.

Write access scopes[].credentials.write_access_pct Percentage of credentials that can write or administer. Null when there are none
Audit
Not checked
Collected in
Audit and internal runs
Type
number, can be null
Counted over
scopes[].credentials.credential_count

Percentage of credentials that can write or administer. Null when there are none

The test account doesn't have a known value for this field.

Members 24 fields · 6 trust, 18 audit Not checked
External member count members.external_member_count Members from outside the organization
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Members from outside the organization

The test account doesn't have a known value for this field.

External members present members.external_members_present Whether any members come from outside the organization, such as outside collaborators or guests
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
boolean, can be null

Whether any members come from outside the organization, such as outside collaborators or guests

The test account doesn't have a known value for this field.

Inactive member count members.inactive_member_count Members with no sign-in or other recorded activity in the last 90 days
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Members with no sign-in or other recorded activity in the last 90 days

The test account doesn't have a known value for this field.

Inactive members.inactive_pct Percentage of members with no sign-in or other recorded activity in the last 90 days. Null when there are no members
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
number, can be null
Counted over
members.member_count

Percentage of members with no sign-in or other recorded activity in the last 90 days. Null when there are no members

The test account doesn't have a known value for this field.

Local member count members.local_member_count Members who can sign in without SSO. A member linked to SSO counts when the system still lets them sign in another way
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Members who can sign in without SSO. A member linked to SSO counts when the system still lets them sign in another way

The test account doesn't have a known value for this field.

Local members present members.local_members_present Whether any members can sign in without SSO, with a password or a social login. A member linked to SSO counts too when the system still l...
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
boolean, can be null

Whether any members can sign in without SSO, with a password or a social login. A member linked to SSO counts too when the system still lets them sign in another way, so local and SSO members can overlap. When false, local_mfa_coverage_pct has no members to count

The test account doesn't have a known value for this field.

Local MFA coverage members.local_mfa_coverage_pct Percentage of members who can sign in without SSO and have MFA. Null when no member can sign in without SSO
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
number, can be null
Counted over
members.local_member_count

Percentage of members who can sign in without SSO and have MFA. Null when no member can sign in without SSO

The test account doesn't have a known value for this field.

Local MFA member count members.local_mfa_member_count Members counted in local_member_count who have MFA
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Members counted in local_member_count who have MFA

The test account doesn't have a known value for this field.

Member count members.member_count Members
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Members

The test account doesn't have a known value for this field.

Members present members.members_present Whether the system has any members. When false, the member percentages have no members to count
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
boolean, can be null

Whether the system has any members. When false, the member percentages have no members to count

The test account doesn't have a known value for this field.

SSO coverage members.sso_coverage_pct Percentage of members whose account is linked to SSO. Null when there are no members
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
number, can be null
Counted over
members.member_count

Percentage of members whose account is linked to SSO. Null when there are no members

The test account doesn't have a known value for this field.

SSO member count members.sso_member_count Members whose account is linked to SSO
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Members whose account is linked to SSO

The test account doesn't have a known value for this field.

External member count scopes[].members.external_member_count Members from outside the organization
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Members from outside the organization

The test account doesn't have a known value for this field.

External members present scopes[].members.external_members_present Whether any members come from outside the organization, such as outside collaborators or guests
Audit
Not checked
Collected in
Audit and internal runs
Type
boolean, can be null

Whether any members come from outside the organization, such as outside collaborators or guests

The test account doesn't have a known value for this field.

Inactive member count scopes[].members.inactive_member_count Members with no sign-in or other recorded activity in the last 90 days
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Members with no sign-in or other recorded activity in the last 90 days

The test account doesn't have a known value for this field.

Inactive scopes[].members.inactive_pct Percentage of members with no sign-in or other recorded activity in the last 90 days. Null when there are no members
Audit
Not checked
Collected in
Audit and internal runs
Type
number, can be null
Counted over
scopes[].members.member_count

Percentage of members with no sign-in or other recorded activity in the last 90 days. Null when there are no members

The test account doesn't have a known value for this field.

Local member count scopes[].members.local_member_count Members who can sign in without SSO. A member linked to SSO counts when the system still lets them sign in another way
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Members who can sign in without SSO. A member linked to SSO counts when the system still lets them sign in another way

The test account doesn't have a known value for this field.

Local members present scopes[].members.local_members_present Whether any members can sign in without SSO, with a password or a social login. A member linked to SSO counts too when the system still l...
Audit
Not checked
Collected in
Audit and internal runs
Type
boolean, can be null

Whether any members can sign in without SSO, with a password or a social login. A member linked to SSO counts too when the system still lets them sign in another way, so local and SSO members can overlap. When false, local_mfa_coverage_pct has no members to count

The test account doesn't have a known value for this field.

Local MFA coverage scopes[].members.local_mfa_coverage_pct Percentage of members who can sign in without SSO and have MFA. Null when no member can sign in without SSO
Audit
Not checked
Collected in
Audit and internal runs
Type
number, can be null
Counted over
scopes[].members.local_member_count

Percentage of members who can sign in without SSO and have MFA. Null when no member can sign in without SSO

The test account doesn't have a known value for this field.

Local MFA member count scopes[].members.local_mfa_member_count Members counted in local_member_count who have MFA
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Members counted in local_member_count who have MFA

The test account doesn't have a known value for this field.

Member count scopes[].members.member_count Members
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Members

The test account doesn't have a known value for this field.

Members present scopes[].members.members_present Whether the system has any members. When false, the member percentages have no members to count
Audit
Not checked
Collected in
Audit and internal runs
Type
boolean, can be null

Whether the system has any members. When false, the member percentages have no members to count

The test account doesn't have a known value for this field.

SSO coverage scopes[].members.sso_coverage_pct Percentage of members whose account is linked to SSO. Null when there are no members
Audit
Not checked
Collected in
Audit and internal runs
Type
number, can be null
Counted over
scopes[].members.member_count

Percentage of members whose account is linked to SSO. Null when there are no members

The test account doesn't have a known value for this field.

SSO member count scopes[].members.sso_member_count Members whose account is linked to SSO
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Members whose account is linked to SSO

The test account doesn't have a known value for this field.

Root 10 fields · 3 trust, 7 audit Not checked
Root access keys present root.root_access_keys_present Whether any root account has access keys
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
boolean, can be null

Whether any root account has access keys

The test account doesn't have a known value for this field.

Root account count root.root_account_count Root accounts. A system with scopes has one per scope
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Root accounts. A system with scopes has one per scope

The test account doesn't have a known value for this field.

Root accounts present root.root_accounts_present Whether the system has a built-in root account. When false, root_mfa_coverage_pct has no accounts to count
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
boolean, can be null

Whether the system has a built-in root account. When false, root_mfa_coverage_pct has no accounts to count

The test account doesn't have a known value for this field.

Root MFA account count root.root_mfa_account_count Root accounts with MFA
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Root accounts with MFA

The test account doesn't have a known value for this field.

Root MFA coverage root.root_mfa_coverage_pct Percentage of root accounts with MFA. Null when there are none
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
number, can be null
Counted over
root.root_account_count

Percentage of root accounts with MFA. Null when there are none

The test account doesn't have a known value for this field.

Root access keys present scopes[].root.root_access_keys_present Whether any root account has access keys
Audit
Not checked
Collected in
Audit and internal runs
Type
boolean, can be null

Whether any root account has access keys

The test account doesn't have a known value for this field.

Root account count scopes[].root.root_account_count Root accounts. A system with scopes has one per scope
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Root accounts. A system with scopes has one per scope

The test account doesn't have a known value for this field.

Root accounts present scopes[].root.root_accounts_present Whether the system has a built-in root account. When false, root_mfa_coverage_pct has no accounts to count
Audit
Not checked
Collected in
Audit and internal runs
Type
boolean, can be null

Whether the system has a built-in root account. When false, root_mfa_coverage_pct has no accounts to count

The test account doesn't have a known value for this field.

Root MFA account count scopes[].root.root_mfa_account_count Root accounts with MFA
Audit
Not checked
Collected in
Audit and internal runs
Type
integer, can be null

Root accounts with MFA

The test account doesn't have a known value for this field.

Root MFA coverage scopes[].root.root_mfa_coverage_pct Percentage of root accounts with MFA. Null when there are none
Audit
Not checked
Collected in
Audit and internal runs
Type
number, can be null
Counted over
scopes[].root.root_account_count

Percentage of root accounts with MFA. Null when there are none

The test account doesn't have a known value for this field.

Scopes 3 fields · from audit Not checked
ID scopes[].id The account or subscription ID
Audit
Not checked
Collected in
Audit and internal runs
Type
string

The account or subscription ID

The test account doesn't have a known value for this field.

Kind scopes[].kind
Audit
Not checked
Collected in
Audit and internal runs
Type
value

The test account doesn't have a known value for this field.

Name scopes[].name The account or subscription name
Audit
Not checked
Collected in
Audit and internal runs
Type
string

The account or subscription name

The test account doesn't have a known value for this field.

Sign in 8 fields · 4 trust, 4 audit Not checked
MFA required scopes[].sign_in.mfa_required Whether the system requires MFA from anyone who signs in without SSO
Audit
Not checked
Collected in
Audit and internal runs
Type
boolean, can be null

Whether the system requires MFA from anyone who signs in without SSO

The test account doesn't have a known value for this field.

SCIM enabled scopes[].sign_in.scim_enabled Whether accounts are created and removed through SCIM
Audit
Not checked
Collected in
Audit and internal runs
Type
boolean, can be null

Whether accounts are created and removed through SCIM

The test account doesn't have a known value for this field.

SSO configured scopes[].sign_in.sso_configured Whether SSO is set up for the system
Audit
Not checked
Collected in
Audit and internal runs
Type
boolean, can be null

Whether SSO is set up for the system

The test account doesn't have a known value for this field.

SSO required scopes[].sign_in.sso_required Whether everyone must sign in through SSO
Audit
Not checked
Collected in
Audit and internal runs
Type
boolean, can be null

Whether everyone must sign in through SSO

The test account doesn't have a known value for this field.

MFA required sign_in.mfa_required Whether the system requires MFA from anyone who signs in without SSO
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
boolean, can be null

Whether the system requires MFA from anyone who signs in without SSO

The test account doesn't have a known value for this field.

SCIM enabled sign_in.scim_enabled Whether accounts are created and removed through SCIM
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
boolean, can be null

Whether accounts are created and removed through SCIM

The test account doesn't have a known value for this field.

SSO configured sign_in.sso_configured Whether SSO is set up for the system
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
boolean, can be null

Whether SSO is set up for the system

The test account doesn't have a known value for this field.

SSO required sign_in.sso_required Whether everyone must sign in through SSO
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
boolean, can be null

Whether everyone must sign in through SSO

The test account doesn't have a known value for this field.

Detailed output modal.collector-build.json

Everything this collector reads, grouped by area. Each field lists the lowest level that collects it. Its schema isn't published yet, so only the checked fields are listed.

Collector 2 fields All 2 checked fields match
Name collector.name Not in the published schema yet
Not documented
modal
Collected in
Not documented in the schema
Type
value

Not in the published schema yet. The checks below name the paths as the collector writes them.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
collector.name"modal""modal"Matches
Version collector.version Not in the published schema yet
Not documented
Withheld
Collected in
Not documented in the schema
Type
value

Not in the published schema yet. The checks below name the paths as the collector writes them.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
collector.versionthe same as artifacts/modal.collector-result.json /collector/version, which is "0.1.0"withheldMatches
Schemas 1 field Checked field matches
Artifacts/modal.json schemas.artifacts/modal.json Not in the published schema yet
Not documented
Present, value withheld
Collected in
Not documented in the schema
Type
value

Not in the published schema yet. The checks below name the paths as the collector writes them.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
schemas.artifacts/modal.jsonany valueany valueMatches
Trace map 1 field Checked field matches
Operations trace_map.artifacts.artifacts/modal.json./members/total_count.operations Not in the published schema yet
Not documented
["modal.members.list"]
Collected in
Not documented in the schema
Type
value

Not in the published schema yet. The checks below name the paths as the collector writes them.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
trace_map.artifacts.artifacts/modal.json./members/total_count.operations["modal.members.list"]["modal.members.list"]Matches

Detailed output modal.details.json

Everything this collector reads, grouped by area. Each field lists the lowest level that collects it.

General 3 fields · from trust All 2 checked fields match
Collected at collected_at When the collector ran.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

When the collector ran.

The test account doesn't have a known value for this field.

Collected at level collected_at_level The collection level the artifact was made at. audit adds the inventories to trust's counts, and internal adds nothing more.
Trust
audit
Collected in
Trust, audit, and internal runs
Type
string

The collection level the artifact was made at. audit adds the inventories to trust's counts, and internal adds nothing more.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
collected_at_level"audit""audit"Matches
Schema version schema_version The version of this schema.
Trust
1.0.0
Collected in
Trust, audit, and internal runs
Type
string

The version of this schema.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
schema_version"1.0.0""1.0.0"Matches
Apps 12 fields · 4 trust, 8 audit All 11 checked fields match
Deployed count apps.deployed_count Deployed apps.
Trust
3
Collected in
Trust, audit, and internal runs
Type
integer

Deployed apps.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
apps.deployed_count33Matches
Inventory apps.inventory Every app, sorted by environment, then name.
Audit
No more than 3 rows
Collected in
Audit and internal runs
Type
list

Every app, sorted by environment, then name.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
apps.inventory[3]left outleft outMatches
Created at apps.inventory[].created_at When the app was created. Null when the API does not say.
Audit
Not checked
Collected in
Audit and internal runs
Type
string, can be null

When the app was created. Null when the API does not say.

The test account doesn't have a known value for this field.

Environment apps.inventory[].environment The environment the app belongs to.
Audit
3 values match
Collected in
Audit and internal runs
Type
string

The environment the app belongs to.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
apps.inventory[0].environment"dev""dev"Matches
apps.inventory[1].environment"prod""prod"Matches
apps.inventory[2].environment"prod""prod"Matches
Name apps.inventory[].name The app's name.
Audit
3 values match
Collected in
Audit and internal runs
Type
string

The app's name.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
apps.inventory[0].name"sandbox-public-api""sandbox-public-api"Matches
apps.inventory[1].name"sandbox-nightly-job""sandbox-nightly-job"Matches
apps.inventory[2].name"sandbox-private-api""sandbox-private-api"Matches
Scheduled functions apps.inventory[].scheduled_functions The app's functions that run on a schedule.
Audit
3 values match
Collected in
Audit and internal runs
Type
integer, can be null
Null means
The app is not deployed, and the collector reads the functions of deployed apps only

The app's functions that run on a schedule.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
apps.inventory[0].scheduled_functions00Matches
apps.inventory[1].scheduled_functions11Matches
apps.inventory[2].scheduled_functions00Matches
State apps.inventory[].state The app's state. other is a state this version of the collector does not know.
Audit
3 values match
Collected in
Audit and internal runs
Type
string

The app's state. other is a state this version of the collector does not know.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
apps.inventory[0].state"deployed""deployed"Matches
apps.inventory[1].state"deployed""deployed"Matches
apps.inventory[2].state"deployed""deployed"Matches
Unauthenticated endpoints apps.inventory[].unauthenticated_endpoints Of those, the ones anyone with the URL can call, with no proxy auth token.
Audit
2 values match
Collected in
Audit and internal runs
Type
integer, can be null
Null means
The app is not deployed, and the collector reads the functions of deployed apps only

Of those, the ones anyone with the URL can call, with no proxy auth token.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
apps.inventory[0].unauthenticated_endpoints11Matches
apps.inventory[2].unauthenticated_endpoints00Matches
Web endpoints apps.inventory[].web_endpoints The app's functions that serve web requests.
Audit
3 values match
Collected in
Audit and internal runs
Type
integer, can be null
Null means
The app is not deployed, and the collector reads the functions of deployed apps only

The app's functions that serve web requests.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
apps.inventory[0].web_endpoints11Matches
apps.inventory[1].web_endpoints00Matches
apps.inventory[2].web_endpoints11Matches
Scheduled function count apps.scheduled_function_count Functions of deployed apps that run on a schedule.
Trust
1
Collected in
Trust, audit, and internal runs
Type
integer

Functions of deployed apps that run on a schedule.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
apps.scheduled_function_count11Matches

In the test account: The daily job runs on a schedule.

Unauthenticated endpoint count apps.unauthenticated_endpoint_count Of those, the ones anyone with the URL can call, with no proxy auth token.
Trust
1
Collected in
Trust, audit, and internal runs
Type
integer

Of those, the ones anyone with the URL can call, with no proxy auth token.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
apps.unauthenticated_endpoint_count11Matches

In the test account: Of the two web endpoints, the one in the dev environment needs no proxy auth token.

Web endpoint count apps.web_endpoint_count Functions of deployed apps that serve web requests.
Trust
2
Collected in
Trust, audit, and internal runs
Type
integer

Functions of deployed apps that serve web requests.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
apps.web_endpoint_count22Matches
Environments 12 fields · 2 trust, 10 audit All 5 checked fields match
Inventory environments.inventory Every environment the token can see, sorted by name. Its rows aren't described in the schema yet
Audit
4 values match
Collected in
Audit and internal runs
Type
list

Every environment the token can see, sorted by name.

Its rows aren't described in the schema yet. The checks below name the paths as the collector writes them.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
environments.inventory[3]left outleft outMatches
environments.inventory.*.restrictedfalsefalseMatches
environments.inventory.*.blocks_unauthenticatednullnullMatches
environments.inventory.*.rolesnullnullMatches
Blocks unauthenticated environments.inventory[].blocks_unauthenticated Whether the environment rejects new web endpoints, servers, and tunnels that anyone can call without authentication.
Audit
Not checked
Collected in
Audit and internal runs
Type
boolean, can be null
Null means
The environment has no setting of its own, so it follows the workspace default, which the API does not report

Whether the environment rejects new web endpoints, servers, and tunnels that anyone can call without authentication.

The test account doesn't have a known value for this field.

Created at environments.inventory[].created_at When the environment was created. Null when the API does not say.
Audit
Not checked
Collected in
Audit and internal runs
Type
string, can be null

When the environment was created. Null when the API does not say.

The test account doesn't have a known value for this field.

Default environments.inventory[].default Whether this is the workspace's default environment.
Audit
3 values match
Collected in
Audit and internal runs
Type
boolean

Whether this is the workspace's default environment.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
environments.inventory[0].defaultfalsefalseMatches
environments.inventory[1].defaulttruetrueMatches
environments.inventory[2].defaultfalsefalseMatches
Default member role environments.inventory[].default_member_role The role a member gets in a restricted environment when they hold no role of their own. other is a role this version of the collector doe...
Audit
Not checked
Collected in
Audit and internal runs
Type
string, can be null

The role a member gets in a restricted environment when they hold no role of their own. other is a role this version of the collector does not know. Null when Modal reports none.

The test account doesn't have a known value for this field.

Name environments.inventory[].name The environment's name.
Audit
3 values match
Collected in
Audit and internal runs
Type
string

The environment's name.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
environments.inventory[0].name"dev""dev"Matches
environments.inventory[1].name"main""main"Matches
environments.inventory[2].name"prod""prod"Matches
Restricted environments.inventory[].restricted Whether only members and service users with a role in the environment can use it.
Audit
Not checked
Collected in
Audit and internal runs
Type
boolean

Whether only members and service users with a role in the environment can use it.

The test account doesn't have a known value for this field.

Kind environments.inventory[].roles[].kind Whether the role belongs to a member or a service user.
Audit
Not checked
Collected in
Audit and internal runs
Type
string

Whether the role belongs to a member or a service user.

The test account doesn't have a known value for this field.

Principal environments.inventory[].roles[].principal The member's email address, or the service user's name.
Audit
Not checked
Collected in
Audit and internal runs
Type
string

The member's email address, or the service user's name.

The test account doesn't have a known value for this field.

Role environments.inventory[].roles[].role The role, such as contributor or viewer, or the name of a custom role.
Audit
Not checked
Collected in
Audit and internal runs
Type
string

The role, such as contributor or viewer, or the name of a custom role.

The test account doesn't have a known value for this field.

Restricted count environments.restricted_count Environments with restricted access, where a member needs a role in the environment to use it.
Trust
0
Collected in
Trust, audit, and internal runs
Type
integer

Environments with restricted access, where a member needs a role in the environment to use it.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
environments.restricted_count00Matches

In the test account: Starter has no restricted environments.

Total count environments.total_count Environments the token can see.
Trust
3
Collected in
Trust, audit, and internal runs
Type
integer

Environments the token can see.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
environments.total_count33Matches
Members 18 fields · 10 trust, 8 audit All 6 checked fields match
Inactive count members.inactive_count Members with no activity in the 90 days before the collector ran, including members who have never been active. The collector's calls cou...
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
integer

Members with no activity in the 90 days before the collector ran, including members who have never been active. The collector's calls count as activity for the member the token belongs to, so that member is never inactive.

The test account doesn't have a known value for this field.

Inventory members.inventory Every member, sorted by email.
Audit
No more than 3 rows
Collected in
Audit and internal runs
Type
list

Every member, sorted by email.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
members.inventory[3]left outleft outMatches
Email members.inventory[].email The member's email address, in lowercase.
Audit
Not checked
Collected in
Audit and internal runs
Type
string

The member's email address, in lowercase.

The test account doesn't have a known value for this field.

Inactive members.inventory[].inactive Whether the member had no activity in the 90 days before the collector ran, or has never been active.
Audit
Not checked
Collected in
Audit and internal runs
Type
boolean

Whether the member had no activity in the 90 days before the collector ran, or has never been active.

The test account doesn't have a known value for this field.

Joined at members.inventory[].joined_at When the member joined the workspace. Null when the API does not say.
Audit
Not checked
Collected in
Audit and internal runs
Type
string, can be null

When the member joined the workspace. Null when the API does not say.

The test account doesn't have a known value for this field.

Last active at members.inventory[].last_active_at When the member was last active. Null for a member who has never been active.
Audit
Not checked
Collected in
Audit and internal runs
Type
string, can be null

When the member was last active. Null for a member who has never been active.

The test account doesn't have a known value for this field.

Name members.inventory[].name The member's display name.
Audit
Not checked
Collected in
Audit and internal runs
Type
string

The member's display name.

The test account doesn't have a known value for this field.

Role members.inventory[].role The member's workspace role. other is a role this version of the collector does not know.
Audit
Not checked
Collected in
Audit and internal runs
Type
string

The member's workspace role. other is a role this version of the collector does not know.

The test account doesn't have a known value for this field.

Sign in members.inventory[].sign_in How the member signs in.
Audit
Not checked
Collected in
Audit and internal runs
Type
string

How the member signs in.

The test account doesn't have a known value for this field.

Manager count members.manager_count Members with the Manager role.
Trust
1
Collected in
Trust, audit, and internal runs
Type
integer

Members with the Manager role.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
members.manager_count11Matches
Member count members.member_count Members with the Member role.
Trust
1
Collected in
Trust, audit, and internal runs
Type
integer

Members with the Member role.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
members.member_count11Matches
Owner count members.owner_count Members with the Owner role.
Trust
1
Collected in
Trust, audit, and internal runs
Type
integer

Members with the Owner role.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
members.owner_count11Matches
Sign in members.sign_in Members counted by how they sign in.
Trust
{"github_count":1,"google_count":2,"other_count":0,"saml_count":0}
Collected in
Trust, audit, and internal runs
Type
object

Members counted by how they sign in.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
members.sign_in{"github_count":1,"google_count":2,"other_count":0,"saml_count":0}{"github_count":1,"google_count":2,"other_count":0,"saml_count":0}Matches

In the test account: The owner signs in with GitHub, and the manager and the member with Google.

GitHub count members.sign_in.github_count Members who sign in with GitHub.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
integer

Members who sign in with GitHub.

The test account doesn't have a known value for this field.

Google count members.sign_in.google_count Members who sign in with Google.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
integer

Members who sign in with Google.

The test account doesn't have a known value for this field.

Other count members.sign_in.other_count Members who sign in some other way, or whose sign-in Modal does not report.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
integer

Members who sign in some other way, or whose sign-in Modal does not report.

The test account doesn't have a known value for this field.

SAML count members.sign_in.saml_count Members who sign in through SAML SSO.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
integer

Members who sign in through SAML SSO.

The test account doesn't have a known value for this field.

Total count members.total_count Members of the workspace.
Trust
3
Collected in
Trust, audit, and internal runs
Type
integer

Members of the workspace.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
members.total_count33Matches

In the test account: The owner, the manager, and the member.

Proxy auth tokens 7 fields · 2 trust, 5 audit All 5 checked fields match
Created at proxy_auth_tokens.inventory[].created_at When the token was created. Null when the API does not say.
Audit
Not checked
Collected in
Audit and internal runs
Type
string, can be null

When the token was created. Null when the API does not say.

The test account doesn't have a known value for this field.

Created by proxy_auth_tokens.inventory[].created_by Who created the token. Null when the API does not say.
Audit
Not checked
Collected in
Audit and internal runs
Type
string, can be null

Who created the token. Null when the API does not say.

The test account doesn't have a known value for this field.

Environments proxy_auth_tokens.inventory[].environments The environments a scoped token works in, sorted. Null for a token that is not scoped.
Audit
Null
Collected in
Audit and internal runs
Type
list of strings, can be null

The environments a scoped token works in, sorted. Null for a token that is not scoped.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
proxy_auth_tokens.inventory[0].environmentsnullnullMatches
Name proxy_auth_tokens.inventory[].name The token's name.
Audit
sandbox-caller
Collected in
Audit and internal runs
Type
string

The token's name.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
proxy_auth_tokens.inventory[0].name"sandbox-caller""sandbox-caller"Matches
Scoped proxy_auth_tokens.inventory[].scoped Whether the token works only in the environments it lists.
Audit
No
Collected in
Audit and internal runs
Type
boolean

Whether the token works only in the environments it lists.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
proxy_auth_tokens.inventory[0].scopedfalsefalseMatches
Total count proxy_auth_tokens.total_count Proxy auth tokens in the workspace.
Trust
1
Collected in
Trust, audit, and internal runs
Type
integer

Proxy auth tokens in the workspace.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
proxy_auth_tokens.total_count11Matches
Unscoped count proxy_auth_tokens.unscoped_count Tokens that work in every environment.
Trust
1
Collected in
Trust, audit, and internal runs
Type
integer

Tokens that work in every environment.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
proxy_auth_tokens.unscoped_count11Matches

In the test account: The one proxy auth token works in every environment.

Secrets 10 fields · 2 trust, 8 audit All 7 checked fields match
Inventory secrets.inventory Every secret, sorted by environment, then name.
Audit
No more than 3 rows
Collected in
Audit and internal runs
Type
list

Every secret, sorted by environment, then name.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
secrets.inventory[3]left outleft outMatches
Created at secrets.inventory[].created_at When the secret was created. Null when the API does not say.
Audit
Not checked
Collected in
Audit and internal runs
Type
string, can be null

When the secret was created. Null when the API does not say.

The test account doesn't have a known value for this field.

Created by secrets.inventory[].created_by Who created the secret. Null when the API does not say.
Audit
Not checked
Collected in
Audit and internal runs
Type
string, can be null

Who created the secret. Null when the API does not say.

The test account doesn't have a known value for this field.

Environment secrets.inventory[].environment The environment the secret belongs to.
Audit
3 values match
Collected in
Audit and internal runs
Type
string

The environment the secret belongs to.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
secrets.inventory[0].environment"dev""dev"Matches
secrets.inventory[1].environment"prod""prod"Matches
secrets.inventory[2].environment"prod""prod"Matches
Keys secrets.inventory[].keys The names of the secret's keys, sorted. The collector never reads their values.
Audit
3 values match
Collected in
Audit and internal runs
Type
list of strings

The names of the secret's keys, sorted. The collector never reads their values.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
secrets.inventory[0].keys["API_KEY"]["API_KEY"]Matches
secrets.inventory[1].keys["DB_PASSWORD"]["DB_PASSWORD"]Matches
secrets.inventory[2].keys["TOKEN"]["TOKEN"]Matches
Last used at secrets.inventory[].last_used_at When the secret was last used. Null for one that has never been used.
Audit
Not checked
Collected in
Audit and internal runs
Type
string, can be null

When the secret was last used. Null for one that has never been used.

The test account doesn't have a known value for this field.

Name secrets.inventory[].name The secret's name.
Audit
3 values match
Collected in
Audit and internal runs
Type
string

The secret's name.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
secrets.inventory[0].name"api-key""api-key"Matches
secrets.inventory[1].name"db-credentials""db-credentials"Matches
secrets.inventory[2].name"stale-token""stale-token"Matches
Never used secrets.inventory[].never_used Whether the secret has never been used.
Audit
3 values match
Collected in
Audit and internal runs
Type
boolean

Whether the secret has never been used.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
secrets.inventory[0].never_usedtruetrueMatches
secrets.inventory[1].never_usedfalsefalseMatches
secrets.inventory[2].never_usedtruetrueMatches
Never used count secrets.never_used_count Secrets that have never been used.
Trust
2
Collected in
Trust, audit, and internal runs
Type
integer

Secrets that have never been used.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
secrets.never_used_count22Matches

In the test account: The daily job reads one of the three secrets. No app reads the other two.

Total count secrets.total_count Secrets across those environments.
Trust
3
Collected in
Trust, audit, and internal runs
Type
integer

Secrets across those environments.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
secrets.total_count33Matches
Service users 8 fields · 2 trust, 6 audit All 2 checked fields match
Inventory service_users.inventory Every service user, sorted by name.
Audit
No rows, as expected
Collected in
Audit and internal runs
Type
list

Every service user, sorted by name.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
service_users.inventory[0]left outleft outMatches
Created at service_users.inventory[].created_at When the service user was created. Null when the API does not say.
Audit
Not checked
Collected in
Audit and internal runs
Type
string, can be null

When the service user was created. Null when the API does not say.

The test account doesn't have a known value for this field.

Created by service_users.inventory[].created_by Who created the service user. Null when the API does not say.
Audit
Not checked
Collected in
Audit and internal runs
Type
string, can be null

Who created the service user. Null when the API does not say.

The test account doesn't have a known value for this field.

Last used at service_users.inventory[].last_used_at When the service user was last used. Null for one that has never been used.
Audit
Not checked
Collected in
Audit and internal runs
Type
string, can be null

When the service user was last used. Null for one that has never been used.

The test account doesn't have a known value for this field.

Name service_users.inventory[].name The service user's name.
Audit
Not checked
Collected in
Audit and internal runs
Type
string

The service user's name.

The test account doesn't have a known value for this field.

Never used service_users.inventory[].never_used Whether the service user has never been used.
Audit
Not checked
Collected in
Audit and internal runs
Type
boolean

Whether the service user has never been used.

The test account doesn't have a known value for this field.

Never used count service_users.never_used_count Service users that have never been used.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
integer

Service users that have never been used.

The test account doesn't have a known value for this field.

Total count service_users.total_count Service users in the workspace.
Trust
0
Collected in
Trust, audit, and internal runs
Type
integer

Service users in the workspace.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
service_users.total_count00Matches

In the test account: Starter has no service users.

Workspace 2 fields · from trust Checked field matches
ID workspace.id The workspace's ID.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The workspace's ID.

The test account doesn't have a known value for this field.

Name workspace.name The workspace's name.
Trust
Matches, value withheld
Collected in
Trust, audit, and internal runs
Type
string

The workspace's name.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
workspace.namewithheldwithheldMatches

Run details modal.collector-result.json

The status of each run, and any value it couldn't read and why.

General 1 field · from trust Not checked
Checks dropped checks_dropped Number of findings left out after the first 100.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
integer

Number of findings left out after the first 100.

The test account doesn't have a known value for this field.

Calls 30 fields · 7 trust, 23 audit Not checked
Attempts calls.operations[].attempts Number of requests sent, including retries. Present at the audit and internal levels only.
Audit
Not checked
Collected in
Audit and internal runs
Type
integer

Number of requests sent, including retries. Present at the audit and internal levels only.

The test account doesn't have a known value for this field.

Calls calls.operations[].calls Number of times the collector made the call, not counting retries. Present at the audit and internal levels only.
Audit
Not checked
Collected in
Audit and internal runs
Type
integer

Number of times the collector made the call, not counting retries. Present at the audit and internal levels only.

The test account doesn't have a known value for this field.

Deprecation calls.operations[].deprecation The Deprecation header from the vendor's most recent response that carried one.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The Deprecation header from the vendor's most recent response that carried one.

The test account doesn't have a known value for this field.

Error codes calls.operations[].error_codes The codes of the operation's failed attempts, without their counts.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
list

The codes of the operation's failed attempts, without their counts.

The test account doesn't have a known value for this field.

Errors calls.operations[].errors Number of failed attempts per code. Present at the audit and internal levels only.
Audit
Not checked
Collected in
Audit and internal runs
Type
object

Number of failed attempts per code. Present at the audit and internal levels only.

The test account doesn't have a known value for this field.

Name calls.operations[].name The operation's name, such as okta.users.list.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The operation's name, such as okta.users.list.

The test account doesn't have a known value for this field.

Permission calls.operations[].permission The permission the call needs, in the vendor's terms. The collector declares it with Operation.Permission. A permission_denied gap from t...
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The permission the call needs, in the vendor's terms. The collector declares it with Operation.Permission. A permission_denied gap from the call records it as its missing_permission.

The test account doesn't have a known value for this field.

Retried calls.operations[].retried True when a request for the operation was a retry.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
boolean

True when a request for the operation was a retry.

The test account doesn't have a known value for this field.

Retries calls.operations[].retries Number of requests that were retries. Present at the audit and internal levels only.
Audit
Not checked
Collected in
Audit and internal runs
Type
integer

Number of requests that were retries. Present at the audit and internal levels only.

The test account doesn't have a known value for this field.

Status codes calls.operations[].status_codes The HTTP status codes, or DNS response codes for a lookup, that the operation's responses had, without their counts.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
list of strings

The HTTP status codes, or DNS response codes for a lookup, that the operation's responses had, without their counts.

The test account doesn't have a known value for this field.

Statuses calls.operations[].statuses Number of responses per HTTP status code, or per DNS response code for a lookup. Present at the audit and internal levels only.
Audit
Not checked
Collected in
Audit and internal runs
Type
object

Number of responses per HTTP status code, or per DNS response code for a lookup. Present at the audit and internal levels only.

The test account doesn't have a known value for this field.

Sunset calls.operations[].sunset The Sunset header from the vendor's most recent response that carried one.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The Sunset header from the vendor's most recent response that carried one.

The test account doesn't have a known value for this field.

Problem requests dropped calls.problem_requests_dropped Number of the rows left out whose attempt failed or was a retry. Present wherever the rows are; 0 means every failed or retried request h...
Audit
Not checked
Collected in
Audit and internal runs
Type
integer

Number of the rows left out whose attempt failed or was a retry. Present wherever the rows are; 0 means every failed or retried request has a row.

The test account doesn't have a known value for this field.

Attempt calls.requests[].attempt Which attempt the request was: 1 for the first, higher for a retry.
Audit
Not checked
Collected in
Audit and internal runs
Type
integer

Which attempt the request was: 1 for the first, higher for a retry.

The test account doesn't have a known value for this field.

Call calls.requests[].call The call's number in the run, counting from 1 in the order calls start. Every attempt of one call has the same number.
Audit
Not checked
Collected in
Audit and internal runs
Type
integer

The call's number in the run, counting from 1 in the order calls start. Every attempt of one call has the same number.

The test account doesn't have a known value for this field.

Duration ms calls.requests[].duration_ms How long the request took, in milliseconds.
Audit
Not checked
Collected in
Audit and internal runs
Type
integer

How long the request took, in milliseconds.

The test account doesn't have a known value for this field.

Error calls.requests[].error The code for a request that failed. Absent when it succeeded.
Audit
Not checked
Collected in
Audit and internal runs
Type
value

The code for a request that failed. Absent when it succeeded.

The test account doesn't have a known value for this field.

Host calls.requests[].host The request's host, the name a DNS lookup queried, or the host dialed.
Audit
Not checked
Collected in
Audit and internal runs
Type
string

The request's host, the name a DNS lookup queried, or the host dialed.

The test account doesn't have a known value for this field.

Method calls.requests[].method The HTTP method, DNS and the record type looked up, such as DNS TXT, or DIAL.
Audit
Not checked
Collected in
Audit and internal runs
Type
string

The HTTP method, DNS and the record type looked up, such as DNS TXT, or DIAL.

The test account doesn't have a known value for this field.

Operation calls.requests[].operation The operation the request belongs to.
Audit
Not checked
Collected in
Audit and internal runs
Type
string

The operation the request belongs to.

The test account doesn't have a known value for this field.

Query keys calls.requests[].query_keys Names of the request's query parameters. Their values are not recorded.
Audit
Not checked
Collected in
Audit and internal runs
Type
list of strings

Names of the request's query parameters. Their values are not recorded.

The test account doesn't have a known value for this field.

Rcode calls.requests[].rcode DNS lookups only: the response code. A lookup that got no response has none.
Audit
Not checked
Collected in
Audit and internal runs
Type
value

DNS lookups only: the response code. A lookup that got no response has none.

The test account doesn't have a known value for this field.

Request ID calls.requests[].request_id The vendor's request ID from the response headers, when it sent one.
Audit
Not checked
Collected in
Audit and internal runs
Type
string

The vendor's request ID from the response headers, when it sent one.

The test account doesn't have a known value for this field.

Route calls.requests[].route HTTP requests only.
Audit
Not checked
Collected in
Audit and internal runs
Type
string

HTTP requests only.

The test account doesn't have a known value for this field.

Start ms calls.requests[].start_ms When the attempt was sent, in milliseconds after the run's started_at.
Audit
Not checked
Collected in
Audit and internal runs
Type
integer

When the attempt was sent, in milliseconds after the run's started_at.

The test account doesn't have a known value for this field.

Status calls.requests[].status The response's HTTP status code. Absent when no response arrived.
Audit
Not checked
Collected in
Audit and internal runs
Type
integer

The response's HTTP status code. Absent when no response arrived.

The test account doesn't have a known value for this field.

Step calls.requests[].step The step the call was made in. Absent for a call made outside every step.
Audit
Not checked
Collected in
Audit and internal runs
Type
string

The step the call was made in. Absent for a call made outside every step.

The test account doesn't have a known value for this field.

Vendor code calls.requests[].vendor_code The vendor's own error code from a failed response, such as E0000047. Never the vendor's message. Absent for collectors that do not read...
Audit
Not checked
Collected in
Audit and internal runs
Type
string

The vendor's own error code from a failed response, such as E0000047. Never the vendor's message. Absent for collectors that do not read one.

The test account doesn't have a known value for this field.

Waited ms calls.requests[].waited_ms On a retry, how long the SDK waited before sending it: the Retry-After value, the rate limit reset, or its own backoff. Absent on a first...
Audit
Not checked
Collected in
Audit and internal runs
Type
integer

On a retry, how long the SDK waited before sending it: the Retry-After value, the rate limit reset, or its own backoff. Absent on a first attempt and on a retry sent at once.

The test account doesn't have a known value for this field.

Requests dropped calls.requests_dropped Number of request rows left out.
Audit
Not checked
Collected in
Audit and internal runs
Type
integer

Number of request rows left out.

The test account doesn't have a known value for this field.

Checks 5 fields · from trust Checked field matches
Checks checks The first 100 findings of the output checks the SDK runs on each artifact it writes. Absent when there are none.
Trust
Left out, as expected
Collected in
Trust, audit, and internal runs
Type
list

The first 100 findings of the output checks the SDK runs on each artifact it writes. Absent when there are none.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
checksleft outleft outMatches
Check checks[].check schema, schema_unusable, population, nulls, rollups, ratios, guidance, or levels.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

schema, schema_unusable, population, nulls, rollups, ratios, guidance, or levels.

The test account doesn't have a known value for this field.

Message checks[].message What the check found.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

What the check found.

The test account doesn't have a known value for this field.

Path checks[].path The artifact the finding is about. A schema_unusable finding has none.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The artifact the finding is about. A schema_unusable finding has none.

The test account doesn't have a known value for this field.

Pointer checks[].pointer JSON pointer to the value the finding is about.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

JSON pointer to the value the finding is about.

The test account doesn't have a known value for this field.

Choice 6 fields · from trust Not checked
Consequence gaps[].choice.options[].consequence What happens if the customer picks the option, including its cost and what stays Not collected.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

What happens if the customer picks the option, including its cost and what stays Not collected.

The test account doesn't have a known value for this field.

Label gaps[].choice.options[].label
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The test account doesn't have a known value for this field.

Question gaps[].choice.question
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The test account doesn't have a known value for this field.

Consequence warnings[].choice.options[].consequence What happens if the customer picks the option, including its cost and what stays Not collected.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

What happens if the customer picks the option, including its cost and what stays Not collected.

The test account doesn't have a known value for this field.

Label warnings[].choice.options[].label
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The test account doesn't have a known value for this field.

Question warnings[].choice.question
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The test account doesn't have a known value for this field.

Collect 3 fields · from trust Not checked
Left out collect.left_out Each kind the collector could write that the key left out. Each has a not_shared gap.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
list of strings

Each kind the collector could write that the key left out. Each has a not_shared gap.

The test account doesn't have a known value for this field.

Listed collect.listed The kinds of evidence the collect config key listed, such as cloud-posture.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
list of strings

The kinds of evidence the collect config key listed, such as cloud-posture.

The test account doesn't have a known value for this field.

Unmatched collect.unmatched Each kind the key listed that the run never wrote, such as a misspelled one.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
list of strings

Each kind the key listed that the run never wrote, such as a misspelled one.

The test account doesn't have a known value for this field.

Collector 3 fields · from trust Checked field matches
Commit collector.commit The source commit the collector was built from. Absent when the build set none.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The source commit the collector was built from. Absent when the build set none.

The test account doesn't have a known value for this field.

Name collector.name The collector's name, as its spec declares it.
Trust
modal
Collected in
Trust, audit, and internal runs
Type
string

The collector's name, as its spec declares it.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
collector.name"modal""modal"Matches
Version collector.version The collector's version, such as v0.3.0. Absent when the build set none.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The collector's version, such as v0.3.0. Absent when the build set none.

The test account doesn't have a known value for this field.

Gaps 18 fields · 13 trust, 5 audit Checked field matches
Gaps gaps One entry per value the collector left out of an artifact, and why.
Trust
No rows, as expected
Collected in
Trust, audit, and internal runs
Type
list

One entry per value the collector left out of an artifact, and why.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
gaps[0]left outleft outMatches
Call gaps[].call The number of that call, matching the call on its request rows. A partial gap names the first failed call among those it counts. Present...
Audit
Not checked
Collected in
Audit and internal runs
Type
integer

The number of that call, matching the call on its request rows. A partial gap names the first failed call among those it counts. Present at the audit and internal levels only.

The test account doesn't have a known value for this field.

Code gaps[].code Why the value was left out: auth_failed, permission_denied, config_invalid, not_licensed, unsupported, not_read, rate_limited, vendor_err...
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
value

Why the value was left out: auth_failed, permission_denied, config_invalid, not_licensed, unsupported, not_read, rate_limited, vendor_error, timeout, invalid_response, too_large, internal, or not_shared. unsupported means the vendor does not report the value. too_large means the vendor holds more than the collector reads. not_shared means the customer left it out of this pack with the collect config key.

The test account doesn't have a known value for this field.

Detail gaps[].detail Present at the audit and internal levels only.
Audit
Not checked
Collected in
Audit and internal runs
Type
string

Present at the audit and internal levels only.

The test account doesn't have a known value for this field.

Fix gaps[].fix The one instruction that fixes collection. It uses fixed wording plus permission, plan, and region names. A gap has at most one of fix, n...
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The one instruction that fixes collection. It uses fixed wording plus permission, plan, and region names. A gap has at most one of fix, no_action, and choice.

The test account doesn't have a known value for this field.

Missing permission gaps[].missing_permission For a permission_denied gap, the permission to grant, in the vendor's own terms, such as okta.logs.read.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

For a permission_denied gap, the permission to grant, in the vendor's own terms, such as okta.logs.read.

The test account doesn't have a known value for this field.

No action gaps[].no_action True when nothing needs changing now. It does not clear the gap.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
boolean

True when nothing needs changing now. It does not clear the gap.

The test account doesn't have a known value for this field.

Operation gaps[].operation The operation whose failed call left the value out. Absent when no call's error caused the gap, such as for a feature the plan lacks.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The operation whose failed call left the value out. Absent when no call's error caused the gap, such as for a feature the plan lacks.

The test account doesn't have a known value for this field.

Owner gaps[].owner Who can act on the code: customer, nobody for an expected gap such as a feature the plan lacks, vendor, vendor_or_runner, or publisher.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
value

Who can act on the code: customer, nobody for an expected gap such as a feature the plan lacks, vendor, vendor_or_runner, or publisher.

The test account doesn't have a known value for this field.

Path gaps[].path The artifact the value belongs in. Absent when the run wrote no such artifact, in which case schema names it.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The artifact the value belongs in. Absent when the run wrote no such artifact, in which case schema names it.

The test account doesn't have a known value for this field.

Pointer gaps[].pointer JSON pointer to the value within the artifact. Items are addressed by array index.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

JSON pointer to the value within the artifact. Items are addressed by array index.

The test account doesn't have a known value for this field.

Schema gaps[].schema The schema of the artifact the value belongs in, when the run wrote no such artifact.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The schema of the artifact the value belongs in, when the run wrote no such artifact.

The test account doesn't have a known value for this field.

Scope gaps[].scope The account, tenant, or region affected. Present at the audit and internal levels only.
Audit
Not checked
Collected in
Audit and internal runs
Type
string

The account, tenant, or region affected. Present at the audit and internal levels only.

The test account doesn't have a known value for this field.

Source gaps[].source The file and line in the collector's own source that recorded the gap, relative to its module root, such as internal/collector/system_log...
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The file and line in the collector's own source that recorded the gap, relative to its module root, such as internal/collector/system_log.go:155.

The test account doesn't have a known value for this field.

Status gaps[].status not_collected when the collector could not read the value. partial when a rollup was left out because some of the items it covers could n...
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
value

not_collected when the collector could not read the value. partial when a rollup was left out because some of the items it covers could not be read, or when a list or object holds only the items that could be.

The test account doesn't have a known value for this field.

Unmeasured gaps[].unmeasured For a partial gap, the number of items that could not be read. Present at the audit and internal levels only.
Audit
Not checked
Collected in
Audit and internal runs
Type
integer

For a partial gap, the number of items that could not be read. Present at the audit and internal levels only.

The test account doesn't have a known value for this field.

Vendor code gaps[].vendor_code The vendor's own error code, when its response included one.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The vendor's own error code, when its response included one.

The test account doesn't have a known value for this field.

Warning gaps[].warning The collector's message to the operator about the gap, redacted. Present at the audit and internal levels only.
Audit
Not checked
Collected in
Audit and internal runs
Type
string

The collector's message to the operator about the gap, redacted. Present at the audit and internal levels only.

The test account doesn't have a known value for this field.

Operations 2 fields · 1 trust, 1 audit Not checked
Calls steps[].operations[].calls Its calls in the step. Present at the audit and internal levels only.
Audit
Not checked
Collected in
Audit and internal runs
Type
integer

Its calls in the step. Present at the audit and internal levels only.

The test account doesn't have a known value for this field.

Name steps[].operations[].name The operation.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The operation.

The test account doesn't have a known value for this field.

Outcome 3 fields · from trust Not checked
Code outcome.code For a partial run, the code of the first gap other than a not_shared, unsupported, or not_read one, saying why its value was left out.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
value

For a partial run, the code of the first gap other than a not_shared, unsupported, or not_read one, saying why its value was left out.

The test account doesn't have a known value for this field.

Owner outcome.owner For a partial run, who can act on that code.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
value

For a partial run, who can act on that code.

The test account doesn't have a known value for this field.

Status outcome.status collected when the run read every value its level collects, or partial when it left values out. gaps lists each one. A not_shared or unsu...
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
value

collected when the run read every value its level collects, or partial when it left values out. gaps lists each one. A not_shared or unsupported gap does not make a run partial.

The test account doesn't have a known value for this field.

Run 6 fields · from trust Not checked
Custom ca run.custom_ca True when SSL_CERT_FILE or SSL_CERT_DIR was set for the run.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
boolean

True when SSL_CERT_FILE or SSL_CERT_DIR was set for the run.

The test account doesn't have a known value for this field.

Finished at run.finished_at When the run finished, in RFC 3339 UTC.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

When the run finished, in RFC 3339 UTC.

The test account doesn't have a known value for this field.

Level run.level The level the run collected at, at every level. A reader uses it to tell a value the level left out from one the collector could not read...
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The level the run collected at, at every level. A reader uses it to tell a value the level left out from one the collector could not read. Absent from results of older SDKs.

The test account doesn't have a known value for this field.

Proxy run.proxy True when a proxy variable such as HTTPS_PROXY was set for the run.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
boolean

True when a proxy variable such as HTTPS_PROXY was set for the run.

The test account doesn't have a known value for this field.

Run ID run.run_id The run ID the runner passed in EPACK_RUN_ID. Absent when it passed none.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The run ID the runner passed in EPACK_RUN_ID. Absent when it passed none.

The test account doesn't have a known value for this field.

Started at run.started_at When the run started, in RFC 3339 UTC.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

When the run started, in RFC 3339 UTC.

The test account doesn't have a known value for this field.

Signed in as 8 fields · 6 trust, 2 audit All 3 checked fields match
Auth method signed_in_as.auth_method How the collector proved its identity, such as private_key_jwt for OAuth 2.0 client credentials with a signed key assertion or api_token...
Trust
api_token
Collected in
Trust, audit, and internal runs
Type
string

How the collector proved its identity, such as private_key_jwt for OAuth 2.0 client credentials with a signed key assertion or api_token for an API token.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
signed_in_as.auth_method"api_token""api_token"Matches
ID signed_in_as.id Present at the audit and internal levels only.
Audit
Not checked
Collected in
Audit and internal runs
Type
string

Present at the audit and internal levels only.

The test account doesn't have a known value for this field.

Kind signed_in_as.kind The kind of principal, such as service_app, service_principal, or user.
Trust
user
Collected in
Trust, audit, and internal runs
Type
string

The kind of principal, such as service_app, service_principal, or user.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
signed_in_as.kind"user""user"Matches
Provider signed_in_as.provider The identity system, such as okta or microsoft-entra.
Trust
modal
Collected in
Trust, audit, and internal runs
Type
string

The identity system, such as okta or microsoft-entra.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
signed_in_as.provider"modal""modal"Matches
Read only signed_in_as.read_only Present when the collector can show that its credential could only read.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
value

Present when the collector can show that its credential could only read.

The test account doesn't have a known value for this field.

Requested scopes signed_in_as.requested_scopes The scopes the collector asked for. A scope here and missing from scopes was not granted.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
list of strings

The scopes the collector asked for. A scope here and missing from scopes was not granted.

The test account doesn't have a known value for this field.

Scopes signed_in_as.scopes The permissions the sign-in carried.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
list of strings

The permissions the sign-in carried.

The test account doesn't have a known value for this field.

Tenant ID signed_in_as.tenant_id The tenant, account, or organization signed in to. Present at the audit and internal levels only.
Audit
Not checked
Collected in
Audit and internal runs
Type
string

The tenant, account, or organization signed in to. Present at the audit and internal levels only.

The test account doesn't have a known value for this field.

Steps 10 fields · 4 trust, 6 audit All 2 checked fields match
Steps steps The named parts of the run, in the order they started, at every level. Absent when the collector opens none.
Trust
No more than 5 rows
Collected in
Trust, audit, and internal runs
Type
list

The named parts of the run, in the order they started, at every level. Absent when the collector opens none.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
steps[5]left outleft outMatches
Any failed steps[].any_failed True when an attempt in the step failed: one with an error code or a status of 400 or more.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
boolean

True when an attempt in the step failed: one with an error code or a status of 400 or more.

The test account doesn't have a known value for this field.

Calls steps[].calls The calls those requests belong to. Present at the audit and internal levels only.
Audit
Not checked
Collected in
Audit and internal runs
Type
integer

The calls those requests belong to. Present at the audit and internal levels only.

The test account doesn't have a known value for this field.

End ms steps[].end_ms When the step ended, in milliseconds after the run's started_at. A step still open when the collector emitted ended then. Present at the...
Audit
Not checked
Collected in
Audit and internal runs
Type
integer

When the step ended, in milliseconds after the run's started_at. A step still open when the collector emitted ended then. Present at the audit and internal levels only.

The test account doesn't have a known value for this field.

Failed steps[].failed The attempts that failed: those with an error code or a status of 400 or more. Present at the audit and internal levels only.
Audit
Not checked
Collected in
Audit and internal runs
Type
integer

The attempts that failed: those with an error code or a status of 400 or more. Present at the audit and internal levels only.

The test account doesn't have a known value for this field.

Name steps[].name The step's name, such as people. Step names are part of the collector's contract, like operation names.
Trust
5 values match
Collected in
Trust, audit, and internal runs
Type
string

The step's name, such as people. Step names are part of the collector's contract, like operation names.

Modal · audit run · v0.1.0 · Nov 7, 2026

PathExpectedReportedResult
steps[0].name"sign_in""sign_in"Matches
steps[1].name"members""members"Matches
steps[2].name"environments""environments"Matches
steps[3].name"tokens""tokens"Matches
steps[4].name"workloads""workloads"Matches
Requests steps[].requests The requests sent in the step, including rows left out of calls.requests. Present at the audit and internal levels only.
Audit
Not checked
Collected in
Audit and internal runs
Type
integer

The requests sent in the step, including rows left out of calls.requests. Present at the audit and internal levels only.

The test account doesn't have a known value for this field.

Retries steps[].retries The requests that were retries. Present at the audit and internal levels only.
Audit
Not checked
Collected in
Audit and internal runs
Type
integer

The requests that were retries. Present at the audit and internal levels only.

The test account doesn't have a known value for this field.

Start ms steps[].start_ms When the step started, in milliseconds after the run's started_at. Present at the audit and internal levels only.
Audit
Not checked
Collected in
Audit and internal runs
Type
integer

When the step started, in milliseconds after the run's started_at. Present at the audit and internal levels only.

The test account doesn't have a known value for this field.

Title steps[].title The step's title, such as People and sign-in methods.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The step's title, such as People and sign-in methods.

The test account doesn't have a known value for this field.

Unrecognized 3 fields · 2 trust, 1 audit Not checked
Count unrecognized[].count How many distinct values the run read that the vocabulary lacks.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
integer

How many distinct values the run read that the vocabulary lacks.

The test account doesn't have a known value for this field.

Values unrecognized[].values The first 50 of those values, sorted. Present at the audit and internal levels only.
Audit
Not checked
Collected in
Audit and internal runs
Type
list of strings

The first 50 of those values, sorted. Present at the audit and internal levels only.

The test account doesn't have a known value for this field.

Vocabulary unrecognized[].vocabulary The vocabulary's name, such as okta.event_types.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The vocabulary's name, such as okta.event_types.

The test account doesn't have a known value for this field.

Warnings 5 fields · 3 trust, 2 audit Not checked
Fix warnings[].fix The one instruction that fixes collection. A warning has at most one of fix, no_action, and choice.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The one instruction that fixes collection. A warning has at most one of fix, no_action, and choice.

The test account doesn't have a known value for this field.

Message warnings[].message The collector's message about what happened. Present at the audit and internal levels only.
Audit
Not checked
Collected in
Audit and internal runs
Type
string

The collector's message about what happened. Present at the audit and internal levels only.

The test account doesn't have a known value for this field.

Missing permission warnings[].missing_permission The permission to grant, in the vendor's own terms.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
string

The permission to grant, in the vendor's own terms.

The test account doesn't have a known value for this field.

No action warnings[].no_action True when nothing needs changing now.
Trust
Not checked
Collected in
Trust, audit, and internal runs
Type
boolean

True when nothing needs changing now.

The test account doesn't have a known value for this field.

Scope warnings[].scope The account, tenant, or region affected. Present at the audit and internal levels only.
Audit
Not checked
Collected in
Audit and internal runs
Type
string

The account, tenant, or region affected. Present at the audit and internal levels only.

The test account doesn't have a known value for this field.

Foundational Controls

The controls that read this collector's evidence.

Details

Publisher
locktivity
Latest
v0.2.0
Protocol
v1

Platforms

darwin/amd64 darwin/arm64 linux/amd64 linux/arm64

Links