Skip to main content
Version: Next

CLI Reference

Global

o2idctl <command>
CommandAliases
init
config
login
usersuser
applicationsapplication, apps, app
rolesrole
agentsagent
resource-serversresource-server, resourceservers, resourceserver
connectionsconnection
authenticatorsauthenticator
flowsflow
logslog
export
import
help-h, --help
version--version

init

Guided first-time setup — walks through the same steps as config add, config use, and login in one narrated flow, for someone connecting o2idctl to an O2ID instance for the first time.

o2idctl init

Prompts:

PromptDefaultDescription
API base URLhttp://localhost:8080Base URL for an O2ID API instance
Profile namelocalName used later with o2idctl config use <profile>
Log in now via your browser?YRuns the same browser login login does

Unlike config add, init always activates the profile it creates for the current terminal session — there's no "is this your first profile?" check, since the whole point of init is setting one up. Run config add (not init again) when you want to add another profile later.

config add

Interactively creates a saved profile with an API base URL and name.

o2idctl config add

Prompts:

PromptDefaultDescription
API base URLhttp://localhost:8080Base URL for an O2ID API instance, optionally with a tenant
Profile namelocalName used later with o2idctl config use <profile>

Press enter at either prompt to accept the default shown in brackets. If this is the first profile you've saved, it also asks whether to use it as the current terminal session's default — the same selection config use makes.

API base URL accepts a tenant appended as /t/{tenant}http://localhost:8080 targets the system tenant (the default), while http://localhost:8080/t/acme targets acme. Every root tenant needs its own separate login — there's no shared credential across tenants, even on the same O2ID instance — so targeting a second tenant means adding a second profile with that tenant in its API base URL, the same way targeting a second instance does. See Multi-Tenancy.

config list

Lists every saved profile (name, API base URL, tenant, whether it holds credentials, and whether it's the active profile for this terminal session), along with the resolved config directory ($O2IDCTL_CONFIG_DIR, or o2id under your OS's user config directory by default).

o2idctl config list

config get

Shows one profile's details.

o2idctl config get <profile>

config update

Interactively updates a profile's API base URL (and, with it, the tenant — see config add above), defaulting to its current value.

o2idctl config update <profile>

config delete

Removes a saved profile. If the current terminal session had it selected, the selection is cleared.

o2idctl config delete <profile>

config use

Selects a saved profile for the current terminal session.

o2idctl config use <profile>

login

Logs in via the device authorization grant: prints a code and a URL, then polls until you approve it in a browser (on this device or another one) — and stores the resulting access and refresh tokens on the currently-selected profile. Every other command requires this to have been run at least once — see Using o2idctl for the full login flow and the API Reference for how roles/scopes gate each endpoint.

o2idctl login

Users

Every users command below requires the users:read, users:create, users:update, or users:delete scope, depending on the operation.

users create

Creates a new user. Which attributes are valid, and which are required, comes from the user's type — there's no fixed --email flag.

o2idctl users create [--user-type <type>] --attribute <key=value> [--attribute <key=value> ...] [--display-name <name>] [--password <password>]
OptionRequiredDescription
--user-type <type>NoKey of the user type this user belongs to. Defaults to the built-in user type
--attribute <key=value>NoAn attribute value, keyed by the user type's schema. Repeatable
--display-name <name>NoUser display name
--password <password>NoUser password

users get

Fetches a single user by its internal ID.

o2idctl users get <id>

users list

Lists all users.

o2idctl users list

users update

Updates a user, addressed by its internal ID. Requires the users:update scope. --display-name and --user-type are independently optional — omit either to leave it unchanged. --attribute behaves differently: supplying any --attribute replaces the entire attribute map with just what was passed on this call, so omitted attributes are dropped rather than preserved — include every attribute you want to keep, not just the one you're changing.

o2idctl users update <id> [--display-name <name>] [--user-type <type>] [--attribute <key=value> ...]
OptionRequiredDescription
--display-name <name>NoReplacement display name. Left unchanged if omitted
--user-type <type>NoReplacement user type key. Left unchanged if omitted
--attribute <key=value>NoAn attribute value, repeatable. If passed at all, replaces the entire attribute set

users delete

Permanently deletes a user, addressed by its internal ID. Requires the users:delete scope. This cannot be undone.

o2idctl users delete <id>

users set-password

Sets a user's password, addressed by its internal ID. Requires the users:update-credentials scope.

