Skip to content
Akedly
Command reference

Core, login and configuration

Akedly CLI command reference: Core, login and configuration.

login

Authorize this workstation to act through a chosen Akedly account without putting a password in a terminal.

When to use

  • Use before account-scoped CLI work, or after a login expires.

How it works

  1. Creates a short-lived device request, asks the user to approve the displayed code in the dashboard, polls until approved and saves the returned CLI credential locally. It reads identity and access level with the new login before ending the previous stored login; if identity cannot be read, it still succeeds, keeps the previous login and writes an identity_unavailable notice to stderr. credentialStorage says where the credential is kept: a 0600 file path, or the OS keychain when the optional adapter is installed.

Expected outcome

A confirmed login summary is returned and the credential is stored for that region.

Next steps

  • Use whoami to confirm access; logout ends this credential.

Usage

sh
akedly login

Inspect this command offline before preparing an operation:

sh
akedly describe "login" --output json

Flags

FlagTypeEnum / rangeDescription
--ksaboolean switch—Select the KSA deployment.
--openboolean switch—Command-specific option; see the full command details below.
--timeoutseconds—Command-specific option; see the full command details below.
--machine-nametext—Command-specific option; see the full command details below. Manifest body field: machineName.
--dry-runboolean switch—Preview without sending the write or creating output files; planning reads may still occur. Bypass consent.
--helpboolean switch—Show offline command help.
--outputenumjson | humanSelect JSON or human output.
--fieldsdot-paths—Select comma-separated safe dot paths; apply to each element of a root array.

Authentication, permission and guards

Auth: public. Permission: none declared.

Server request: POST /cli/login-requests; /cli/login-requests/:requestId/token.

Dashboard path: /admin/cli/approve.

Shared server-guard guidance.

Consent

none. --dry-run bypasses confirmation where supported. Destructive: false. Spends money: false. Real send: false.

Retry

write: Non-idempotent writes are not automatically retried. guarded-write: when an update carries the revision read from the server, its write is not automatically retried after network errors or HTTP 429/502/503/504. It may already be saved; inspect the resource before rerunning. A rerun reads current settings again. The explicit CLI_RATE_LIMITED refusal exception below still applies. recommendation-read: the recommendation request made while planning --recommended-limits is not automatically retried after network errors or HTTP 429/502/503/504. If planning fails, no update is sent; rerun the command to request a new recommendation. The explicit CLI_RATE_LIMITED refusal exception below still applies. This label does not change the retry policy of the standalone rate-recommendations command.

Output

Output: data. API output is pass-through server data unless the command details describe a CLI shape. Local commands, composites and hand-offs use their documented CLI shapes.

Full command details

Approve a CLI login in your dashboard.

Login 429 guidance.

Worked examples

Examples are synthetic illustrations, never live account records. Replace resource IDs with your own authorized resources. Secret values are omitted here; redacted examples illustrate the shape and are not schema-validation fixtures.

Synthetic workflow

Authorize this workstation to act through a chosen Akedly account without putting a password in a terminal.

sh
akedly login

Illustrative response (sensitive values omitted):

json
{
  "user": {
    "_id": "synthetic-user-id",
    "email": "operator@example.invalid"
  },
  "cliLogin": {
    "id": "synthetic-login-id",
    "prefix": null,
    "label": "Synthetic workstation",
    "accessLevel": "full",
    "organization": null,
    "personal": true,
    "createdAt": "2030-01-01T00:00:00.000Z",
    "expiresAt": "2030-01-08T00:00:00.000Z",
    "lastUsedAt": null,
    "lastCliVersion": "0.0.0-synthetic",
    "current": true,
    "region": "egypt",
    "approvedByStaff": false
  },
  "credentialStorage": {
    "mode": "file",
    "path": "/home/synthetic/.config/akedly/credentials.json"
  }
}

The live login approval code and credential are delivered through stderr and local credential storage; this response intentionally contains neither. Dry-run is local preview only.

Additional command forms

sh
akedly login

Input and file contracts

The contract below describes typed arguments, file formats, validation boundaries and API mappings. Boolean switches take no value; numeric and comma-separated values are each passed as one argument. Read prerequisites and full command details for state-dependent requirements.

Response contract

The live login approval code and credential are delivered through stderr and local credential storage; this response intentionally contains neither. Dry-run is local preview only.

A live run waits for dashboard approval; this example is an approved synthetic outcome.

Common error guidance.

logout

End the current regional CLI session and remove its stored credential.

When to use

  • Use when leaving a shared workstation or rotating access.

How it works

  1. Posts logout with the selected CLI credential, then deletes the local credential. If already ended, removes the stale credential and returns ended=true.

Expected outcome

The session is ended and its stored token removed.

Next steps

  • Run login again when CLI access is needed.

Usage

sh
akedly logout

Inspect this command offline before preparing an operation:

sh
akedly describe "logout" --output json

Flags

FlagTypeEnum / rangeDescription
--ksaboolean switch—Select the KSA deployment.
--dry-runboolean switch—Preview without sending the write or creating output files; planning reads may still occur. Bypass consent.
--helpboolean switch—Show offline command help.
--outputenumjson | humanSelect JSON or human output.
--fieldsdot-paths—Select comma-separated safe dot paths; apply to each element of a root array.

Authentication, permission and guards

Auth: login. Permission: none declared.

Server request: POST /cli/logout.

Shared server-guard guidance.

Consent

none. --dry-run bypasses confirmation where supported. Destructive: false. Spends money: false. Real send: false.

Retry

idempotent: Idempotent requests retry network errors and HTTP 429/502/503/504, at most 3 tries, waiting for cooldownSeconds, retryAfter or the Retry-After header (otherwise 1 second) between tries, up to 30 seconds; a longer requested wait is returned as the error.

Output

Output: data. API output is pass-through server data unless the command details describe a CLI shape. Local commands, composites and hand-offs use their documented CLI shapes.

Full command details

End the CLI login and remove its local credential.

Login 429 guidance.

Worked examples

Examples are synthetic illustrations, never live account records. Replace resource IDs with your own authorized resources. Secret values are omitted here; redacted examples illustrate the shape and are not schema-validation fixtures.

Synthetic workflow

End the current regional CLI session and remove its stored credential.

sh
akedly logout

Illustrative response (sensitive values omitted):

json
{
  "status": "success",
  "data": {
    "ended": true
  }
}

If AKEDLY_CLI_LOGIN supplies the credential, unset that environment variable separately.

Additional command forms

sh
akedly logout

Input and file contracts

The contract below describes typed arguments, file formats, validation boundaries and API mappings. Boolean switches take no value; numeric and comma-separated values are each passed as one argument. Read prerequisites and full command details for state-dependent requirements.

Response contract

If AKEDLY_CLI_LOGIN supplies the credential, unset that environment variable separately.

Common error guidance.

whoami

Check which account and CLI access level this region currently uses.

When to use

  • Before a sensitive change or when access seems unexpected.

How it works

  1. Reads authenticated identity and CLI session endpoints, then returns identity fields with the active CLI login descriptor.

Expected outcome

Identity and session access level/expiry are visible.

Next steps

  • If the access level is read_only, request a Full access login for changes.

Usage

sh
akedly whoami

Inspect this command offline before preparing an operation:

sh
akedly describe "whoami" --output json

Flags

FlagTypeEnum / rangeDescription
--ksaboolean switch—Select the KSA deployment.
--helpboolean switch—Show offline command help.
--outputenumjson | humanSelect JSON or human output.
--fieldsdot-paths—Select comma-separated safe dot paths; apply to each element of a root array.

Authentication, permission and guards

Auth: login. Permission: none declared.

Server request: GET /auth/me; /cli/session.

Shared server-guard guidance.

Consent

none. --dry-run bypasses confirmation where supported. Destructive: false. Spends money: false. Real send: false.

Retry

idempotent: Idempotent requests retry network errors and HTTP 429/502/503/504, at most 3 tries, waiting for cooldownSeconds, retryAfter or the Retry-After header (otherwise 1 second) between tries, up to 30 seconds; a longer requested wait is returned as the error.

Output

Output: data. API output is pass-through server data unless the command details describe a CLI shape. Local commands, composites and hand-offs use their documented CLI shapes.

Full command details

Show the current user and CLI login.

Login 429 guidance.

Worked examples

Examples are synthetic illustrations, never live account records. Replace resource IDs with your own authorized resources. Secret values are omitted here; redacted examples illustrate the shape and are not schema-validation fixtures.

Synthetic workflow

Check which account and CLI access level this region currently uses.

sh
akedly whoami

Illustrative response (sensitive values omitted):

