Skip to content
Akedly
Command reference

CLI command reference

Generated reference for the Akedly CLI. Find commands by subject, then read their complete flags, consent and recovery guidance.

Subject pages

228 commands. Each command is assigned exactly once.

Agent rules

  • Discover command names with akedly commands --fields name,help. Before planning a task, run akedly describe "<canonical command name>" --output json for that command’s purpose, prerequisites, typed inputs, file contents, response schema, examples and recovery rules. Describe is offline and needs no login. Load only the commands needed for the task; agent-guide is the optional complete handbook.

  • Set AKEDLY_OUTPUT=json for agents. JSON stdout is one document; warnings and progress use stderr. Setting tips are advice only and arrive on stderr after a command succeeds, in JSON as {"event":"tip","action","flag","tip"}, where action names the command that wrote the setting (inside quickstart, the step) and a context tip has no flag.

  • Use --yes only when the person asked for that action. Destructive, money-spending and real-send commands require --yes; some other commands require it when a listed flag is supplied. --dry-run bypasses confirmation.

  • Human output prints each value on one line and escapes control characters, line breaks, U+2028, U+2029 and bidirectional embedding, override and isolate controls as \uXXXX; Arabic text and --json are unaffected, and human agent-guide output remains raw Markdown.

  • Never print secrets, API keys, CLI Login credentials or live OTP fields into chat. Keep output private; use a secret-file sink or --save where supported.

  • Prefer dev-mode Test Pairs. Real sends can be billed. Enable dev mode explicitly; dashboard test commands never enable it or bypass flags.

  • Read code, hint and the exit code before deciding the next action. Use --help for flags and examples; --dry-run sends no write and writes no guide or secret file. It makes the same planning reads as a real run, including the public verification-method catalog, current settings and revisions, permissions, linked resources and requested traffic recommendations. Authenticated planning reads need the same permissions as a real run. A widget-only create preview makes no requests; a create with linked pipeline settings checks that pipeline and permissions. Secrets and setup tokens are masked in previews.

Credentials and region

Sending Commands use AKEDLY_API_KEY or a saved API key, never a CLI Login. --api-key <eight-character prefix> selects a saved key before the environment key; otherwise the region default is used. Never put a full Secret on the command line. V1.2 and status send x-api-key; V1 create and V2 attempt carry the key in the JSON body. Public activation and verification send no credentials.

Auth: login uses the CLI Login created by akedly login. Auth: api-key uses the Sending Command credential described above. Auth: public sends no credentials.

Login names the CLI Login after this machine; pass --machine-name <name> (up to 60 characters) to choose a different name. The approval page prefills its editable Login name field (up to 60 characters) with that name, so the approver can change it before approving; the CLI Logins page shows the approved name.

--ksa selects the KSA deployment for any server command. Region precedence: --ksa, then AKEDLY_REGION (egypt or ksa), then the stored region, then Egypt. Login ignores the stored region and defaults to Egypt unless --ksa or AKEDLY_REGION selects KSA. An invalid AKEDLY_REGION exits 64 before network access.

Flags and output

Flag tables use the effective flags from the CLI manifest, including its server and global flags. A boolean switch takes no value; true/false enums take an explicit value. Required means unconditionally required by the manifest; conditional, alternative and handler-specific requirements remain in the full command details. Defaults absent from manifest metadata are not guessed; consult those details for runtime or server defaults.

akedly commands --json returns a bare array without an envelope. --fields a,b.c selects those paths from each root-array element, retaining order; otherwise paths start at the response root. Missing paths are omitted. Inside an envelope, select list elements with paths such as data.0.name. Teammate and organization identifiers print as memberId, ownerMemberId, organizationId and organizationRole in every command’s output, and --fields uses those names. Output: data means pass-through API data, which can contain personal data; local commands, composites and hand-offs return their documented CLI shapes. secret-sink, live-otp and echo-scrub are privacy classifications, not permission to publish output.

secret-sink: Use the supported sink; default output may contain a secret. live-otp: Responses may contain live OTP fields; keep them private. echo-scrub: echo-scrub masks secret-shaped text, credential fields, secret query parameters and JSON secret fields inside strings in the response, such as a webhook receiver echo or BYO-SMS steps; keep the output private anyway.