o2idctl users set-password <id> --password <password>
OptionRequiredDescription
--password <password>YesReplacement password. Takes effect immediately — the user's existing sessions and tokens are unaffected, but the new password is required for the next login

users authenticator-enrollments

Lists a user's authenticator enrollments.

o2idctl users authenticator-enrollments <id>

users enroll-authenticator

Creates a TOTP enrollment for a user and returns setup material (an otpauthUrl/secret to show the user in your own enrollment UI). Verifying the enrollment with a code needs the user's own authenticator app in the moment, so it isn't a CLI command — call POST /users/{id}/authenticator-enrollments/{enrollmentId}/verify directly from whatever collected the code (see the API Reference).

o2idctl users enroll-authenticator <id> --authenticator <authenticator-id>

users assign

Assigns a role to a user. Assigning a role the user already holds is a no-op. Requires the roles:assign scope.

o2idctl users assign --user <userId> --role <roleId>
OptionRequiredDescription
--user <userId>YesInternal user ID
--role <roleId>YesInternal role ID

users unassign

Removes a role from a user. Unassigning a role the user doesn't hold is a no-op. Requires the roles:assign scope.

o2idctl users unassign --user <userId> --role <roleId>
OptionRequiredDescription
--user <userId>YesInternal user ID
--role <roleId>YesInternal role ID

User Types

Every user-types command below requires the users:read, users:create, or users:update scope, depending on the operation. See User types for the full field-schema model.

user-types create

Creates a new user type.

o2idctl user-types create --key <key> --username-field <field> --field <key:type[:required][:opt1,opt2]> [--field ...]
OptionRequiredDescription
--key <key>YesUnique key identifying this type
--username-field <field>YesName of the field O2ID resolves as the login identifier
--field <spec>YesA field declaration: key:type[:required][:opt1,opt2]. type is one of string, number, bool, select, email, username. Repeatable

user-types get

Fetches a single user type by its key.

o2idctl user-types get <key>

user-types list

Lists all user types, including the built-in user type.

o2idctl user-types list

user-types update

Updates a user type's field schema, addressed by its key. --username-field can't be changed once a type is created.

o2idctl user-types update <key> --field <spec> [--field ...]
OptionRequiredDescription
--field <spec>YesA field declaration, same syntax as create. Repeatable. If passed at all, replaces the entire schema — a call that omits the username field fails validation, so re-list every field you want to keep

user-types delete

Deletes a user type. Rejected if any user is still assigned this type; the built-in user type can never be deleted.

o2idctl user-types delete <key>

Applications

Every applications command below requires the applications:read, applications:create, applications:update, or applications:delete scope, depending on the operation.

applications create

Registers a new OAuth 2.0 client application. Confidential unless --public is passed.

o2idctl applications create --name <name> [--public] [--callback-url <url> ...] [--scope <scope> ...] [--api <resource-server-identifier> [--scope <scope> ...] ...] [--trusted] [--access-token-lifetime <duration> ...]
OptionRequiredDescription
--name <name>YesApplication name
--publicNoCreates a public client (no client secret) instead of the default confidential one
--callback-url <url>NoOAuth redirect URI. Repeat for multiple callback URLs
--scope <scope>NoRBAC scope this application's tokens may carry. Repeat for multiple scopes. Omit for none (deny-by-default). Only applies when it appears before any --api — shorthand for --api o2id-management-api
--api <resource-server-identifier>NoAuthorizes this application against a resource server, by its identifier (not internal ID). Repeat for multiple resource servers
--scope <scope> (after --api)NoScope to grant on the most recent --api. Repeat for multiple scopes on that resource server
--trustedNoMarks the application first-party, skipping the user consent screen. Omit for third-party (consent required)
--access-token-lifetime <duration>NoAccess token lifetime override, e.g. 5m
--refresh-token-lifetime <duration>NoRefresh token lifetime override, e.g. 720h
--authorization-code-lifetime <duration>NoAuthorization code lifetime override
--session-lifetime <duration>NoSession lifetime override
--login-transaction-lifetime <duration>NoLogin transaction lifetime override
--consent-transaction-lifetime <duration>NoConsent transaction lifetime override

See Application settings for the built-in defaults and how 0/inherit clears an override.

applications get

Fetches a single application by its internal ID.

o2idctl applications get <id>

applications list

Lists all registered applications.

o2idctl applications list

applications update

Updates an application's details such as name, callback URLs, etc. Any field you omit is left unchanged.