json
{
  "user": {
    "_id": "synthetic-user-id",
    "email": "operator@example.invalid"
  },
  "cliLogin": {
    "id": "synthetic-login-id",
    "prefix": null,
    "label": "Synthetic workstation",
    "accessLevel": "full",
    "organization": null,
    "personal": true,
    "createdAt": "2030-01-01T00:00:00.000Z",
    "expiresAt": "2030-01-08T00:00:00.000Z",
    "lastUsedAt": null,
    "lastCliVersion": "0.0.0-synthetic",
    "current": true,
    "region": "egypt",
    "approvedByStaff": false
  }
}

Identity fields are passed through from the API and may grow.

Additional command forms

sh
akedly whoami

Input and file contracts

The contract below describes typed arguments, file formats, validation boundaries and API mappings. Boolean switches take no value; numeric and comma-separated values are each passed as one argument. Read prerequisites and full command details for state-dependent requirements.

Response contract

Identity fields are passed through from the API and may grow.

Common error guidance.

commands

Discover supported command names, flags, routes and safety metadata in a machine-readable catalog.

When to use

  • Use to select a supported operation before invoking it.

How it works

  1. Returns the command manifest without retryExceptions; standard JSON mode is a bare array, not an envelope.

Expected outcome

A root array of supported command descriptors is returned.

Next steps

  • Use describe <canonical-name> for curated purpose, response contract and safe workflow guidance.

Usage

sh
akedly commands

Inspect this command offline before preparing an operation:

sh
akedly describe "commands" --output json

Flags

FlagTypeEnum / rangeDescription
--jsonboolean switch—Command-specific option; see the full command details below.
--helpboolean switch—Show offline command help.
--outputenumjson | humanSelect JSON or human output.
--fieldsdot-paths—Select comma-separated safe dot paths; apply to each element of a root array.

Authentication, permission and guards

Auth: public. Permission: none declared.

Shared server-guard guidance.

Consent

none. --dry-run bypasses confirmation where supported. Destructive: false. Spends money: false. Real send: false.

Retry

local: Local command; no HTTP retry.

Output

Output: data. API output is pass-through server data unless the command details describe a CLI shape. Local commands, composites and hand-offs use their documented CLI shapes.

Full command details

Print the command manifest. --json returns a bare array without an envelope. --fields selects paths from each root-array element; for other responses paths start at the root, and missing paths are omitted.

Worked examples

Examples are synthetic illustrations, never live account records. Replace resource IDs with your own authorized resources. Secret values are omitted here; redacted examples illustrate the shape and are not schema-validation fixtures.

Synthetic workflow

Discover supported command names, flags, routes and safety metadata in a machine-readable catalog.

sh
akedly commands --json

Illustrative response (sensitive values omitted):

json
[
  {
    "name": "whoami",
    "path": [
      "whoami"
    ],
    "method": "GET",
    "route": [
      "/auth/me",
      "/cli/session"
    ],
    "auth": "login",
    "flags": {},
    "help": "Show the current user and CLI login."
  }
]

retryExceptions are intentionally omitted from the returned catalog. Fields are extensible and are not an API response envelope.

Additional command forms

sh
akedly commands --json

Input and file contracts

The contract below describes typed arguments, file formats, validation boundaries and API mappings. Boolean switches take no value; numeric and comma-separated values are each passed as one argument. Read prerequisites and full command details for state-dependent requirements.

Response contract

retryExceptions are intentionally omitted from the returned catalog. Fields are extensible and are not an API response envelope.

Common error guidance.

describe

Inspect the exact contract and safe usage guidance for one supported CLI command without contacting a server.

When to use

  • Use to validate a command name, understand its consent and output contract, or generate a bounded agent instruction.

How it works

  1. Looks up one canonical command name in the local manifest plus curated agent metadata and returns a descriptor; unknown names are usage errors.

Expected outcome

A descriptor for the requested command is returned locally.

Next steps

  • Run the command only after reviewing auth, consent and side effects.

Usage

sh
akedly describe <command>

Inspect this command offline before preparing an operation:

sh
akedly describe "describe" --output json
PositionalGrammarUsage guidance
<command>TextRequired positional argument.

Flags

FlagTypeEnum / rangeDescription
--helpboolean switch—Show offline command help.
--outputenumjson | humanSelect JSON or human output.
--fieldsdot-paths—Select comma-separated safe dot paths; apply to each element of a root array.

Authentication, permission and guards

Auth: public. Permission: none declared.

Shared server-guard guidance.

Consent

none. --dry-run bypasses confirmation where supported. Destructive: false. Spends money: false. Real send: false.

Retry

local: Local command; no HTTP retry.

Output

Output: data. API output is pass-through server data unless the command details describe a CLI shape. Local commands, composites and hand-offs use their documented CLI shapes.

Full command details

Describe one canonical command offline, including its business purpose, input and output schemas, file formats, consent, recovery guidance and synthetic worked examples. Quote a multi-word command name as one argument.

Worked examples

Examples are synthetic illustrations, never live account records. Replace resource IDs with your own authorized resources. Secret values are omitted here; redacted examples illustrate the shape and are not schema-validation fixtures.

Synthetic workflow

Inspect the exact contract and safe usage guidance for one supported CLI command without contacting a server.

sh
akedly describe 'config get'

Illustrative response (sensitive values omitted):