Pagination

--all cannot be combined with --page. It requests pages in order, verifies the server page matches the requested page, deduplicates _id, and stops after 1000 pages. A nonterminal page with no new ids is refused; a terminal duplicate-only page completes. The first envelope is returned with all rows and the final pagination. Offset pagination can skip or duplicate rows while data changes; deduplication cannot recover skipped rows. Mid-loop failure returns pagesFetched without partial rows. Each page uses the login request budget.

Retry rules

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.

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.

Login scheme: a 429 without a server code is displayed as CLI_RATE_LIMITED; that display label does not make a non-idempotent request retry. Other server codes are preserved. Only a server response explicitly coded CLI_RATE_LIMITED gets the pre-operation retry exception, because that refusal sends nothing (at most 3 tries).

Local command; no HTTP retry.

The final send POST of a send command is never retried, except that under the login scheme a refusal coded CLI_RATE_LIMITED, which sends nothing, is retried as described above. A challenge GET inside a send command is a retried read.

These are transport classes, not a guarantee that an entire multi-step action repeats safely. Command-specific help and recovery instructions still apply. A browser hand-off prints or opens a link; it does not itself require --yes. Consult each command’s consent row. Destructive, Spends money and Real send are consent classes that decide when --yes is required; a false flag value does not mean the command has no server-side effect. Read the full command details for side effects.

Server guards

Important server guards and prerequisites are described in each command’s full details. The manifest does not encode a complete server guard inventory.

Errors

Use the shared root hints and exit codes when their codes are returned. This is fallback guidance, not a promise that every listed code can occur for a command. Preserve the actual code and HTTP status; inspect state before repeating an uncertain write.

Own hints take precedence where defined. Root hints below are used only when the corresponding code is returned; they do not assert that a command can return every code. API error shapes vary; the CLI normalizes them. Read the actual code, HTTP status, hint and exit status.

CodeExit
SUCCESS0
USAGE64
CONFIRMATION_REQUIRED65
LOGIN_REQUIRED66
PERMISSION_DENIED67
ORG_ADMIN_REQUIRED67
OWNER_REQUIRED67
CLI_READ_ONLY67
IMPERSONATION_BLOCKED67
SELF_IDENTITY_REQUIRED67
CLI_LOGIN_OWNER_PROTECTED67
NEEDS_BROWSER68
SETUP_REQUIRED68
CLI_RATE_LIMITED69
NOT_AVAILABLE_ON_SERVER70
CLI_UPGRADE_REQUIRED70
CLI_DISABLED70

Exit 1 covers codes outside this table. HTTP 429 exits 69 even for a code not in the table.