o2idctl applications update <id> [--name <name>] [--callback-url <url> ...] [--scope <scope> ...] [--regenerate-secret|--public] [--trusted|--untrusted] [--access-token-lifetime <duration>|inherit ...]
OptionRequiredDescription
--name <name>NoReplacement application name
--callback-url <url>NoReplacement OAuth redirect URI. Repeat for multiple callback URLs. Replaces the full list — a partial list isn't merged with the existing one
--scope <scope>NoReplacement RBAC scope. Repeat for multiple scopes. Replaces the full list — a partial list isn't merged with the existing one
--regenerate-secretNoGenerates a new client secret (returned once, in the response's clientSecret field), invalidating the old one, and makes the application confidential if it wasn't already
--publicNoClears the client secret and makes the application public
--trusted / --untrustedNoMarks the application first-party (skips consent) or third-party (consent required)
--access-token-lifetime <duration>NoAccess token lifetime override. Pass 0 or inherit to clear
--refresh-token-lifetime <duration>NoRefresh token lifetime override. Pass 0 or inherit to clear
--authorization-code-lifetime <duration>NoAuthorization code lifetime override. Pass 0 or inherit to clear
--session-lifetime <duration>NoSession lifetime override. Pass 0 or inherit to clear
--login-transaction-lifetime <duration>NoLogin transaction lifetime override. Pass 0 or inherit to clear
--consent-transaction-lifetime <duration>NoConsent transaction lifetime override. Pass 0 or inherit to clear

applications delete

Permanently deletes an application. This cannot be undone.

o2idctl applications delete <id>

applications resource-servers

Lists the resource servers an application is authorized for, and the scope subset granted on each. Requires applications:read. See Resource Servers.

o2idctl applications resource-servers <app-id>

applications authorize-resource-server

Authorizes an application to mint or introspect tokens for a resource server, granting it the given subset of that resource server's own defined scopes. Re-running this replaces any previously granted scopes for the pair, rather than merging with them. Requires applications:authorize-resource-servers.

o2idctl applications authorize-resource-server <app-id> <resource-server-identifier> [--scope <scope> ...]
OptionRequiredDescription
--scope <scope>NoOne of the resource server's own defined scopes to grant. Repeat for multiple scopes. Omit for none

applications deauthorize-resource-server

Removes an application's authorization for a resource server entirely. Requires applications:authorize-resource-servers.

o2idctl applications deauthorize-resource-server <app-id> <resource-server-identifier>

Roles

Every roles command below requires the roles:read, roles:create, roles:update, or roles:delete scope, depending on the operation. See Managing Roles for the role/scope model and the API Reference for the scope each endpoint requires.

roles create

Creates a role with a set of scopes.

o2idctl roles create --name <name> [--scope <scope> ...]
OptionRequiredDescription
--name <name>YesRole name
--scope <scope>NoScope granted by this role. Repeat for multiple scopes

roles get

Fetches a single role by its internal ID.

o2idctl roles get <id>

roles list

Lists all roles.

o2idctl roles list

roles update

Replaces an existing role's name and/or scopes.

o2idctl roles update <id> --name <name> [--scope <scope> ...]
OptionRequiredDescription
--name <name>YesReplacement role name
--scope <scope>NoReplacement scope. Repeat for multiple scopes

roles delete

Permanently deletes a role. Fails if the role is still assigned to any user.

o2idctl roles delete <id>

AI Agents

Every agents command below requires the agents:read, agents:create, agents:update, or agents:delete scope, depending on the operation. See Managing AI Agents for what an AI agent is and the API Reference for the scope each endpoint requires.

agents create

Registers a new AI agent identity with a set of allowed scopes.

o2idctl agents create --name <name> [--scope <scope> ...]
OptionRequiredDescription
--name <name>YesAI agent name
--scope <scope>NoRBAC scope this AI agent's tokens may carry. Repeat for multiple scopes. Omit for none (deny-by-default)

agents get

Fetches a single AI agent by its internal ID.

o2idctl agents get <id>

agents list

Lists all registered AI agents.

o2idctl agents list

agents update

Updates an AI agent's name, allowed scopes, and/or registered public key. A field you omit is left unchanged.

o2idctl agents update <id> [--name <name>] [--scope <scope> ...] [--public-key <path>]
OptionRequiredDescription
--name <name>NoReplacement AI agent name
--scope <scope>NoReplacement RBAC scope. Repeat for multiple scopes. Replaces the full list — a partial list isn't merged with the existing one
--public-key <path>NoPath to a JSON Web Key (RSA only) file. Registers the key this AI agent uses to authenticate itself via private_key_jwt, without a human present. There's currently no way to clear a registered key back to "none"

agents delete

Permanently deletes an AI agent. This cannot be undone.

o2idctl agents delete <id>

Resource Servers

Every resource-servers command below (aside from the scopes sub-group) requires the resourceservers:read, resourceservers:create, resourceservers:update, or resourceservers:delete scope, depending on the operation. See Resource Servers for what a resource server is and how an application gets authorized for one, and the API Reference for the scope each endpoint requires.

resource-servers create

Registers a new resource server (API). Its own scopes/permissions are managed separately — see resource-servers scopes below.

o2idctl resource-servers create --name <name> --identifier <identifier>
OptionRequiredDescription
--name <name>YesResource server name
--identifier <identifier>YesThe value callers pass as resource/audience to target this resource server

resource-servers get

Fetches a single resource server by its internal ID.

o2idctl resource-servers get <id>

resource-servers list

Lists all registered resource servers.

o2idctl resource-servers list

resource-servers update

Updates a resource server's name and/or identifier. A field you omit is left unchanged.

o2idctl resource-servers update <id> [--name <name>] [--identifier <identifier>]
OptionRequiredDescription
--name <name>NoReplacement resource server name
--identifier <identifier>NoReplacement identifier

resource-servers delete

Permanently deletes a resource server. This cannot be undone, and any application authorizations naming it become unreachable, since resolving the identifier is the first step in every check that consults them.

o2idctl resource-servers delete <id>

resource-servers scopes create

Defines a new scope/permission on a resource server. The value must be unique among that resource server's own scopes.

o2idctl resource-servers scopes create --resource-id <resource-id> --value <value> \
[--display-name <name>] [--description <text>]
OptionRequiredDescription
--resource-id <resource-id>YesThe resource server this scope belongs to
--value <value>YesThe scope itself, granted and checked exactly as written, e.g. read:messages
--display-name <name>NoHuman-readable name. Purely descriptive
--description <text>NoHuman-readable description. Purely descriptive
o2idctl resource-servers scopes create --resource-id <resource-id> \
--value read:messages --display-name "Read Messages" --description "Allows reading messages"

resource-servers scopes list

Lists the scopes a resource server defines.

o2idctl resource-servers scopes list --resource-id <resource-id>

resource-servers scopes get

Fetches a single scope by its own ID — no --resource-id needed, since a scope's ID is already globally unique.

o2idctl resource-servers scopes get <scope-id>

resource-servers scopes update

Updates a scope's value, display name, and/or description, addressed by its own ID alone. A field you omit is left unchanged. Renaming --value doesn't retroactively update any application authorization already granted under the old value — the same way renaming any OAuth scope string is a breaking change in any system.

o2idctl resource-servers scopes update <scope-id> [--value <value>] [--display-name <name>] [--description <text>]
OptionRequiredDescription
--value <value>NoReplacement scope value. Must still be unique among its resource server's other scopes
--display-name <name>NoReplacement display name
--description <text>NoReplacement description

resource-servers scopes delete

Permanently deletes a scope, addressed by its own ID alone. This cannot be undone.

o2idctl resource-servers scopes delete <scope-id>

Connections

Every connections command below requires the connections:read, connections:create, connections:update, or connections:delete scope, depending on the operation. See Managing Connections for what a connection is, and the API Reference for the scope each endpoint requires.

connections types

Lists the connection types compiled into this O2ID instance, along with each one's configSchema — which fields to pass via --field when creating a connection, and which of those are secret.

o2idctl connections types

connections create

Creates a connection: a configured, credentialed instance of a connection type.

o2idctl connections create --type <type> --name <name> [--field <key>=<value> ...] [--enabled true|false]
OptionRequiredDescription
--type <type>YesA type value from connections types
--name <name>YesConnection name, unique within the tenant
--field <key>=<value>No, repeatableOne config or secret field, per the type's configSchema. The value is parsed as JSON when possible (so --field port=8080 and --field verifyTls=true carry a number/bool, not a string), otherwise treated as a plain string
--enabled <true|false>NoDefaults to true

connections get

Fetches a single connection by its ID. Secret field values are never included in the response — only which secret keys are set.

o2idctl connections get <id>

connections list

Lists every connection in the current tenant.

o2idctl connections list

connections update

Updates a connection's name, fields, and/or enabled state. A field you omit is left unchanged; --field values are merged key-by-key into the existing field set, so rotating one secret doesn't require resubmitting every other credential.

o2idctl connections update <id> [--name <name>] [--field <key>=<value> ...] [--enabled true|false]

connections delete

Permanently deletes a connection. This cannot be undone, and any authenticator still pointing at it via connectionId will fail to resolve.

o2idctl connections delete <id>

connections test

Runs the connection type's own live validation (e.g. an authenticated no-op call to the provider) without changing anything persisted. Always returns normally — a failed check is a normal outcome reported as {"valid": false, "error": "..."}, not a CLI error.

o2idctl connections test <id>

Authenticators

Every authenticators command below requires the authenticators:read, authenticators:create, authenticators:update, or authenticators:delete scope, depending on the operation. See Managing Authenticators for what an authenticator is, and the API Reference for the scope each endpoint requires.

authenticators list types

Lists the authenticator factor types compiled into this O2ID instance, along with each one's configSchema — which fields to pass via --field when creating an authenticator, and which of those are secret.

o2idctl authenticators list types

authenticators create

Creates an authenticator: a tenant-configured instance of a factor type.

o2idctl authenticators create --type <type> --display-name <name> [--connection-id <id>] [--field <key>=<value> ...] [--enabled true|false]
OptionRequiredDescription
--type <type>YesA type value from authenticators list types
--display-name <name>YesAuthenticator display name, unique within the tenant
--connection-id <id>NoAn existing connection's ID, for delivery-based factor types (e.g. email/SMS one-time codes) that send through a connection
--field <key>=<value>No, repeatableOne config or secret field, per the type's configSchema. Parsed as JSON when possible, otherwise a plain string — same rule as connections create --field
--enabled <true|false>NoDefaults to true

authenticators get

Fetches a single authenticator by its ID. Secret field values are never included in the response — only which secret keys are set.

o2idctl authenticators get <id>

authenticators list

Lists every authenticator in the current tenant.

o2idctl authenticators list

authenticators update

Updates an authenticator's display name, connection, fields, and/or enabled state. A field you omit is left unchanged; --field values are merged key-by-key into the existing field set.

o2idctl authenticators update <id> [--display-name <name>] [--connection-id <id>] [--field <key>=<value> ...] [--enabled true|false]

authenticators delete

Permanently deletes an authenticator. This cannot be undone.

o2idctl authenticators delete <id>

Flows

Every flows authoring command below requires the flows:read, flows:create, flows:update, or flows:delete scope, depending on the operation. See Managing Flows for flow definition examples and Flow Definition Schema for the full node reference.

flows meta

Lists supported system triggers, supported node types, and condition context variables.

o2idctl flows meta

flows create

Creates a flow from a JSON definition file.

o2idctl flows create --name <name> --trigger <trigger> --definition-file <file> [--allowed-client <client_id> ...] [--disabled]

flows get

Fetches a single flow by ID.

o2idctl flows get <id>

flows list

Lists flows in the current tenant.

o2idctl flows list

flows update

Updates flow metadata or replaces the definition from a JSON file.

o2idctl flows update <id> [--name <name>] [--trigger <trigger>] [--definition-file <file>] [--allowed-client <client_id> ...] [--enabled|--disabled]

flows validate

Validates a flow definition — either one already stored under a flow ID, or one that hasn't been created yet.

o2idctl flows validate <id>
o2idctl flows validate --definition-file <file>
o2idctl flows validate --definition '<json>'

flows activate

Enables a flow and makes it the active flow for its trigger.

o2idctl flows activate <id>

o2idctl has no command to drive a flow run step by step — a flow run is meant to be driven by a real client (the login portal, or any app calling POST /flow-runs/POST /flow-runs/{id}/submit directly), not typed in one field at a time from a terminal. Use flows validate to check a definition before activating it, and the login portal (or your own OAuth client) to exercise it for real. See Flows.

Verifiable Credentials

Every verifiable-credentials command below requires the verifiablecredentials:read, verifiablecredentials:create, verifiablecredentials:update, or verifiablecredentials:delete scope, depending on the operation. See Managing Verifiable Credentials for what a verifiable credential is and its supported formats.

verifiable-credentials create

Defines a new verifiable credential.

o2idctl verifiable-credentials create --identifier <id> --name <name> --format <format> --signing-alg <alg> \
[--claim <name>[:<displayName>[:<selectivelyDisclosable>]] ...] [--enabled true|false]
OptionRequiredDescription
--identifier <id> (alias --vct)YesVerifiable credential identifier, unique per tenant — becomes the vct claim on the wire
--name <name>YesHuman-readable name
--format <format>Yesdc+sd-jwt, jwt_vc_json, or mso_mdoc (ISO 18013-5 — requires --signing-alg ES256)
--signing-alg <alg>YesRS256 or ES256
--claim <spec>No, repeatableThree colon-separated fields in order — name[:displayName[:selectivelyDisclosable]]. Leave a field empty to skip it while still setting a later one, e.g. department::true (no display name, selectively disclosable).
--enabled <bool>NoDefaults to true

verifiable-credentials get

Fetches a single verifiable credential by its internal ID.

o2idctl verifiable-credentials get <id>

verifiable-credentials list

Lists all verifiable credentials defined for the current tenant.

o2idctl verifiable-credentials list

verifiable-credentials update

Updates a verifiable credential. A field you omit is left unchanged.

o2idctl verifiable-credentials update <id> [--identifier <id>] [--name <name>] [--format <format>] \
[--signing-alg <alg>] [--enabled true|false] \
[--add-claim <name>[:<displayName>[:<selectivelyDisclosable>]] ...] \
[--remove-claim <claimId> ...] \
[--update-claim <claimId>:<name>[:<displayName>[:<selectivelyDisclosable>]] ...]

Unlike create's --claim, the three claim flags above edit the existing claim list one claim at a time instead of replacing it — existing claims you don't target with --remove-claim/--update-claim are left alone. All three are repeatable and combinable in one call; find a claim's ID via verifiable-credentials get <id>.

verifiable-credentials delete

Permanently deletes a verifiable credential. This cannot be undone.

o2idctl verifiable-credentials delete <id>

Verifiable Credential Offers

verifiable-credential-offers create requires the verifiablecredentialoffers:create scope. See Issuing Verifiable Credentials for the full OID4VCI pre-authorized_code flow this kicks off.

verifiable-credential-offers create

Creates a single-use OID4VCI pre-authorized_code offer for the calling user's own identity.

o2idctl verifiable-credential-offers create --verifiable-credential-id <id> [--claim <key>=<value> ...]
OptionRequiredDescription
--verifiable-credential-id <id>YesThe verifiable credential to issue
--claim <key>=<value>No, repeatableMust be a subset of the verifiable credential's own defined claims; parsed as JSON when valid JSON, otherwise a plain string

Prints the OID4VCI credential_offer JSON object — including the pre-authorized_code grant — for QR/deep-link display.

Config Export & Import

export requires the tenant:export scope, import the tenant:import scope. Both act on whichever tenant the selected profile targets, or O2IDCTL_TENANT for a single invocation. See Config Export & Import for what a dump contains and how references are remapped.

export

Writes the current tenant's configuration — resource servers and their scopes, roles, connections, authenticators, applications, flows and tenant settings — as one JSON document.

o2idctl export [--out dump.json] [--include-secrets [--secrets-out dump.secrets.json]]
OptionRequiredDescription
--out <file>NoWrite the dump here instead of stdout
--include-secretsNoAlso fetch connection/authenticator secrets, in plaintext, into a separate file
--secrets-out <file>NoWhere those secrets go; defaults to <out>.secrets.json. Requires --include-secrets

Secrets are excluded by default, so the dump is safe to commit. With --include-secrets you must give --out or --secrets-out: plaintext secrets are never written to stdout alongside the dump. Application client secrets can never be exported — only their hash is stored.

import

Re-creates an exported configuration in the current tenant, which must already exist. The whole import runs as one transaction: if anything fails, nothing is created.

o2idctl import --in dump.json [--secrets dump.secrets.json] [--on-conflict fail|skip|overwrite]
OptionRequiredDescription
--in <file>YesThe dump written by export
--secrets <file>NoThe secrets file written by export --include-secrets
--on-conflict <policy>Nofail (default), skip, or overwrite when a resource already exists in the target

Prints per-resource-type counts and the old-to-new ID mapping, plus the client secret of every application it created (the only time those are ever shown), any connection whose credentials the dump couldn't carry, and any flow that doesn't validate yet — those are imported inactive.