json
{
  "status": "success",
  "data": {
    "command": "akedly config get",
    "business": {
      "purpose": "Read the local default output preference used when a command does not choose a mode.",
      "whenToUse": [
        "Use to check whether output is set to automatic, JSON or human."
      ],
      "howItWorks": [
        "Reads config.json locally and returns output, defaulting to automatic."
      ],
      "prerequisites": [],
      "expectedOutcome": "Current local output preference is returned.",
      "nextSteps": [
        "Set with config set output json or human."
      ]
    },
    "auth": {
      "mode": "public",
      "permission": null
    },
    "consent": {
      "required": false,
      "requiredUnconditionally": false,
      "alwaysRequiredFor": [],
      "conditionalWhen": [],
      "requiredUnless": null,
      "skippedBy": [
        "--dry-run"
      ],
      "refusal": null
    },
    "sideEffects": {
      "destructive": false,
      "spendsMoney": false,
      "realSend": false,
      "handoff": null,
      "idempotent": true
    },
    "retry": {
      "idempotent": true,
      "exceptions": [],
      "defaultMaximumAttempts": 3,
      "rateLimits": "Login-authenticated CLI_RATE_LIMITED 429 refusals retry up to three total attempts, using the server cooldown or Retry-After. Requested waits over 30 seconds are returned without retrying. Idempotent requests also retry network failures after a fixed one-second wait and HTTP 429, 502, 503 or 504 using Retry-After or a one-second default, with the same 30-second wait cap. There is no exponential backoff. Non-idempotent sends do not retry ambiguous network or server failures; inspect command state before repeating."
    },
    "help": "Get or set output: config get output; config set output json|human.",
    "examples": [
      "akedly config get output"
    ],
    "operationalRules": {
      "tips": {},
      "contextTips": []
    },
    "flagTokenEncoding": {
      "booleans": "A boolean schema describes switch presence: write --flag with no value.",
      "valuedFlags": "A string schema describes the single argv token after --flag or after --flag=; numeric token schemas parse as decimal strings and validation.parsedValueSchema documents the converted number.",
      "csvFlags": "A list schema describes one comma-separated argv token, not multiple shell arguments.",
      "projection": "--fields is one comma-separated argv token of safe dot paths and changes returned output only."
    },
    "positionals": [
      {
        "name": "key",
        "type": "string",
        "required": true,
        "pattern": "^output$",
        "validation": "Use config get output or config set output json|human.",
        "mapsToRouteParameter": "key",
        "routeParameterValidation": "A route parameter cannot be . or .., including percent-encoded forms."
      }
    ],
    "flags": [
      {
        "name": "help",
        "schema": {
          "type": "boolean"
        },
        "required": false
      },
      {
        "name": "output",
        "schema": {
          "type": "string",
          "enum": [
            "json",
            "human"
          ]
        },
        "required": false
      },
      {
        "name": "fields",
        "schema": {
          "type": "string",
          "pattern": "^(?!.*(?:^|[.,])(?:__proto__|constructor|prototype)(?:[.,]|$))(?!,)(?!.*,,)(?!.*,$)[A-Za-z0-9_-]+(?:\\.[A-Za-z0-9_-]+)*(?:,[A-Za-z0-9_-]+(?:\\.[A-Za-z0-9_-]+)*)*$"
        },
        "required": false,
        "validation": {
          "syntax": "Comma-separated safe dot paths; reserved prototype keys are refused."
        }
      }
    ],
    "files": [],
    "wire": {
      "method": null,
      "route": null,
      "query": {},
      "body": {},
      "ownerParams": []
    },
    "output": {
      "responseSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "output": {
            "enum": [
              "automatic",
              "json",
              "human"
            ]
          }
        },
        "required": [
          "output"
        ],
        "additionalProperties": true
      },
      "variants": [],
      "examples": [
        {
          "title": "Synthetic response",
          "value": {
            "output": "automatic"
          }
        }
      ],
      "notes": [],
      "fieldSelection": {
        "flag": "fields",
        "behavior": "Selects comma-separated dot paths from the response root; for root arrays, paths apply to each element. Missing paths are omitted.",
        "sensitiveData": null
      },
      "sensitiveOutput": null,
      "secretSinks": [],
      "rendering": "Uses the selected JSON or human output mode."
    },
    "errors": {
      "schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "required": [
          "status",
          "code",
          "message",
          "httpStatus",
          "hint"
        ],
        "properties": {
          "status": {
            "const": "error"
          },
          "code": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "httpStatus": {
            "type": [
              "integer",
              "null"
            ]
          },
          "details": {
            "anyOf": [
              {
                "type": "object",
                "minProperties": 1
              },
              {
                "type": "array",
                "minItems": 1
              }
            ]
          },
          "hint": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "globalHints": {
        "TOTP_DELETE_RECONCILIATION_PENDING": "Any Pending request blocks deletion, including one just opened; Failed requests can block too. Ordinary unverified, unbilled requests expire about five minutes after creation and normally become Expired on the next five-minute reconciliation run, within about ten minutes of creation; job delays or billing/counter recovery can extend that wait. Check the stored status in akedly totp history list; computed isExpired alone does not unblock deletion. Ask Akedly support if a request stays Pending or Failed beyond that normal window, or is Verified and still blocks.",
        "CLI_SECRET_ALREADY_DELIVERED": "Run akedly login again.",
        "CLI_LOGIN_INVALID": "Run akedly login.",
        "PERMISSION_DENIED": "If details.permission names a permission, ask an organization admin to grant it to your role. Otherwise read the server message: an organization admin cannot clear refusals such as an inactive or unverified account, an Akedly-managed global role, a reported-invitation pause or missing enterprise entitlement; follow the message or contact Akedly support. If the message says BYO-SMS is not enabled for this account, the account needs BYO-SMS entitlement and granular pricing; akedly whoami shows user.byoSmsEntitled and user.pricingModel, and only Akedly can change either.",
        "ORG_ADMIN_REQUIRED": "If the message asks for an active organization session, run akedly login and approve it with the intended organization active in the dashboard. If it says organization admin access is required, ask an organization admin for access or to run the command. Role changes can take up to 60 seconds to apply.",
        "OWNER_REQUIRED": "Only the account owner can do this; an organization admin is not necessarily the owner. Ask the owner to run it from their own login. For seats, organization admins can read akedly seats visibility; akedly seats status is owner-only.",
        "LOGIN_REQUIRED": "Run akedly login. If you supplied a credential, check --ksa or AKEDLY_REGION.",
        "CLI_DISABLED": "Customer CLI access is turned off on this Akedly server. Try again later or contact Akedly support.",
        "CLI_IDENTITY_UNAVAILABLE": "Akedly could not confirm your login right now. Wait a minute and try again.",
        "CLI_LOGIN_INDEX_UNAVAILABLE": "CLI login is temporarily unavailable on this server. Try again later or contact Akedly support.",
        "WABA_PHONE_CHECK_UNAVAILABLE": "Meta did not confirm the number. Wait a few minutes, then run the command again.",
        "CLI_UPGRADE_REQUIRED": "Install the latest @akedly/cli.",
        "NOT_AVAILABLE_ON_SERVER": "Check the selected region or ask an operator to deploy CLI support.",
        "CLI_RATE_LIMITED": "Wait before trying again.",
        "CLI_LOGIN_DENIED": "Run akedly login again and approve the new code.",
        "CLI_LOGIN_REQUEST_EXPIRED": "Run akedly login again.",
        "LOGIN_TIMEOUT": "Run akedly login again and approve before the timeout.",
        "CLI_READ_ONLY": "This login is read-only. Run akedly login and choose Full access.",
        "CLI_LOGIN_LIMIT_REACHED": "Run akedly cli-logins list, then akedly cli-logins end <id>",
        "CLI_LOGIN_NOT_FOUND": "Run akedly cli-logins list and check the login id.",
        "CLI_LOGIN_OWNER_PROTECTED": "Ask the account owner to end this login.",
        "IMPERSONATION_BLOCKED": "This login was approved by Akedly staff and can't do this. Run akedly login and approve it in your own dashboard session.",
        "SELF_IDENTITY_REQUIRED": "Personal settings need your own login. Run akedly login and approve it in your own dashboard session.",
        "API_KEY_ACTIVE_CAP_REACHED": "Revoke an unused key before creating another.",
        "API_KEY_ISSUANCE_DISABLED": "Ask an operator to enable API-key issuance.",
        "API_KEY_VERSION_CONFLICT": "List the keys and retry the edit with the current version.",
        "API_KEY_BUDGET_CONFIRMATION_REQUIRED": "Review the reduction and pass --confirm-budget-reduction.",
        "API_KEY_ISSUE_RECOVERY_UNAVAILABLE": "Revoke the key and create a new one.",
        "API_KEY_TRANSITION_UNAVAILABLE": "Revoke the key and create a new one.",
        "API_KEY_ISSUE_IDEMPOTENCY_CONFLICT": "Use a new idempotency key for different issue details.",
        "API_KEY_SCOPE_NOT_ACTIVE": "Ask an operator to enable API-key scope editing.",
        "API_KEY_BUDGET_NOT_ACTIVE": "Ask an operator to enable API-key budget editing.",
        "API_KEY_NOT_FOUND": "Run akedly api-keys list and check the id.",
        "API_KEY_BUDGET_RACE": "List the keys and retry.",
        "V1_CREATION_NOT_ENTITLED": "V1 pipelines are not available to this account. Omit --api-version to create a V1.2 pipeline.",
        "SECRET_SUFFIX_REQUIRED": "Pass exactly one of --secret-file <saved path> or --secret-suffix <last 4 characters>.",
        "SECRET_SUFFIX_MISMATCH": "Reveal the current secret to --secret-file <new path> with akedly pipelines webhook-secret reveal <id> for webhook secrets, or akedly utilities pipelines signing-secret reveal <id> for utility request-signing secrets, then acknowledge with exactly one of --secret-file <that path> or --secret-suffix <last 4 characters>.",
        "CHANNEL_CHOICE_NOT_AVAILABLE": "Nothing in this request was saved. Each value in details.blockers names what is missing: not_entitled means Channel Choice isn't enabled on the account yet; legacy_pricing means the account needs granular pricing; not_pay_per_message means the pipeline is not billed per message, because it is billed per successful verification or the account has no billing plan yet; account_excluded and global_switch_off mean Channel Choice isn't offered to this account right now. Only Akedly can change these, so contact Akedly. utility_pipeline means utility pipelines have no Channel Choice. Resend any other changes without the Channel Choice flags.",
        "VERIFICATION_METHOD_UNAVAILABLE": "Nothing was saved. details.method is the word you typed, or the method's id if the method became unavailable after the CLI checked; running the command again rechecks the list and names the word. Remove that method from --verification-methods and retry, or contact Akedly if you expected it to be available.",
        "VERIFICATION_METHODS_REQUIRED": "A pipeline that has verification methods must keep at least one. Send the methods to keep instead of an empty list, for example akedly pipelines update <id> --verification-methods whatsapp,sms --yes.",
        "SETTING_NOT_FOR_THIS_PIPELINE": "Nothing in this request was saved. details.setting names the setting and details.useInstead what to use instead. For rate limits and the circuit breaker, reason api-version means this is a V1 or V2 pipeline, where they belong to a widget instead, so useInstead is widgets update. A widget must be attached to this pipeline first. Find attached widgets with akedly widgets list-filtered --pipeline-id <pipelineId>, then inspect the intended widget with akedly widgets get <widgetId>, using its 24-hex _id. This listing excludes inactive widgets by default. Also run akedly widgets list-filtered --pipeline-id <pipelineId> --status inactive before concluding that no widget is attached. Change its limits with akedly widgets update <widgetId> --rate-limits-file <file> --yes; use the widget file shape, not the pipeline file shape. Set its breaker with akedly widgets update <widgetId> --circuit-breaker on --yes (or off), and use --circuit-breaker-file <file> for widget thresholds and suspension durations; pipeline --circuit-breaker-sensitivity does not apply to widgets. If no widget is attached, create one with akedly widgets create --name <name> --pipeline-id <pipelineId> --secret-file <new path>, or attach an existing one with akedly widgets update <widgetId> --pipeline-id <pipelineId> --yes. V2 attachment requires both callback URLs; V1 attachment requires entitlement. pipelines update now routes shared rate-limit, breaker and PoW flags to every attached widget on V1/V2. V1.2-only controls remain refused on V1/V2. Use the appropriate file shape for the resulting API version. For the Channel Choice widget experience, reason api-version means it needs a V2 pipeline, so create one with akedly pipelines create --name <name> --api-version v2 --redirect-url <url> --webhook-url <url> --secret-file <new path>, then attach a widget to it; reason no-widget means it needs a widget attached to this V2 pipeline, so create one with akedly widgets create --name <name> --pipeline-id <id> --secret-file <new path>, or attach an existing one with akedly widgets update <widgetId> --pipeline-id <id> --yes, then retry. Resend any other changes without that flag.",
        "PIPELINE_CHANGED": "Another change landed first, so nothing was saved. Run the same command again; if you changed rate limits or destination countries, it reads the pipeline again first and merges your change onto the new version. Run akedly pipelines get <id> to see what changed.",
        "RATE_LIMIT_INVALID": "Check details.field and any details.errors. Use whole numbers above zero in the expected JSON object shape. Pipeline --rate-limits-file uses perPhoneNumber, perIpAddress and perPipeline; widget --rate-limits-file uses widgetAttempts and otpRequests, each with perPhoneNumber, perDevice and perWidget. Each takes perMinute, perHour and perDay. Widget --circuit-breaker-file uses floodThresholds and suspensionSeconds; durations are whole seconds. Correct the named field and rerun the command.",
        "EXPECTED_UPDATED_AT_INVALID": "The CLI reads the revision automatically. Run the command again to read the current settings; if this continues, check that the CLI and server are up to date and contact Akedly support. Do not invent a revision or remove the conflict check.",
        "DESTINATION_COUNTRIES_MODE_REQUIRED": "Nothing in this request was saved. A changed country list under mode all would be discarded: pass --destination-countries-mode only-selected or all-except-selected with --destination-countries, or leave the list out to keep every country open. --destination-countries-mode all on its own clears the list.",
        "NOT_ENOUGH_TRAFFIC": "Keep the current limits for now. Recommended limits need at least 100 analysed requests and better than low confidence; try again after more real traffic or with a longer --period such as last-quarter, or set limits yourself with --rate-limits-file.",
        "INVALID_COUNTRY_POLICY": "Nothing in this request was saved. Use two-letter country codes such as EG,SA with --destination-countries and a mode of all, only-selected or all-except-selected; the message names the problem.",
        "OTP_PIPELINE_CHANGED": "Another change landed first. Run akedly pipelines get <id> and retry.",
        "TURNSTILE_PIPELINE_CHANGED": "Another change landed first. Run akedly pipelines get <id> and retry.",
        "CLUSTER_GATE_PIPELINE_CHANGED": "Another change landed first. Run akedly pipelines get <id> and retry.",
        "CLUSTER_GATE_NOT_AVAILABLE": "Nothing in this request was saved. Act on details.reason: not-offered means Cluster Gate is not offered for this pipeline right now, for example on a utility pipeline or in the KSA region; attaching a widget will not help on a V1.2 pipeline, because V1.2 pipelines cannot be attached to widgets; drop the Cluster Gate flags and resend any other changes; no-widget means Cluster Gate applies here only through a widget and none is attached, so attach an existing widget with akedly widgets update <widgetId> --pipeline-id <id> --yes, or create one with akedly widgets create --name <name> --pipeline-id <id> --secret-file <new path>, then retry; the pipeline must first be active, with both callback URLs and a verification method, and WIDGET_PIPELINE_NOT_READY says what is missing; on-create comes only from raw API requests that set Cluster Gate while creating a pipeline: create the pipeline first, then set Cluster Gate with akedly pipelines update <id> --cluster-gate on --cluster-gate-position balanced --yes; check-failed means availability could not be checked, so retry later; intent-missing comes only from raw API requests that omit clusterGateIntent: true.",
        "SECRET_ALREADY_ACKNOWLEDGED": "The secret was already acknowledged and cannot be shown again. Use the saved copy from pipeline creation (webhook secrets) or from reveal, for example the file written with --secret-file. Only if that copy is lost, use akedly pipelines webhook-secret regenerate <id> --yes --secret-file <new path> for webhook secrets, or akedly utilities pipelines signing-secret regenerate <id> --yes --secret-file <new path> for utility request-signing secrets. Regenerating stops the current secret immediately; deploy the new secret before using signed requests or accepting signed webhooks.",
        "WIDGET_PIPELINE_NOT_READY": "Fix each item in details.missing with akedly pipelines update <pipelineId> --status active --redirect-url <url> --webhook-url <url> --verification-methods whatsapp,sms,email --yes, passing only the flags for the missing items, then retry.",
        "WIDGET_IDENTITY_INDEX_UNAVAILABLE": "Widget identity indexes are unavailable. Retry later or contact Akedly support.",
        "INCOMPLETE_DATE_RANGE": "Supply both --start-date and --end-date, or neither.",
        "DATE_RANGE_TOO_LARGE": "Choose a date range of at most 30 days, counted as the command help describes.",
        "INVALID_DATE_RANGE": "Check both date bounds and their order.",
        "INVALID_DATE": "Use valid ISO dates for the requested range.",
        "NEEDS_BROWSER": "Turn Turnstile off for the pipeline in the dashboard, or run akedly pipelines dev-mode set <pipelineId> --dev-mode on --bypass-turnstile on --bypass-pow on --yes.",
        "SETUP_REQUIRED": "Finish phone setup on the Personal Notifications page of your Akedly dashboard, then retry.",
        "INVALID_API_KEY": "Check the API key: akedly api-keys list, or create one with akedly api-keys create --label <name> --save --yes.",
        "API_KEY_SCOPE_DENIED": "This API key is scoped to other pipelines; use a key that includes this pipeline.",
        "MAX_ATTEMPTS_EXCEEDED": "Too many wrong codes; send a new OTP.",
        "ALREADY_VERIFIED": "This request is already verified; check it with akedly transactions status.",
        "INVALID_OTP": "Check the code and retry; attempts are limited.",
        "PIPELINE_INACTIVE": "Run akedly pipelines update <pipelineId> --status active --yes, then retry.",
        "POW_CHALLENGE_EXPIRED": "Run the command again; it fetches a fresh challenge.",
        "POW_CHALLENGE_REPLAYED": "Run the command again; it fetches a fresh challenge.",
        "POW_DIFFICULTY_STALE": "Run the command again; it fetches a fresh challenge.",
        "STATUS_LOOKUP_RATE_LIMITED": "Wait for the retryAfter seconds in details, then retry; each lookup counts against the 300 ids per minute limit.",
        "TRANSACTION_EXPIRED": "This code or request has expired; send a new one.",
        "USE_V1_2_ENDPOINT": "This pipeline is V1.2. Use akedly otp v1.2 send.",
        "SIGNATURE_EXPIRED": "This machine's clock differs from the server's by more than 60 seconds. Fix the clock and run the command again; it signs a fresh request each time.",
        "WIDGET_USER_MISMATCH": "This API key belongs to a different account than the widget. Use a key from the widget owner's account.",
        "WEBHOOK_SIGNATURE_INVALID": "Use the pipeline's current whsec_ secret (regenerating invalidates the old one), the exact raw body bytes the server received (no re-serialising, no trailing newline), and the svix-id, svix-timestamp and svix-signature headers.",
        "WAIT_EXPIRED": "The request expired before it was verified; it cannot complete. Start a new one (otp v2 attempt, otp v1.2 send or otp v1 create).",
        "WAIT_FAILED": "The verification failed and cannot complete; start a new one.",
        "WAIT_TIMEOUT": "The wait ended; the verification may still complete. Check it with akedly transactions status. Resume with akedly transactions status --attempt-id <id> --wait (or --transaction-id <id> --wait).",
        "WEBHOOK_TIMESTAMP_STALE": "The webhook timestamp is outside the allowed window. Check this machine's clock, or pass --at <unix seconds> to check an older delivery, or --tolerance-seconds <seconds>.",
        "WEBHOOK_HEADERS_MISSING": "Pass a headers JSON file with the svix-id, svix-timestamp and svix-signature headers exactly as received.",
        "NO_USABLE_API_KEY": "This account has no usable API key for this pipeline. Create one with akedly api-keys create --label <name> --save --yes; a key scoped to selected pipelines must include this pipeline.",
        "INVALID_API_VERSION": "This command does not support this pipeline's API version. Check it with akedly pipelines get <id> and use the matching command for that version.",
        "DOCTOR_FAILED": "Fix the failed checks in details.checks, then run akedly doctor again.",
        "PAGINATION_LIMIT": "Narrow the filters, for example a date range or status, or raise --limit (maximum 100), then run again.",
        "PAGINATION_STALLED": "The list changed while it was being read, or the server stopped advancing. Run the command again.",
        "REPORT_NOT_FOUND": "Run akedly reports list and check the reportId.",
        "DAILY_LIMIT_REACHED": "Wait until an earlier successful, sent or in-flight report generation leaves the rolling 24-hour window; for example, a generation at 14:00 stops counting after 14:00 the next day. This limit covers the whole account, including dashboard and teammate generations.",
        "REPORT_IN_PROGRESS": "A report is already generating for this account; dashboard and teammate generations share the same slot. Run akedly reports list before trying again.",
        "TEMPLATE_DUPLICATE": "Run akedly whatsapp otp-templates list; recover missing languages with update --add-languages instead of adding the same template again.",
        "TEMPLATE_LIMIT_REACHED": "Archive an unused template with akedly whatsapp otp-templates delete <id> --yes before adding another; the limit is 20 per WABA.",
        "TEMPLATE_PROVISIONING_FAILED": "The template or changes are saved. Run akedly whatsapp otp-templates list, then update <id> --add-languages <failed languages> rather than creating again.",
        "TEMPLATE_WABA_REQUIRED": "Connect an active own WhatsApp Business Account in the dashboard before managing OTP templates; check akedly whatsapp status.",
        "TEMPLATE_WABA_CHANGED": "This template belongs to the previous WABA. Add it again for the currently connected account.",
        "COUNTRY_CATALOG_UNAVAILABLE": "The country catalog is temporarily unavailable. Try again later.",
        "NOT_A_UTILITY_PIPELINE": "Choose an owned utility pipeline from akedly pipelines list, or create one with akedly pipelines create --product utility --name <name>.",
        "TEST_RATE_LIMITED": "Wait for Retry-After before testing again; account, recipient or replay safety limits may apply. Reuse the same Vodafone idempotencyKey when checking an existing attempt.",
        "EGRESS_FINGERPRINT_STALE": "The sending address changed. Run akedly byo-sms vodafone readiness, check the new address list, then acknowledge again with the new fingerprint.",
        "VODAFONE_EGRESS_NOT_READY": "Run akedly byo-sms vodafone readiness; ask Akedly support to verify the outbound addresses before acknowledging.",
        "UNROUTABLE_COUNTRY": "Run akedly byo-sms countries and choose routable country codes; use ALL alone for catch-all coverage.",
        "SOURCE_COVERAGE_UNROUTABLE": "Update the source integration countries using akedly byo-sms countries, then clone again.",
        "INVALID_TEST_PHONE": "Supply --test-phone-number in international format or update the saved test destination.",
        "TEST_PHONE_OUT_OF_COVERAGE": "Choose a test number in the integration countries, or update its countries before testing.",
        "VODAFONE_TEST_GUARD_UNAVAILABLE": "No new test was sent. Retry with the same idempotencyKey; contact Akedly support if send protection remains unavailable.",
        "VODAFONE_TEST_IDEMPOTENCY_KEY_REQUIRED": "Supply --idempotency-key with a unique request key and reuse it after an uncertain response.",
        "VODAFONE_TEST_IDEMPOTENCY_KEY_INVALID": "Supply --idempotency-key with 1 to 255 characters.",
        "VODAFONE_ACCEPTED_RETEST_INVALID": "Supply --previous-test-key with the accepted test key before requesting another test.",
        "VODAFONE_ACCEPTED_RETEST_REQUIRED": "Check akedly byo-sms get <id>; to send again after an accepted result, supply --previous-test-key and a new --idempotency-key with --yes.",
        "VODAFONE_NEW_TEST_CONFIRMATION_REQUIRED": "Check the previous result with akedly byo-sms get <id>; --allow-new-after-unknown with a new --idempotency-key and --yes can send another message.",
        "VODAFONE_NEW_TEST_IN_PROGRESS": "Wait for the current Vodafone test result; inspect akedly byo-sms get <id> before starting another attempt.",
        "BYO_SMS_CONFIGURATION_CHANGED": "Run akedly byo-sms get <id>, test the current configuration, then try activation again.",
        "VODAFONE_CONFIGURATION_CHANGED": "Run akedly byo-sms get <id>, test the current configuration, then try activation again.",
        "BYO_SMS_STEPS_INVALID": "Check the steps JSON and secret names; secret and extraction names use letters, numbers and underscore."
      },
      "commandHints": {},
      "hintPrecedence": [
        "explicit handler hint",
        "command-specific hint",
        "global code hint",
        "HTTP 429 fallback",
        "generic command-help fallback"
      ],
      "exitCodes": {
        "USAGE": 64,
        "CONFIRMATION_REQUIRED": 65,
        "LOGIN_REQUIRED": 66,
        "PERMISSION_DENIED": 67,
        "ORG_ADMIN_REQUIRED": 67,
        "OWNER_REQUIRED": 67,
        "CLI_READ_ONLY": 67,
        "IMPERSONATION_BLOCKED": 67,
        "SELF_IDENTITY_REQUIRED": 67,
        "CLI_LOGIN_OWNER_PROTECTED": 67,
        "NEEDS_BROWSER": 68,
        "SETUP_REQUIRED": 68,
        "CLI_RATE_LIMITED": 69,
        "NOT_AVAILABLE_ON_SERVER": 70,
        "CLI_UPGRADE_REQUIRED": 70,
        "CLI_DISABLED": 70
      }
    },
    "workedExamples": [
      {
        "title": "Synthetic workflow",
        "intent": "Read the local default output preference used when a command does not choose a mode.",
        "argv": [
          "config",
          "get",
          "output"
        ],
        "response": {
          "output": "automatic"
        },
        "notes": [],
        "synthetic": true
      }
    ]
  }
}

