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
- 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
akedly login
Inspect this command offline before preparing an operation:
akedly describe "login" --output json
Flags
| Flag | Type | Enum / range | Description |
|---|---|---|---|
--ksa | boolean switch | — | Select the KSA deployment. |
--open | boolean switch | — | Command-specific option; see the full command details below. |
--timeout | seconds | — | Command-specific option; see the full command details below. |
--machine-name | text | — | Command-specific option; see the full command details below. Manifest body field: machineName. |
--dry-run | boolean switch | — | Preview without sending the write or creating output files; planning reads may still occur. Bypass consent. |
--help | boolean switch | — | Show offline command help. |
--output | enum | json | human | Select JSON or human output. |
--fields | dot-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.
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.
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.
akedly login
Illustrative response (sensitive values omitted):
{
"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
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.
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
- 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
akedly logout
Inspect this command offline before preparing an operation:
akedly describe "logout" --output json
Flags
| Flag | Type | Enum / range | Description |
|---|---|---|---|
--ksa | boolean switch | — | Select the KSA deployment. |
--dry-run | boolean switch | — | Preview without sending the write or creating output files; planning reads may still occur. Bypass consent. |
--help | boolean switch | — | Show offline command help. |
--output | enum | json | human | Select JSON or human output. |
--fields | dot-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.
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.
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.
akedly logout
Illustrative response (sensitive values omitted):
{
"status": "success",
"data": {
"ended": true
}
}
If AKEDLY_CLI_LOGIN supplies the credential, unset that environment variable separately.
Additional command forms
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.
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
- 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
akedly whoami
Inspect this command offline before preparing an operation:
akedly describe "whoami" --output json
Flags
| Flag | Type | Enum / range | Description |
|---|---|---|---|
--ksa | boolean switch | — | Select the KSA deployment. |
--help | boolean switch | — | Show offline command help. |
--output | enum | json | human | Select JSON or human output. |
--fields | dot-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.
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.
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.
akedly whoami
Illustrative response (sensitive values omitted):
{
"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
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.
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
- 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
akedly commands
Inspect this command offline before preparing an operation:
akedly describe "commands" --output json
Flags
| Flag | Type | Enum / range | Description |
|---|---|---|---|
--json | boolean switch | — | Command-specific option; see the full command details below. |
--help | boolean switch | — | Show offline command help. |
--output | enum | json | human | Select JSON or human output. |
--fields | dot-paths | — | Select comma-separated safe dot paths; apply to each element of a root array. |
Authentication, permission and guards
Auth: public. Permission: none declared.
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.
akedly commands --json
Illustrative response (sensitive values omitted):
[
{
"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
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.
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
- 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
akedly describe <command>
Inspect this command offline before preparing an operation:
akedly describe "describe" --output json
| Positional | Grammar | Usage guidance |
|---|---|---|
| <command> | Text | Required positional argument. |
Flags
| Flag | Type | Enum / range | Description |
|---|---|---|---|
--help | boolean switch | — | Show offline command help. |
--output | enum | json | human | Select JSON or human output. |
--fields | dot-paths | — | Select comma-separated safe dot paths; apply to each element of a root array. |
Authentication, permission and guards
Auth: public. Permission: none declared.
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.
akedly describe 'config get'
Illustrative response (sensitive values omitted):
{
"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
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.
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
- Renders markdown locally; without
--writereturns raw markdown in human mode or a success/data guide object in JSON mode.--writecreates 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
akedly agent-guide
Inspect this command offline before preparing an operation:
akedly describe "agent-guide" --output json
Flags
| Flag | Type | Enum / range | Description |
|---|---|---|---|
--write | text | — | Command-specific option; see the full command details below. |
--dry-run | boolean switch | — | Preview without sending the write or creating output files; planning reads may still occur. Bypass consent. |
--help | boolean switch | — | Show offline command help. |
--output | enum | json | human | Select JSON or human output. |
--fields | dot-paths | — | Select comma-separated safe dot paths; apply to each element of a root array. |
Authentication, permission and guards
Auth: public. Permission: none declared.
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.
akedly agent-guide
Illustrative response (sensitive values omitted):
{
"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
akedly agent-guide
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.
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
- 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
akedly doctor
Inspect this command offline before preparing an operation:
akedly describe "doctor" --output json
Flags
| Flag | Type | Enum / range | Description |
|---|---|---|---|
--pipeline-id | id | — | Command-specific option; see the full command details below. |
--ksa | boolean switch | — | Select the KSA deployment. |
--help | boolean switch | — | Show offline command help. |
--output | enum | json | human | Select JSON or human output. |
--fields | dot-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.
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.
akedly doctor
Illustrative response (sensitive values omitted):
{
"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
akedly doctor
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.
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
- Requires Full access and
--yeson 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-idchanges 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
akedly quickstart
Inspect this command offline before preparing an operation:
akedly describe "quickstart" --output json
Flags
| Flag | Type | Enum / range | Description |
|---|---|---|---|
--pipeline-id | id | — | Command-specific option; see the full command details below. |
--redirect-url | text | — | 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-url | text | — | 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-key | text | — | Select a saved API key by its eight-character prefix; never supply a full Secret. |
--dry-run | boolean switch | — | Preview without sending the write or creating output files; planning reads may still occur. Bypass consent. |
--ksa | boolean switch | — | Select the KSA deployment. |
--yes | boolean switch | — | Confirm this action where consent is required. |
--help | boolean switch | — | Show offline command help. |
--output | enum | json | human | Select JSON or human output. |
--fields | dot-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.
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.
akedly quickstart --yes
Illustrative response (sensitive values omitted):
{
"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
akedly quickstart --dry-run
akedly quickstart --yes
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.
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
- 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
akedly config get <key>
Inspect this command offline before preparing an operation:
akedly describe "config get" --output json
| Positional | Grammar | Usage guidance |
|---|---|---|
| <key> | ^output$ | Use config get output or config set output json|human. |
Flags
| Flag | Type | Enum / range | Description |
|---|---|---|---|
--help | boolean switch | — | Show offline command help. |
--output | enum | json | human | Select JSON or human output. |
--fields | dot-paths | — | Select comma-separated safe dot paths; apply to each element of a root array. |
Authentication, permission and guards
Auth: public. Permission: none declared.
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.
akedly config get output
Illustrative response (sensitive values omitted):
{
"output": "automatic"
}
Additional command forms
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
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
- 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
akedly config set <key> <value>
Inspect this command offline before preparing an operation:
akedly describe "config set" --output json
| Positional | Grammar | Usage 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
| Flag | Type | Enum / range | Description |
|---|---|---|---|
--dry-run | boolean switch | — | Preview without sending the write or creating output files; planning reads may still occur. Bypass consent. |
--help | boolean switch | — | Show offline command help. |
--output | enum | json | human | Select JSON or human output. |
--fields | dot-paths | — | Select comma-separated safe dot paths; apply to each element of a root array. |
Authentication, permission and guards
Auth: public. Permission: none declared.
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.
akedly config set output json
Illustrative response (sensitive values omitted):
{
"output": "json"
}
This changes local configuration only; it does not call Akedly.
Additional command forms
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.
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
- 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
akedly cli-logins list
Inspect this command offline before preparing an operation:
akedly describe "cli-logins list" --output json
Flags
| Flag | Type | Enum / range | Description |
|---|---|---|---|
--ksa | boolean switch | — | Select the KSA deployment. |
--help | boolean switch | — | Show offline command help. |
--output | enum | json | human | Select JSON or human output. |
--fields | dot-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.
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.
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.
akedly cli-logins list
Illustrative response (sensitive values omitted):
{
"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
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.
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
- 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
akedly cli-logins end <id>
Inspect this command offline before preparing an operation:
akedly describe "cli-logins end" --output json
| Positional | Grammar | Usage guidance |
|---|---|---|
| <id> | ^[a-fA-F0-9]{24}$ | Required positional argument. |
Flags
| Flag | Type | Enum / range | Description |
|---|---|---|---|
--ksa | boolean switch | — | Select the KSA deployment. |
--dry-run | boolean switch | — | Preview without sending the write or creating output files; planning reads may still occur. Bypass consent. |
--help | boolean switch | — | Show offline command help. |
--output | enum | json | human | Select JSON or human output. |
--fields | dot-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.
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.
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.
akedly cli-logins end 507f1f77bcf86cd799439011
Illustrative response (sensitive values omitted):
{
"status": "success",
"data": {
"ended": true,
"id": "507f1f77bcf86cd799439011"
}
}
Ending the current login may remove the credential used by this command.
Additional command forms
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.
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
- 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
akedly cli-logins team list
Inspect this command offline before preparing an operation:
akedly describe "cli-logins team list" --output json
Flags
| Flag | Type | Enum / range | Description |
|---|---|---|---|
--ksa | boolean switch | — | Select the KSA deployment. |
--help | boolean switch | — | Show offline command help. |
--output | enum | json | human | Select JSON or human output. |
--fields | dot-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.
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).
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.
akedly cli-logins team list
Illustrative response (sensitive values omitted):
{
"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
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.
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
- Posts an organization session termination; the CLI requires
--yesbefore the action.
Expected outcome
The selected member session is ended.
Next steps
- Re-list team sessions to verify.
Usage
akedly cli-logins team end <id>
Inspect this command offline before preparing an operation:
akedly describe "cli-logins team end" --output json
| Positional | Grammar | Usage guidance |
|---|---|---|
| <id> | ^[a-fA-F0-9]{24}$ | Required positional argument. |
Flags
| Flag | Type | Enum / range | Description |
|---|---|---|---|
--ksa | boolean switch | — | Select the KSA deployment. |
--dry-run | boolean switch | — | Preview without sending the write or creating output files; planning reads may still occur. Bypass consent. |
--yes | boolean switch | — | Confirm this action where consent is required. |
--help | boolean switch | — | Show offline command help. |
--output | enum | json | human | Select JSON or human output. |
--fields | dot-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.
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).
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.
akedly cli-logins team end 507f1f77bcf86cd799439012 --yes
Illustrative response (sensitive values omitted):
{
"status": "success",
"data": {
"ended": true,
"id": "507f1f77bcf86cd799439011"
}
}
Destructive access change; owner-protected sessions may be refused.
Additional command forms
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.