Root codeFallback hint
TOTP_DELETE_RECONCILIATION_PENDINGAny 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_DELIVEREDRun akedly login again.
CLI_LOGIN_INVALIDRun akedly login.
PERMISSION_DENIEDIf 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_REQUIREDIf 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_REQUIREDOnly 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_REQUIREDRun akedly login. If you supplied a credential, check --ksa or AKEDLY_REGION.
CLI_DISABLEDCustomer CLI access is turned off on this Akedly server. Try again later or contact Akedly support.
CLI_IDENTITY_UNAVAILABLEAkedly could not confirm your login right now. Wait a minute and try again.
CLI_LOGIN_INDEX_UNAVAILABLECLI login is temporarily unavailable on this server. Try again later or contact Akedly support.
WABA_PHONE_CHECK_UNAVAILABLEMeta did not confirm the number. Wait a few minutes, then run the command again.
CLI_UPGRADE_REQUIREDInstall the latest @akedly/cli.
NOT_AVAILABLE_ON_SERVERCheck the selected region or ask an operator to deploy CLI support.
CLI_RATE_LIMITEDWait before trying again.
CLI_LOGIN_DENIEDRun akedly login again and approve the new code.
CLI_LOGIN_REQUEST_EXPIREDRun akedly login again.
LOGIN_TIMEOUTRun akedly login again and approve before the timeout.
CLI_READ_ONLYThis login is read-only. Run akedly login and choose Full access.
CLI_LOGIN_LIMIT_REACHEDRun akedly cli-logins list, then akedly cli-logins end <id>
CLI_LOGIN_NOT_FOUNDRun akedly cli-logins list and check the login id.
CLI_LOGIN_OWNER_PROTECTEDAsk the account owner to end this login.
IMPERSONATION_BLOCKEDThis login was approved by Akedly staff and can't do this. Run akedly login and approve it in your own dashboard session.
SELF_IDENTITY_REQUIREDPersonal settings need your own login. Run akedly login and approve it in your own dashboard session.
MEMBER_NOT_FOUNDCheck the email with akedly team members list; a pending invitation is not a member yet.
MEMBER_AMBIGUOUSPass the memberId from akedly team members list instead of the email.
API_KEY_ACTIVE_CAP_REACHEDRevoke an unused key before creating another.
API_KEY_ISSUANCE_DISABLEDAsk an operator to enable API-key issuance.
API_KEY_VERSION_CONFLICTList the keys and retry the edit with the current version.
API_KEY_BUDGET_CONFIRMATION_REQUIREDReview the reduction and pass --confirm-budget-reduction.
API_KEY_ISSUE_RECOVERY_UNAVAILABLERevoke the key and create a new one.
API_KEY_TRANSITION_UNAVAILABLERevoke the key and create a new one.
API_KEY_ISSUE_IDEMPOTENCY_CONFLICTUse a new idempotency key for different issue details.
API_KEY_SCOPE_NOT_ACTIVEAsk an operator to enable API-key scope editing.
API_KEY_BUDGET_NOT_ACTIVEAsk an operator to enable API-key budget editing.
API_KEY_NOT_FOUNDRun akedly api-keys list and check the id.
API_KEY_BUDGET_RACEList the keys and retry.
V1_CREATION_NOT_ENTITLEDV1 pipelines are not available to this account. Omit --api-version to create a V1.2 pipeline.
SECRET_SUFFIX_REQUIREDPass exactly one of --secret-file <saved path> or --secret-suffix <last 4 characters>.
SECRET_SUFFIX_MISMATCHReveal 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_AVAILABLENothing 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_UNAVAILABLENothing 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_REQUIREDA 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_PIPELINENothing 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_CHANGEDAnother 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_INVALIDCheck 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_INVALIDThe 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_REQUIREDNothing 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_TRAFFICKeep 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_POLICYNothing 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_CHANGEDAnother change landed first. Run akedly pipelines get <id> and retry.
TURNSTILE_PIPELINE_CHANGEDAnother change landed first. Run akedly pipelines get <id> and retry.
CLUSTER_GATE_PIPELINE_CHANGEDAnother change landed first. Run akedly pipelines get <id> and retry.
CLUSTER_GATE_NOT_AVAILABLENothing 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_ACKNOWLEDGEDThe 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_READYFix 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_UNAVAILABLEWidget identity indexes are unavailable. Retry later or contact Akedly support.
INCOMPLETE_DATE_RANGESupply both --start-date and --end-date, or neither.
DATE_RANGE_TOO_LARGEChoose a date range of at most 30 days, counted as the command help describes.
INVALID_DATE_RANGECheck both date bounds and their order.
INVALID_DATEUse valid ISO dates for the requested range.
NEEDS_BROWSERTurn 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_REQUIREDFinish phone setup on the Personal Notifications page of your Akedly dashboard, then retry.
INVALID_API_KEYCheck the API key: akedly api-keys list, or create one with akedly api-keys create --label <name> --save --yes.
API_KEY_SCOPE_DENIEDThis API key is scoped to other pipelines; use a key that includes this pipeline.
MAX_ATTEMPTS_EXCEEDEDToo many wrong codes; send a new OTP.
ALREADY_VERIFIEDThis request is already verified; check it with akedly transactions status.
INVALID_OTPCheck the code and retry; attempts are limited.
PIPELINE_INACTIVERun akedly pipelines update <pipelineId> --status active --yes, then retry.
POW_CHALLENGE_EXPIREDRun the command again; it fetches a fresh challenge.
POW_CHALLENGE_REPLAYEDRun the command again; it fetches a fresh challenge.
POW_DIFFICULTY_STALERun the command again; it fetches a fresh challenge.
STATUS_LOOKUP_RATE_LIMITEDWait for the retryAfter seconds in details, then retry; each lookup counts against the 300 ids per minute limit.
TRANSACTION_EXPIREDThis code or request has expired; send a new one.
USE_V1_2_ENDPOINTThis pipeline is V1.2. Use akedly otp v1.2 send.
SIGNATURE_EXPIREDThis 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_MISMATCHThis API key belongs to a different account than the widget. Use a key from the widget owner's account.
WEBHOOK_SIGNATURE_INVALIDUse 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_EXPIREDThe 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_FAILEDThe verification failed and cannot complete; start a new one.
WAIT_TIMEOUTThe 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_STALEThe 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_MISSINGPass a headers JSON file with the svix-id, svix-timestamp and svix-signature headers exactly as received.
NO_USABLE_API_KEYThis 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_VERSIONThis 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_FAILEDFix the failed checks in details.checks, then run akedly doctor again.
PAGINATION_LIMITNarrow the filters, for example a date range or status, or raise --limit (maximum 100), then run again.
PAGINATION_STALLEDThe list changed while it was being read, or the server stopped advancing. Run the command again.
REPORT_NOT_FOUNDRun akedly reports list and check the reportId.
DAILY_LIMIT_REACHEDWait 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_PROGRESSA report is already generating for this account; dashboard and teammate generations share the same slot. Run akedly reports list before trying again.
TEMPLATE_DUPLICATERun akedly whatsapp otp-templates list; recover missing languages with update --add-languages instead of adding the same template again.
TEMPLATE_LIMIT_REACHEDArchive an unused template with akedly whatsapp otp-templates delete <id> --yes before adding another; the limit is 20 per WABA.
TEMPLATE_PROVISIONING_FAILEDThe template or changes are saved. Run akedly whatsapp otp-templates list, then update <id> --add-languages <failed languages> rather than creating again.
TEMPLATE_WABA_REQUIREDConnect an active own WhatsApp Business Account in the dashboard before managing OTP templates; check akedly whatsapp status.
TEMPLATE_WABA_CHANGEDThis template belongs to the previous WABA. Add it again for the currently connected account.
COUNTRY_CATALOG_UNAVAILABLEThe country catalog is temporarily unavailable. Try again later.
NOT_A_UTILITY_PIPELINEChoose an owned utility pipeline from akedly pipelines list, or create one with akedly pipelines create --product utility --name <name>.
TEST_RATE_LIMITEDWait 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_STALEThe sending address changed. Run akedly byo-sms vodafone readiness, check the new address list, then acknowledge again with the new fingerprint.
VODAFONE_EGRESS_NOT_READYRun akedly byo-sms vodafone readiness; ask Akedly support to verify the outbound addresses before acknowledging.
UNROUTABLE_COUNTRYRun akedly byo-sms countries and choose routable country codes; use ALL alone for catch-all coverage.
SOURCE_COVERAGE_UNROUTABLEUpdate the source integration countries using akedly byo-sms countries, then clone again.
INVALID_TEST_PHONESupply --test-phone-number in international format or update the saved test destination.
TEST_PHONE_OUT_OF_COVERAGEChoose a test number in the integration countries, or update its countries before testing.
VODAFONE_TEST_GUARD_UNAVAILABLENo new test was sent. Retry with the same idempotencyKey; contact Akedly support if send protection remains unavailable.
VODAFONE_TEST_IDEMPOTENCY_KEY_REQUIREDSupply --idempotency-key with a unique request key and reuse it after an uncertain response.
VODAFONE_TEST_IDEMPOTENCY_KEY_INVALIDSupply --idempotency-key with 1 to 255 characters.
VODAFONE_ACCEPTED_RETEST_INVALIDSupply --previous-test-key with the accepted test key before requesting another test.
VODAFONE_ACCEPTED_RETEST_REQUIREDCheck 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_REQUIREDCheck 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_PROGRESSWait for the current Vodafone test result; inspect akedly byo-sms get <id> before starting another attempt.
BYO_SMS_CONFIGURATION_CHANGEDRun akedly byo-sms get <id>, test the current configuration, then try activation again.
VODAFONE_CONFIGURATION_CHANGEDRun akedly byo-sms get <id>, test the current configuration, then try activation again.
BYO_SMS_STEPS_INVALIDCheck the steps JSON and secret names; secret and extraction names use letters, numbers and underscore.