The schema models stable descriptor metadata, not an infinitely recursive manifest copy. No authentication or network request occurs.

Additional command forms

sh
akedly describe "pipelines update"

Input and file contracts

The contract below describes typed arguments, file formats, validation boundaries and API mappings. Boolean switches take no value; numeric and comma-separated values are each passed as one argument. Read prerequisites and full command details for state-dependent requirements.

Response contract

The example is actual local output from describeCommandResult("config get"). The schema models the bounded stable descriptor structure, including requiredUnconditionally, flagTokenEncoding, query/body maps, and errors.globalHints/commandHints/hintPrecedence/exitCodes; it does not recursively embed the full command catalog.

Common error guidance.

agent-guide

Provide portable operating instructions for an AI agent working with Akedly CLI.

When to use

  • Use to onboard an agent or save the current guide into project instructions.

How it works

  1. Renders markdown locally; without --write returns raw markdown in human mode or a success/data guide object in JSON mode. --write creates a new file exclusively.

Expected outcome

Guide text is displayed or written to a new local path.

Next steps

  • Review the guide before granting an agent access.

Usage

sh
akedly agent-guide

Inspect this command offline before preparing an operation:

sh
akedly describe "agent-guide" --output json

Flags

FlagTypeEnum / rangeDescription
--writetext—Command-specific option; see the full command details below.
--dry-runboolean switch—Preview without sending the write or creating output files; planning reads may still occur. Bypass consent.
--helpboolean switch—Show offline command help.
--outputenumjson | humanSelect JSON or human output.
--fieldsdot-paths—Select comma-separated safe dot paths; apply to each element of a root array.

Authentication, permission and guards

Auth: public. Permission: none declared.

Shared server-guard guidance.

Consent

none. --dry-run bypasses confirmation where supported. Destructive: false. Spends money: false. Real send: false.

Retry

local: Local command; no HTTP retry.

Output

Output: data. API output is pass-through server data unless the command details describe a CLI shape. Local commands, composites and hand-offs use their documented CLI shapes.

Full command details

Human output is raw markdown; JSON output carries data.guide. Use --write <path> for a new file; an existing file exits 64 and prints guidance. Dry runs write nothing.

Worked examples

Examples are synthetic illustrations, never live account records. Replace resource IDs with your own authorized resources. Secret values are omitted here; redacted examples illustrate the shape and are not schema-validation fixtures.

Synthetic workflow

Provide portable operating instructions for an AI agent working with Akedly CLI.

sh
akedly agent-guide

Illustrative response (sensitive values omitted):

json
{
  "status": "success",
  "data": {
    "guide": "# Synthetic guide excerpt"
  }
}

With --write, response is {status:success,data:{written,bytes}}; an existing path is refused. Guide text omitted here is represented by a synthetic excerpt.

Additional command forms

sh
akedly agent-guide
sh
akedly agent-guide --write AGENTS.md

Input and file contracts

The contract below describes typed arguments, file formats, validation boundaries and API mappings. Boolean switches take no value; numeric and comma-separated values are each passed as one argument. Read prerequisites and full command details for state-dependent requirements.

Response contract

With --write, response is {status:success,data:{written,bytes}}; an existing path is refused. Guide text omitted here is represented by a synthetic excerpt.

Common error guidance.

doctor

Find local login, server, pipeline, key, quota and WhatsApp readiness issues before a verification workflow.

When to use

  • Use for troubleshooting; it performs reads and a live WhatsApp status lookup but no send.

How it works

  1. Runs checks in dependency order; later dependent checks are marked skipped after prerequisites fail. A failure exits with DOCTOR_FAILED and details.checks.

Expected outcome

Ten named readiness checks are returned when all checks complete.

Next steps

  • Fix failed checks using each hint, then rerun doctor.

Usage

sh
akedly doctor

Inspect this command offline before preparing an operation:

sh
akedly describe "doctor" --output json

Flags

FlagTypeEnum / rangeDescription
--pipeline-idid—Command-specific option; see the full command details below.
--ksaboolean switch—Select the KSA deployment.
--helpboolean switch—Show offline command help.
--outputenumjson | humanSelect JSON or human output.
--fieldsdot-paths—Select comma-separated safe dot paths; apply to each element of a root array.

Authentication, permission and guards

Auth: public. Permission: none declared.

Runs: whoami, pipelines list, pipelines get, billing quota, whatsapp status. Each step retains its own auth, permissions and consent.

Shared server-guard guidance.

Consent

none. --dry-run bypasses confirmation where supported. Destructive: false. Spends money: false. Real send: false.

Retry

Per step: each component retains its own retry class.

Output

Output: data. API output is pass-through server data unless the command details describe a CLI shape. Local commands, composites and hand-offs use their documented CLI shapes.

Full command details

Check the CLI Login, session expiry, server, CLI availability and version, pipeline activation and local API-key presence. Callback configuration and webhook-secret acknowledgement are informational. No sends; WhatsApp status is checked last and calls Meta live. Failures return DOCTOR_FAILED with details.checks. The balance check reads quota, reports the raw number without currency and suggests a dashboard top-up when needed. No WhatsApp account is informational; a connected account that is not send-ready fails the check.

Worked examples

Examples are synthetic illustrations, never live account records. Replace resource IDs with your own authorized resources. Secret values are omitted here; redacted examples illustrate the shape and are not schema-validation fixtures.

Synthetic workflow

Find local login, server, pipeline, key, quota and WhatsApp readiness issues before a verification workflow.

sh
akedly doctor

Illustrative response (sensitive values omitted):

json
{
  "status": "success",
  "data": {
    "checks": [
      {
        "check": "cli-login",
        "ok": true,
        "detail": "Credential source: stored in the file /home/synthetic/.config/akedly/credentials.json.",
        "hint": ""
      },
      {
        "check": "cli-login-expiry",
        "ok": true,
        "detail": "The session has not expired.",
        "hint": ""
      },
      {
        "check": "server",
        "ok": true,
        "detail": "The selected server is reachable.",
        "hint": ""
      },
      {
        "check": "cli-enabled",
        "ok": true,
        "detail": "CLI access is enabled.",
        "hint": ""
      },
      {
        "check": "cli-version",
        "ok": true,
        "detail": "The CLI version is accepted.",
        "hint": ""
      },
      {
        "check": "pipeline-exists",
        "ok": true,
        "detail": "At least one pipeline exists.",
        "hint": ""
      },
      {
        "check": "pipeline-ready",
        "ok": true,
        "detail": "Pipeline active: true (v1.2); frontend callback configured: true; backend callback configured: true; secret acknowledged: true.",
        "hint": ""
      },
      {
        "check": "api-key",
        "ok": true,
        "detail": "API-key source: stored.",
        "hint": ""
      },
      {
        "check": "balance",
        "ok": true,
        "detail": 12,
        "hint": ""
      },
      {
        "check": "whatsapp",
        "ok": true,
        "detail": "WhatsApp account connected.",
        "hint": ""
      }
    ]
  }
}

On failure the process returns DOCTOR_FAILED with checks rather than a success response; balance detail may be numeric. WhatsApp is queried last and contacts the selected server.

Additional command forms

sh
akedly doctor
sh
akedly doctor --pipeline-id <id>

Input and file contracts

The contract below describes typed arguments, file formats, validation boundaries and API mappings. Boolean switches take no value; numeric and comma-separated values are each passed as one argument. Read prerequisites and full command details for state-dependent requirements.

Response contract

On failure the process returns DOCTOR_FAILED with checks rather than a success response; balance detail may be numeric. WhatsApp is queried last and contacts the selected server.

Doctor has no --dry-run flag; this is a read-only but live server check and its final WhatsApp status read contacts the selected server.

Common error guidance.

quickstart

Prove the V1.2 OTP path using Akedly’s fake dev-mode Test Pair, with optional setup of a Quickstart pipeline/key.

When to use

  • Use for a free integration smoke after previewing the steps.

How it works

  1. Requires Full access and --yes on every real run, because it changes the account: it activates the Quickstart pipeline (creating it, or adopting an existing matching one), opens a one-hour dev-mode window that bypasses that pipeline’s rate limits and circuit breaker, and saves an API key as the region default when none is available. It then sends only the server-returned fake Test Pair and verifies it. An explicit --pipeline-id changes that pipeline instead.

Expected outcome

Reports completed steps, fake Test Pair and verification result.

Next steps

  • Configure real callback URLs separately; turn dev mode off when done.

Usage

sh
akedly quickstart

Inspect this command offline before preparing an operation:

sh
akedly describe "quickstart" --output json

Flags

FlagTypeEnum / rangeDescription
--pipeline-idid—Command-specific option; see the full command details below.
--redirect-urltext—Command-specific option; see the full command details below. Tip: For a web page, use an https:// redirect URL; http:// is sent unencrypted, so keep it for a local test server. An app deep link such as yourapp://callback keeps its own scheme, which your app must handle.
--webhook-urltext—Command-specific option; see the full command details below. Tip: Use an https:// webhook URL; http:// is sent unencrypted, so keep it for a local test server. Test the endpoint before it receives production traffic.
--api-keytext—Select a saved API key by its eight-character prefix; never supply a full Secret.
--dry-runboolean switch—Preview without sending the write or creating output files; planning reads may still occur. Bypass consent.
--ksaboolean switch—Select the KSA deployment.
--yesboolean switch—Confirm this action where consent is required.
--helpboolean switch—Show offline command help.
--outputenumjson | humanSelect JSON or human output.
--fieldsdot-paths—Select comma-separated safe dot paths; apply to each element of a root array.

Authentication, permission and guards

Auth: public. Permission: none declared.

Runs: whoami, pipelines list, pipelines create, pipelines get, pipelines update, api-keys create, pipelines dev-mode show, pipelines dev-mode set, otp v1.2 send, otp v1.2 verify. Each step retains its own auth, permissions and consent.

Shared server-guard guidance.

Consent

--yes. --dry-run bypasses confirmation where supported. Destructive: false. Spends money: false. Real send: false.

Retry

Per step: each component retains its own retry class.

Output

Output: data. API output is pass-through server data unless the command details describe a CLI shape. Local commands, composites and hand-offs use their documented CLI shapes.

Full command details

Run a free V1.2 verification using only the server-returned fake Test Pair number and OTP. Requires a Full access CLI Login and --yes, because it changes your account: it activates the Quickstart pipeline (or adopts an existing one), opens a one-hour dev-mode window that bypasses that pipeline's rate limits and circuit breaker, and saves an API key as this region's default when none is available. Reuses a matching Quickstart OTP pipeline or creates one, activates it, saves a key only if none is available, and reads dev mode first, reusing a valid Test Pair window without changing its bypass flags. Only an unusable window is enabled without bypass flags; a short window is refreshed once. Attached widgets and Turnstile-enabled pipelines are refused before dev-mode writes. Callback configuration is reported without claiming webhook delivery. Dry runs list the ordered steps and make no requests. Test Pair numbers and OTPs in this report are fake by design. Name-based reuse requires no prior successful live traffic and zero authentications in the last 24 hours. --pipeline-id explicitly selects your pipeline: dev mode bypasses rate limiting and circuit breaker, and test verification can fire its configured backend webhook. An explicit --pipeline-id changes that pipeline instead of the Quickstart pipeline. Concurrent org members can share this pipeline; refreshing rotates its Test Pair. Selected or environment keys that are revoked or scoped to another pipeline keep their original errors; quickstart never silently replaces them. Newly saved keys are pinned by prefix for the send. Created pipelines retain a revealable webhook secret; next steps show how to save it. The send is refused before posting, with nothing sent, if the Test Pair window would end within 30 seconds. Quickstart covers V1.2 only. For V2, use the separate V2 commands; for a V2 demo, run akedly pipelines sandbox-demo ensure --api-version v2 --yes (needs widgets:create, can adopt same-name resources and resets V2 callbacks) and finish in the dashboard as its help describes.

Worked examples

Examples are synthetic illustrations, never live account records. Replace resource IDs with your own authorized resources. Secret values are omitted here; redacted examples illustrate the shape and are not schema-validation fixtures.

Synthetic workflow

Prove the V1.2 OTP path using Akedly’s fake dev-mode Test Pair, with optional setup of a Quickstart pipeline/key.

sh
akedly quickstart --yes

Illustrative response (sensitive values omitted):

json
{
  "status": "success",
  "data": {
    "steps": [
      {
        "step": "whoami",
        "ok": true,
        "detail": "Completed."
      },
      {
        "step": "pipelines list",
        "ok": true,
        "detail": "Completed."
      },
      {
        "step": "pipelines get",
        "ok": true,
        "detail": "Completed."
      },
      {
        "step": "api-keys create",
        "ok": true,
        "detail": "Completed."
      },
      {
        "step": "pipelines dev-mode show",
        "ok": true,
        "detail": "Completed."
      },
      {
        "step": "otp v1.2 send",
        "ok": true,
        "detail": "Completed."
      },
      {
        "step": "otp v1.2 verify",
        "ok": true,
        "detail": "Completed."
      }
    ],
    "testPair": {
      "phoneNumber": "+15550123456",
      "otp": "123456"
    },
    "result": {
      "pipeline": {
        "_id": "507f1f77bcf86cd799439011",
        "name": "Synthetic Quickstart",
        "active": true
      },
      "apiKey": "[REDACTED — synthetic secret omitted]",
      "verified": true,
      "isTest": true,
      "callbacks": {
        "frontendConfigured": false,
        "backendConfigured": false
      }
    },
    "next": [
      "Configure callback URLs before production use."
    ]
  }
}

Synthetic example represents successful fake Test Pair flow only. Never copy its fake phone/OTP as credentials; the actual Test Pair comes from server dev-mode state. Dry-run lists steps without requests.

This is an offline plan only. A real run sends the server-provided fake Test Pair and can call the configured webhook.

Additional command forms

sh
akedly quickstart --dry-run
sh
akedly quickstart --yes
sh
akedly quickstart --pipeline-id <id> --yes

Input and file contracts

The contract below describes typed arguments, file formats, validation boundaries and API mappings. Boolean switches take no value; numeric and comma-separated values are each passed as one argument. Read prerequisites and full command details for state-dependent requirements.

Response contract

Synthetic example represents successful fake Test Pair flow only. Never copy its fake phone/OTP as credentials; the actual Test Pair comes from server dev-mode state. Dry-run lists steps without requests.

Dry-run performs no requests and returns only the ordered step names; a real successful run separately returns the fake Test Pair and verification outcome.

Common error guidance.

config get

Read the local default output preference used when a command does not choose a mode.

When to use

  • Use to check whether output is set to automatic, JSON or human.

How it works

  1. Reads config.json locally and returns output, defaulting to automatic.

Expected outcome

Current local output preference is returned.

Next steps

  • Set with config set output json or human.

Usage

sh
akedly config get <key>

Inspect this command offline before preparing an operation:

sh
akedly describe "config get" --output json
PositionalGrammarUsage guidance
<key>^output$Use config get output or config set output json|human.

Flags

FlagTypeEnum / rangeDescription
--helpboolean switch—Show offline command help.
--outputenumjson | humanSelect JSON or human output.
--fieldsdot-paths—Select comma-separated safe dot paths; apply to each element of a root array.

Authentication, permission and guards

Auth: public. Permission: none declared.

Shared server-guard guidance.

Consent

none. --dry-run bypasses confirmation where supported. Destructive: false. Spends money: false. Real send: false.

Retry

local: Local command; no HTTP retry.

Output

Output: data. API output is pass-through server data unless the command details describe a CLI shape. Local commands, composites and hand-offs use their documented CLI shapes.

Full command details

Get or set output: config get output; config set output json|human.

Worked examples

Examples are synthetic illustrations, never live account records. Replace resource IDs with your own authorized resources. Secret values are omitted here; redacted examples illustrate the shape and are not schema-validation fixtures.

Synthetic workflow

Read the local default output preference used when a command does not choose a mode.

sh
akedly config get output

Illustrative response (sensitive values omitted):

json
{
  "output": "automatic"
}

Additional command forms

sh
akedly config get output

Input and file contracts

The contract below describes typed arguments, file formats, validation boundaries and API mappings. Boolean switches take no value; numeric and comma-separated values are each passed as one argument. Read prerequisites and full command details for state-dependent requirements.

Response contract

Common error guidance.

config set

Choose the default output rendering mode for future CLI commands.

When to use

  • Use when scripting requires JSON or terminal users prefer human-readable output.

How it works

  1. Updates only the local config.json output setting; dry-run shows a local SET preview without writing.

Expected outcome

The selected preference is returned.

Next steps

  • Run config get output to verify.

Usage

sh
akedly config set <key> <value>

Inspect this command offline before preparing an operation:

sh
akedly describe "config set" --output json
PositionalGrammarUsage guidance
<key>^output$Use config get output or config set output json|human.
<value>^(json|human)$Use config get output or config set output json|human.

Flags

FlagTypeEnum / rangeDescription
--dry-runboolean switch—Preview without sending the write or creating output files; planning reads may still occur. Bypass consent.
--helpboolean switch—Show offline command help.
--outputenumjson | humanSelect JSON or human output.
--fieldsdot-paths—Select comma-separated safe dot paths; apply to each element of a root array.

Authentication, permission and guards

Auth: public. Permission: none declared.

Shared server-guard guidance.

Consent

none. --dry-run bypasses confirmation where supported. Destructive: false. Spends money: false. Real send: false.

Retry

local: Local command; no HTTP retry.

Output

Output: data. API output is pass-through server data unless the command details describe a CLI shape. Local commands, composites and hand-offs use their documented CLI shapes.

Full command details

Get or set output: config get output; config set output json|human.

Worked examples

Examples are synthetic illustrations, never live account records. Replace resource IDs with your own authorized resources. Secret values are omitted here; redacted examples illustrate the shape and are not schema-validation fixtures.

Synthetic workflow

Choose the default output rendering mode for future CLI commands.

sh
akedly config set output json

Illustrative response (sensitive values omitted):

json
{
  "output": "json"
}

This changes local configuration only; it does not call Akedly.

Additional command forms

sh
akedly config set output json

Input and file contracts

The contract below describes typed arguments, file formats, validation boundaries and API mappings. Boolean switches take no value; numeric and comma-separated values are each passed as one argument. Read prerequisites and full command details for state-dependent requirements.

Response contract

This changes local configuration only; it does not call Akedly.

Common error guidance.

cli-logins list

Review active CLI sessions on your own account so unfamiliar or stale access can be ended.

When to use

  • Use when auditing your account’s signed-in machines.

How it works

  1. Reads the active login list for the current user.

Expected outcome

Active sessions and their metadata are returned.

Next steps

  • End a session by id with cli-logins end <id>.

Usage

sh
akedly cli-logins list

Inspect this command offline before preparing an operation:

sh
akedly describe "cli-logins list" --output json

Flags

FlagTypeEnum / rangeDescription
--ksaboolean switch—Select the KSA deployment.
--helpboolean switch—Show offline command help.
--outputenumjson | humanSelect JSON or human output.
--fieldsdot-paths—Select comma-separated safe dot paths; apply to each element of a root array.

Authentication, permission and guards

Auth: login. Permission: none declared.

Server request: GET /cli/logins.

Shared server-guard guidance.

Consent

none. --dry-run bypasses confirmation where supported. Destructive: false. Spends money: false. Real send: false.

Retry

idempotent: Idempotent requests retry network errors and HTTP 429/502/503/504, at most 3 tries, waiting for cooldownSeconds, retryAfter or the Retry-After header (otherwise 1 second) between tries, up to 30 seconds; a longer requested wait is returned as the error.

Output

Output: data. API output is pass-through server data unless the command details describe a CLI shape. Local commands, composites and hand-offs use their documented CLI shapes.

Full command details

List active CLI logins.

Login 429 guidance.

Worked examples

Examples are synthetic illustrations, never live account records. Replace resource IDs with your own authorized resources. Secret values are omitted here; redacted examples illustrate the shape and are not schema-validation fixtures.

Synthetic workflow

Review active CLI sessions on your own account so unfamiliar or stale access can be ended.

sh
akedly cli-logins list

Illustrative response (sensitive values omitted):

json
{
  "status": "success",
  "data": [
    {
      "id": "507f1f77bcf86cd799439011",
      "prefix": "a1b2c3d4",
      "label": "Synthetic workstation",
      "accessLevel": "full",
      "organization": null,
      "personal": true,
      "createdAt": "2030-01-01T00:00:00Z",
      "expiresAt": "2030-01-08T00:00:00Z",
      "lastUsedAt": null,
      "lastCliVersion": "0.0.0-synthetic",
      "current": true,
      "region": "egypt",
      "approvedByStaff": false
    }
  ],
  "meta": {
    "maxActive": 5
  }
}

List fields pass through from backend and may vary with server version.

Additional command forms

sh
akedly cli-logins list

Input and file contracts

The contract below describes typed arguments, file formats, validation boundaries and API mappings. Boolean switches take no value; numeric and comma-separated values are each passed as one argument. Read prerequisites and full command details for state-dependent requirements.

Response contract

List fields pass through from backend and may vary with server version.

The backend returns at most 200 active sessions and includes pagination-independent maxActive metadata.

Common error guidance.

cli-logins end

Revoke one of your own active CLI sessions.

When to use

  • Use after identifying an unwanted or unused session in cli-logins list.

How it works

  1. Posts an end request for the supplied login id.

Expected outcome

That login can no longer authenticate.

Next steps

  • Run cli-logins list to verify remaining sessions.

Usage

sh
akedly cli-logins end <id>

Inspect this command offline before preparing an operation:

sh
akedly describe "cli-logins end" --output json
PositionalGrammarUsage guidance
<id>^[a-fA-F0-9]{24}$Required positional argument.

Flags

FlagTypeEnum / rangeDescription
--ksaboolean switch—Select the KSA deployment.
--dry-runboolean switch—Preview without sending the write or creating output files; planning reads may still occur. Bypass consent.
--helpboolean switch—Show offline command help.
--outputenumjson | humanSelect JSON or human output.
--fieldsdot-paths—Select comma-separated safe dot paths; apply to each element of a root array.

Authentication, permission and guards

Auth: login. Permission: none declared.

Server request: POST /cli/logins/:id/end.

Shared server-guard guidance.

Consent

none. --dry-run bypasses confirmation where supported. Destructive: false. Spends money: false. Real send: false.

Retry

idempotent: Idempotent requests retry network errors and HTTP 429/502/503/504, at most 3 tries, waiting for cooldownSeconds, retryAfter or the Retry-After header (otherwise 1 second) between tries, up to 30 seconds; a longer requested wait is returned as the error.

Output

Output: data. API output is pass-through server data unless the command details describe a CLI shape. Local commands, composites and hand-offs use their documented CLI shapes.

Full command details

End the selected CLI login.

Login 429 guidance.

Worked examples

Examples are synthetic illustrations, never live account records. Replace resource IDs with your own authorized resources. Secret values are omitted here; redacted examples illustrate the shape and are not schema-validation fixtures.

Synthetic workflow

Revoke one of your own active CLI sessions.

sh
akedly cli-logins end 507f1f77bcf86cd799439011

Illustrative response (sensitive values omitted):

json
{
  "status": "success",
  "data": {
    "ended": true,
    "id": "507f1f77bcf86cd799439011"
  }
}

Ending the current login may remove the credential used by this command.

Additional command forms

sh
akedly cli-logins end <id>

Input and file contracts

The contract below describes typed arguments, file formats, validation boundaries and API mappings. Boolean switches take no value; numeric and comma-separated values are each passed as one argument. Read prerequisites and full command details for state-dependent requirements.

Response contract

Ending the current login may remove the credential used by this command.

Common error guidance.

cli-logins team list

Let an organization admin inspect active CLI sessions belonging to organization members.

When to use

  • Use for organization access review or incident response.

How it works

  1. Reads organization CLI logins using the current organization admin session.

Expected outcome

Organization session metadata is returned without CLI secrets.

Next steps

  • Ask the session owner or use team end <id> to revoke one.

Usage

sh
akedly cli-logins team list

Inspect this command offline before preparing an operation:

sh
akedly describe "cli-logins team list" --output json

Flags

FlagTypeEnum / rangeDescription
--ksaboolean switch—Select the KSA deployment.
--helpboolean switch—Show offline command help.
--outputenumjson | humanSelect JSON or human output.
--fieldsdot-paths—Select comma-separated safe dot paths; apply to each element of a root array.

Authentication, permission and guards

Auth: login. Permission: none declared.

Server request: GET /cli/team-logins.

Shared server-guard guidance.

Consent

none. --dry-run bypasses confirmation where supported. Destructive: false. Spends money: false. Real send: false.

Retry

idempotent: Idempotent requests retry network errors and HTTP 429/502/503/504, at most 3 tries, waiting for cooldownSeconds, retryAfter or the Retry-After header (otherwise 1 second) between tries, up to 30 seconds; a longer requested wait is returned as the error.

Output

Output: data. API output is pass-through server data unless the command details describe a CLI shape. Local commands, composites and hand-offs use their documented CLI shapes.

Full command details

List your organization's active CLI logins (team admins).

Login 429 guidance.

Worked examples

Examples are synthetic illustrations, never live account records. Replace resource IDs with your own authorized resources. Secret values are omitted here; redacted examples illustrate the shape and are not schema-validation fixtures.

Synthetic workflow

Let an organization admin inspect active CLI sessions belonging to organization members.

sh
akedly cli-logins team list

Illustrative response (sensitive values omitted):

json
{
  "status": "success",
  "data": [
    {
      "id": "507f1f77bcf86cd799439011",
      "prefix": "a1b2c3d4",
      "label": "Synthetic workstation",
      "accessLevel": "full",
      "organization": null,
      "personal": true,
      "createdAt": "2030-01-01T00:00:00Z",
      "expiresAt": "2030-01-08T00:00:00Z",
      "lastUsedAt": null,
      "lastCliVersion": "0.0.0-synthetic",
      "current": true,
      "region": "egypt",
      "approvedByStaff": false,
      "person": {
        "memberId": "user_synthetic",
        "email": "member@example.invalid",
        "name": "Synthetic Member",
        "isOwner": false
      }
    }
  ],
  "meta": {
    "maxActive": 5
  }
}

Requires organization-admin access; login records do not expose credentials.

Additional command forms

sh
akedly cli-logins team list

Input and file contracts

The contract below describes typed arguments, file formats, validation boundaries and API mappings. Boolean switches take no value; numeric and comma-separated values are each passed as one argument. Read prerequisites and full command details for state-dependent requirements.

Response contract

Requires organization-admin access; login records do not expose credentials.

The backend enriches team rows with member name/email when available; that identity data may be omitted (person:null) if the directory lookup is unavailable.

Common error guidance.

cli-logins team end

Revoke an organization member’s CLI session when an admin determines it should no longer be active.

When to use

  • Use after reviewing it with cli-logins team list.

How it works

  1. Posts an organization session termination; the CLI requires --yes before the action.

Expected outcome

The selected member session is ended.

Next steps

  • Re-list team sessions to verify.

Usage

sh
akedly cli-logins team end <id>

Inspect this command offline before preparing an operation:

sh
akedly describe "cli-logins team end" --output json
PositionalGrammarUsage guidance
<id>^[a-fA-F0-9]{24}$Required positional argument.

Flags

FlagTypeEnum / rangeDescription
--ksaboolean switch—Select the KSA deployment.
--dry-runboolean switch—Preview without sending the write or creating output files; planning reads may still occur. Bypass consent.
--yesboolean switch—Confirm this action where consent is required.
--helpboolean switch—Show offline command help.
--outputenumjson | humanSelect JSON or human output.
--fieldsdot-paths—Select comma-separated safe dot paths; apply to each element of a root array.

Authentication, permission and guards

Auth: login. Permission: none declared.

Server request: POST /cli/team-logins/:id/end.

Shared server-guard guidance.

Consent

--yes. --dry-run bypasses confirmation where supported. Destructive: true. Spends money: false. Real send: false.

Retry

idempotent: Idempotent requests retry network errors and HTTP 429/502/503/504, at most 3 tries, waiting for cooldownSeconds, retryAfter or the Retry-After header (otherwise 1 second) between tries, up to 30 seconds; a longer requested wait is returned as the error.

Output

Output: data. API output is pass-through server data unless the command details describe a CLI shape. Local commands, composites and hand-offs use their documented CLI shapes.

Full command details

End a CLI login in your organization (team admins; needs --yes).

Login 429 guidance.

Worked examples

Examples are synthetic illustrations, never live account records. Replace resource IDs with your own authorized resources. Secret values are omitted here; redacted examples illustrate the shape and are not schema-validation fixtures.

Synthetic workflow

Revoke an organization member’s CLI session when an admin determines it should no longer be active.

sh
akedly cli-logins team end 507f1f77bcf86cd799439012 --yes

Illustrative response (sensitive values omitted):

json
{
  "status": "success",
  "data": {
    "ended": true,
    "id": "507f1f77bcf86cd799439011"
  }
}

Destructive access change; owner-protected sessions may be refused.

Additional command forms

sh
akedly cli-logins team end <id>

Input and file contracts

The contract below describes typed arguments, file formats, validation boundaries and API mappings. Boolean switches take no value; numeric and comma-separated values are each passed as one argument. Read prerequisites and full command details for state-dependent requirements.

Response contract

Destructive access change; owner-protected sessions may be refused.

Common error guidance.