Utilities templates
Akedly CLI command reference: Utilities templates.
utilities templates library
find a Meta or Akedly-curated utility-template starting point before authoring.
When to use
- find a Meta or Akedly-curated utility-template starting point before authoring.
How it works
- Search the live library with language/search/topic and page with Meta paging.after; curated seeds repeat on every page and ignore topic.
Prerequisites
- Authenticated account with utilities:read permission.
Expected outcome
Returns library results and availability; if Meta is unavailable curated seeds remain available.
Next steps
- Copy/adapt a result, remove its server metadata, then lint a local file.
Usage
akedly utilities templates library
Inspect this command offline before preparing an operation:
akedly describe "utilities templates library" --output json
Flags
| Flag | Type | Enum / range | Description |
|---|---|---|---|
--ksa | boolean switch | — | Select the KSA deployment. |
--search | text | — | Command-specific option; see the full command details below. Query parameter: search. |
--topic | text | — | Command-specific option; see the full command details below. Query parameter: topic. |
--language | enum | en | ar | Command-specific option; see the full command details below. Query parameter: language. |
--after | text | — | Command-specific option; see the full command details below. Query parameter: after. |
--limit | integer | 1 to 100 | Command-specific option; see the full command details below. Query parameter: limit. |
--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: utilities:read.
Server request: GET /utilities/templates/library.
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
Browse the live Meta Template Library and Akedly curated seeds. --language defaults to en; --limit defaults to 100 (maximum 100). Pass data.paging.after as --after for the next Meta page. Curated seeds are returned again on every --after page and ignore --topic. There is no numeric --page or --all. If the live library is unavailable, libraryAvailable:false and curated seeds remain a successful response. Copy and adapt an entry before creating a template. Read-only logins are supported.
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 CLI scenario
find a Meta or Akedly-curated utility-template starting point before authoring.
akedly utilities templates library --language en --limit 10
Illustrative response (sensitive values omitted):
{
"status": "success",
"data": {
"libraryAvailable": true,
"meta": [
{
"id": "meta-library-example-1",
"name": "order_update",
"language": "en_US",
"category": "UTILITY",
"body": "Your order {{1}} is ready.",
"body_params": [
"order id"
],
"body_param_types": [
"text"
],
"buttons": []
}
],
"curated": [
{
"id": "seed-order-confirmed-en",
"name": "Order confirmed",
"language": "en",
"category": "UTILITY",
"body": "Hi {{name}}, your order {{order_id}} is confirmed.",
"variables": [
{
"name": "name",
"example": "Sam"
},
{
"name": "order_id",
"example": "ORD-17"
}
]
}
],
"paging": {
"after": "cursor-example",
"hasMore": true
}
}
}
Resource identifiers and records are fictional prerequisites, not claims that these resources exist.
Additional command forms
akedly utilities templates library
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
Browse the live Meta Template Library and Akedly curated seeds. --language defaults to en; --limit defaults to 100 (maximum 100). Pass data.paging.after as --after for the next Meta page. Curated seeds are returned again on every --after page and ignore --topic. There is no numeric --page or --all. If the live library is unavailable, libraryAvailable:false and curated seeds remain a successful response. Copy and adapt an entry before creating a template. Read-only logins are supported.
Response fields outside the modeled stable fields may be passed through from the server.
The API response envelope is preserved by the CLI; stable fields are modeled and other server fields remain extensible.
Own recovery guidance
| Code | Hint |
|---|---|
| INVALID_QUERY | Use text values for --search, --topic and --after. |
| INVALID_LANGUAGE | Choose --language en or ar. |
utilities templates list
review owned utility-template statuses and locate a template before inspecting or changing it.
When to use
- review owned utility-template statuses and locate a template before inspecting or changing it.
How it works
- Filter by Akedly status/name and page through owned templates; offset pages can shift while records change.
Prerequisites
- Authenticated account with utilities:read permission.
Expected outcome
Returns a page or all requested pages, with server pagination metadata.
Next steps
- Use the returned _id with templates get; lint a proposed edit before update.
Usage
akedly utilities templates list
Inspect this command offline before preparing an operation:
akedly describe "utilities templates list" --output json
Flags
| Flag | Type | Enum / range | Description |
|---|---|---|---|
--ksa | boolean switch | — | Select the KSA deployment. |
--status | text | — | Command-specific option; see the full command details below. Query parameter: status. |
--search | text | — | Command-specific option; see the full command details below. Query parameter: search. |
--page | integer | 1 to unbounded | Command-specific option; see the full command details below. Query parameter: page. |
--limit | integer | 1 to 100 | Command-specific option; see the full command details below. Query parameter: limit. |
--all | 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: login. Permission: utilities:read.
Server request: GET /utilities/templates.
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 utility templates. --status passes through as the Akedly status filter. Values are draft, pending_review, approved and rejected (akedlyStatus, not metaStatus); any other value returns no templates. --search matches the name (the server trims it and limits it to 100 characters). Page defaults to 1 and limit to 20; --all defaults omitted limit to 100 and uses the shared Pagination rules. Offset paging is not a snapshot and can skip rows during concurrent changes. Read-only logins are supported.
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 CLI scenario
review owned utility-template statuses and locate a template before inspecting or changing it.
akedly utilities templates list --status draft --page 1
Illustrative response (sensitive values omitted):
{
"status": "success",
"data": {
"templates": [
{
"_id": "64b000000000000000000002",
"name": "Order update",
"language": "en",
"body": "Your order {{1}} is ready.",
"variables": [
{
"name": "1",
"example": "ORD-17"
}
],
"usableOn": {
"whatsapp": true,
"sms": false
},
"parameterFormat": "POSITIONAL",
"akedlyStatus": "draft",
"metaStatus": null,
"metaTemplateId": null,
"metaCategory": null,
"suggestedCategory": null,
"whatsappSubmitError": null,
"whatsappResubmittable": false,
"rejectionReason": null,
"sourceLibraryName": null,
"createdAt": "2050-01-02T03:04:05.000Z",
"updatedAt": "2050-01-02T03:04:05.000Z"
}
],
"pagination": {
"currentPage": 1,
"totalPages": 1,
"totalCount": 1,
"limit": 20
}
}
}
Resource identifiers and records are fictional prerequisites, not claims that these resources exist.
Additional command forms
akedly utilities templates 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 your utility templates. --status passes through as the Akedly status filter. Values are draft, pending_review, approved and rejected (akedlyStatus, not metaStatus); any other value returns no templates. --search matches the name (the server trims it and limits it to 100 characters). Page defaults to 1 and limit to 20; --all defaults omitted limit to 100 and uses the shared Pagination rules. Offset paging is not a snapshot and can skip rows during concurrent changes. Read-only logins are supported.
Response fields outside the modeled stable fields may be passed through from the server.
The API response envelope is preserved by the CLI; stable fields are modeled and other server fields remain extensible.
utilities templates get
inspect one owned template, including Akedly review and Meta submission state, before acting.
When to use
- inspect one owned template, including Akedly review and Meta submission state, before acting.
How it works
- Fetch the template by its 24-hex id from templates list.
Prerequisites
- Authenticated account with utilities:read permission.
- An owned template id from `utilities templates list`.
Expected outcome
Returns the owned template record.
Next steps
- For a draft/rejected template, lint edits; inspect approval/submission errors before resubmission.
Usage
akedly utilities templates get <id>
Inspect this command offline before preparing an operation:
akedly describe "utilities templates get" --output json
| Positional | Grammar | Usage guidance |
|---|---|---|
| <id> | ^[a-fA-F0-9]{24}$ | Use the id from akedly utilities templates list. |
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: utilities:read.
Server request: GET /utilities/templates/:id.
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
Read one owned utility template using its 24-hex id from akedly utilities templates list. Read-only logins are supported.
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 CLI scenario
inspect one owned template, including Akedly review and Meta submission state, before acting.
akedly utilities templates get 64b000000000000000000001
Illustrative response (sensitive values omitted):
{
"status": "success",
"data": {
"_id": "64b000000000000000000002",
"name": "Order update",
"language": "en",
"body": "Your order {{1}} is ready.",
"header": {
"text": "Order"
},
"buttons": [],
"variables": [
{
"name": "1",
"example": "ORD-17"
}
],
"usableOn": {
"whatsapp": true,
"sms": false
},
"parameterFormat": "POSITIONAL",
"akedlyStatus": "draft",
"metaStatus": null,
"metaTemplateId": null,
"metaCategory": null,
"suggestedCategory": null,
"whatsappSubmitError": null,
"whatsappResubmittable": false,
"rejectionReason": null,
"sourceLibraryName": null,
"createdAt": "2050-01-02T03:04:05.000Z",
"updatedAt": "2050-01-02T03:04:05.000Z"
}
}
Resource identifiers and records are fictional prerequisites, not claims that these resources exist.
Additional command forms
akedly utilities templates get <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
Read one owned utility template using its 24-hex id from akedly utilities templates list. Read-only logins are supported.
Response fields outside the modeled stable fields may be passed through from the server.
The API response envelope is preserved by the CLI; stable fields are modeled and other server fields remain extensible.
Own recovery guidance
| Code | Hint |
|---|---|
| NOT_FOUND | Run akedly utilities templates list and check the template id. |
utilities templates lint
check proposed template structure and server-side content rules without saving, submitting, sending or charging.
When to use
- check proposed template structure and server-side content rules without saving, submitting, sending or charging.
How it works
- Read a JSON object file, validate the local lint shape, then ask the server for lint rules and advisory prediction.
Prerequisites
- Authenticated account with utilities:read permission.
Expected outcome
HTTP 200 may return passed:false; that is a lint finding, not command failure. predictedOutcome is Meta prediction, not Akedly approval.
Next steps
- Fix issues, then lint again; inspect predictedOutcome for possible Marketing reclassification before submitting.
Usage
akedly utilities templates lint
Inspect this command offline before preparing an operation:
akedly describe "utilities templates lint" --output json
Flags
| Flag | Type | Enum / range | Required | Description |
|---|---|---|---|---|
--ksa | boolean switch | — | no | Select the KSA deployment. |
--file | text | — | yes | Command-specific option; see the full command details below. Manifest body field: body, buttons, footer, header, id, language, name, variables. |
--dry-run | boolean switch | — | no | Preview without sending the write or creating output files; planning reads may still occur. Bypass consent. |
--help | boolean switch | — | no | Show offline command help. |
--output | enum | json | human | no | Select JSON or human output. |
--fields | dot-paths | — | no | Select comma-separated safe dot paths; apply to each element of a root array. |
Authentication, permission and guards
Auth: login. Permission: utilities:read.
Server request: POST /utilities/templates/lint.
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
Lint a proposed template without saving, submitting, sending or charging. --file is required: a JSON object at most 64 KiB containing only id, name, language, body, variables, header, footer and buttons; extra top-level fields are refused. Optional id must be a 24-hex template id. Set id only to an existing Akedly template's _id (from akedly utilities templates get) so lint does not report it as its own duplicate; remove id, category and other extra fields from library or curated entries before linting. Shape checks run locally; template rules and advisory predictions come from the server, not the CLI. HTTP 200 with data.passed:false remains a successful lint and exits 0; inspect issues and predictedOutcome (Meta's predicted verdict, not Akedly approval). predictedOutcome approve_with_reclassification predicts likely Meta approval as Marketing, which costs more per message than Utility; reword the content first or submit knowingly. This is advisory, not Meta approval. Read-only logins are supported. --dry-run prints the validated request without contacting the server.
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 CLI scenario
check proposed template structure and server-side content rules without saving, submitting, sending or charging.
akedly utilities templates lint --file template.json
Input file: template.json (json).
{
"name": "Appointment reminder",
"language": "en",
"body": "Your appointment is tomorrow.",
"variables": []
}
Illustrative response (sensitive values omitted):
{
"status": "success",
"data": {
"passed": true,
"strict": false,
"predictedOutcome": "approve_with_reclassification",
"issues": [
{
"ruleId": "CATEGORY_UTILITY_RECLASSIFICATION",
"severity": "warning",
"channel": "category",
"component": "body",
"message": "This content may be classified as Marketing."
}
]
}
}
Resource identifiers and records are fictional prerequisites, not claims that these resources exist.
Additional command forms
akedly utilities templates lint --file <path>
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
Lint a proposed template without saving, submitting, sending or charging. --file is required: a JSON object at most 64 KiB containing only id, name, language, body, variables, header, footer and buttons; extra top-level fields are refused. Optional id must be a 24-hex template id. Set id only to an existing Akedly template's _id (from akedly utilities templates get) so lint does not report it as its own duplicate; remove id, category and other extra fields from library or curated entries before linting. Shape checks run locally; template rules and advisory predictions come from the server, not the CLI. HTTP 200 with data.passed:false remains a successful lint and exits 0; inspect issues and predictedOutcome (Meta's predicted verdict, not Akedly approval). predictedOutcome approve_with_reclassification predicts likely Meta approval as Marketing, which costs more per message than Utility; reword the content first or submit knowingly. This is advisory, not Meta approval. Read-only logins are supported. --dry-run prints the validated request without contacting the server.
Response fields outside the modeled stable fields may be passed through from the server.
The API response envelope is preserved by the CLI; stable fields are modeled and other server fields remain extensible.
Own recovery guidance
| Code | Hint |
|---|---|
| INVALID_SHAPE | Check the JSON field shapes in --file; see akedly utilities templates lint --help. |
| INPUT_TOO_LARGE | Reduce the template input; --file is limited to 64 KiB and the server also bounds individual fields. |
utilities templates create
save an owned draft utility template after linting/adapting content; creation does not submit or notify.
When to use
- save an owned draft utility template after linting/adapting content; creation does not submit or notify.
How it works
- Read validated authoring JSON and create a draft; omitted language defaults to en and usableOn has server defaults.
Prerequisites
- Authenticated account with utilities:create permission.
Expected outcome
Returns the created template record.
Next steps
- Read it with templates get, lint the final content, then submit only when ready.
Usage
akedly utilities templates create
Inspect this command offline before preparing an operation:
akedly describe "utilities templates create" --output json
Flags
| Flag | Type | Enum / range | Required | Description |
|---|---|---|---|---|
--ksa | boolean switch | — | no | Select the KSA deployment. |
--file | text | — | yes | Command-specific option; see the full command details below. Manifest body field: body, buttons, footer, header, language, name, sourceLibraryName, usableOn, variables. |
--dry-run | boolean switch | — | no | Preview without sending the write or creating output files; planning reads may still occur. Bypass consent. |
--help | boolean switch | — | no | Show offline command help. |
--output | enum | json | human | no | Select JSON or human output. |
--fields | dot-paths | — | no | Select comma-separated safe dot paths; apply to each element of a root array. |
Authentication, permission and guards
Auth: login. Permission: utilities:create.
Server request: POST /utilities/templates.
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
Create an owned draft utility template without submitting it or sending notifications. Required --file is a regular JSON object at most 64 KiB containing only name, language, body, variables, sourceLibraryName, usableOn, header, footer and buttons. sourceLibraryName records the library entry the template was copied or adapted from. name and body must be non-empty strings. Omitted language defaults to en; other language strings pass through to the server. usableOn accepts only whatsapp/sms JSON booleans (defaults whatsapp on, sms off); SMS requires eligible BYO-SMS. Variables are an array of objects with name, example, optional string fallback and integer maxLength >= 1; examples may be strings, numbers or booleans. Optional header is {text}, footer is text, and buttons is an array with type URL, PHONE_NUMBER or QUICK_REPLY plus text and type-specific url, phoneNumber, actionId or actionLabel. Server template rules remain authoritative. Do not copy id, category or other server metadata into the file. An ambiguous network or server failure is not retried; list templates before repeating. Read-only logins are refused. --dry-run validates and prints the request without contacting the server.
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 CLI scenario
save an owned draft utility template after linting/adapting content; creation does not submit or notify.
akedly utilities templates create --file template.json
Input file: template.json (json).
{
"name": "Appointment reminder",
"language": "en",
"body": "Your appointment is tomorrow.",
"variables": [],
"sourceLibraryName": "Appointment reminder",
"usableOn": {
"whatsapp": true,
"sms": false
}
}
Illustrative response (sensitive values omitted):
{
"status": "success",
"data": {
"_id": "64b000000000000000000002",
"name": "Order update",
"language": "en",
"body": "Your order {{1}} is ready.",
"header": {
"text": "Order"
},
"buttons": [],
"variables": [
{
"name": "1",
"example": "ORD-17"
}
],
"usableOn": {
"whatsapp": true,
"sms": false
},
"parameterFormat": "POSITIONAL",
"akedlyStatus": "draft",
"metaStatus": null,
"metaTemplateId": null,
"metaCategory": null,
"suggestedCategory": null,
"whatsappSubmitError": null,
"whatsappResubmittable": false,
"rejectionReason": null,
"sourceLibraryName": null,
"createdAt": "2050-01-02T03:04:05.000Z",
"updatedAt": "2050-01-02T03:04:05.000Z"
}
}
Resource identifiers and records are fictional prerequisites, not claims that these resources exist.
Additional command forms
akedly utilities templates create --file <path>
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
Create an owned draft utility template without submitting it or sending notifications. Required --file is a regular JSON object at most 64 KiB containing only name, language, body, variables, sourceLibraryName, usableOn, header, footer and buttons. sourceLibraryName records the library entry the template was copied or adapted from. name and body must be non-empty strings. Omitted language defaults to en; other language strings pass through to the server. usableOn accepts only whatsapp/sms JSON booleans (defaults whatsapp on, sms off); SMS requires eligible BYO-SMS. Variables are an array of objects with name, example, optional string fallback and integer maxLength >= 1; examples may be strings, numbers or booleans. Optional header is {text}, footer is text, and buttons is an array with type URL, PHONE_NUMBER or QUICK_REPLY plus text and type-specific url, phoneNumber, actionId or actionLabel. Server template rules remain authoritative. Do not copy id, category or other server metadata into the file. An ambiguous network or server failure is not retried; list templates before repeating. Read-only logins are refused. --dry-run validates and prints the request without contacting the server.
Response fields outside the modeled stable fields may be passed through from the server.
The API response envelope is preserved by the CLI; stable fields are modeled and other server fields remain extensible.
Own recovery guidance
| Code | Hint |
|---|---|
| DUPLICATE_NAME | Run akedly utilities templates list and choose an unused name and language. |
| NO_TEMPLATE_CHANNEL | Enable at least one of usableOn.whatsapp or usableOn.sms in --file. |
| UTILITY_SMS_REQUIRES_BYO | Connect, test and activate an eligible BYO-SMS integration before enabling usableOn.sms. Check akedly byo-sms list and akedly whoami for BYO-SMS entitlement and granular pricing. |
utilities templates update
change authoring fields on an owned eligible template; editing resets Akedly approval/rejection and can notify staff.
When to use
- change authoring fields on an owned eligible template; editing resets Akedly approval/rejection and can notify staff.
How it works
- Read partial authoring JSON; omitted fields remain, supplied arrays replace entirely, nullable fields can clear. Requires explicit confirmation.
Prerequisites
- Authenticated account with utilities:update permission.
- Writable owner account and explicit confirmation where required.
- An owned template in draft, rejected, or eligible approved-but-never-submitted state; at least one supplied authoring field.
Expected outcome
Returns updated template state.
Next steps
- Get the template and lint it. Submit again for Akedly review if appropriate; do not retry an ambiguous update before checking current state.
Usage
akedly utilities templates update <id>
Inspect this command offline before preparing an operation:
akedly describe "utilities templates update" --output json
| Positional | Grammar | Usage guidance |
|---|---|---|
| <id> | ^[a-fA-F0-9]{24}$ | Use the id from akedly utilities templates list. |
Flags
| Flag | Type | Enum / range | Required | Description |
|---|---|---|---|---|
--ksa | boolean switch | — | no | Select the KSA deployment. |
--file | text | — | yes | Command-specific option; see the full command details below. Manifest body field: body, buttons, footer, header, language, name, usableOn, variables. |
--yes | boolean switch | — | no | Confirm this action where consent is required. |
--dry-run | boolean switch | — | no | Preview without sending the write or creating output files; planning reads may still occur. Bypass consent. |
--help | boolean switch | — | no | Show offline command help. |
--output | enum | json | human | no | Select JSON or human output. |
--fields | dot-paths | — | no | Select comma-separated safe dot paths; apply to each element of a root array. |
Authentication, permission and guards
Auth: login. Permission: utilities:update.
Server request: PUT /utilities/templates/:id.
Consent
--yes. --dry-run bypasses confirmation where supported. Destructive: false. Spends money: false. Real send: true.
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
Update only supplied authoring fields on an owned template with --yes. Required --file is a regular JSON object at most 64 KiB containing only name, language, body, variables, usableOn, header, footer and buttons; sourceLibraryName and server metadata are refused. Field shapes match akedly utilities templates create --help. usableOn replaces both channels; supply both. A supplied language must be a non-empty string. Omitted fields are preserved; variables/buttons replace whole arrays, null header/footer or an empty buttons array clear those components. variables:null or [] clears every example, fallback and maxLength; names are re-derived from body, header and URL-button placeholders. Only draft, rejected or approved WhatsApp-enabled templates with no Meta submission are editable. Editing resets Akedly approval to draft and clears prior rejection/Meta submission state, and may notify Akedly staff. An ambiguous network or server failure is not retried; state may already have changed, so get the template before repeating. Read-only logins are refused. --dry-run validates and prints the request without contacting the server.
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 CLI scenario
change authoring fields on an owned eligible template; editing resets Akedly approval/rejection and can notify staff.
akedly utilities templates update 64b000000000000000000001 --file template.json --yes
Input file: template.json (json).
{
"body": "Your appointment is tomorrow."
}
Illustrative response (sensitive values omitted):
{
"status": "success",
"data": {
"_id": "64b000000000000000000002",
"name": "Order update",
"language": "en",
"body": "Your order {{1}} is ready.",
"header": {
"text": "Order"
},
"buttons": [],
"variables": [
{
"name": "1",
"example": "ORD-17"
}
],
"usableOn": {
"whatsapp": true,
"sms": false
},
"parameterFormat": "POSITIONAL",
"akedlyStatus": "draft",
"metaStatus": null,
"metaTemplateId": null,
"metaCategory": null,
"suggestedCategory": null,
"whatsappSubmitError": null,
"whatsappResubmittable": false,
"rejectionReason": null,
"sourceLibraryName": null,
"createdAt": "2050-01-02T03:04:05.000Z",
"updatedAt": "2050-01-02T03:04:05.000Z"
}
}
Synthetic example only; do not execute against a live account.
Additional command forms
akedly utilities templates update <id> --file <path> --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
Update only supplied authoring fields on an owned template with --yes. Required --file is a regular JSON object at most 64 KiB containing only name, language, body, variables, usableOn, header, footer and buttons; sourceLibraryName and server metadata are refused. Field shapes match akedly utilities templates create --help. usableOn replaces both channels; supply both. A supplied language must be a non-empty string. Omitted fields are preserved; variables/buttons replace whole arrays, null header/footer or an empty buttons array clear those components. variables:null or [] clears every example, fallback and maxLength; names are re-derived from body, header and URL-button placeholders. Only draft, rejected or approved WhatsApp-enabled templates with no Meta submission are editable. Editing resets Akedly approval to draft and clears prior rejection/Meta submission state, and may notify Akedly staff. An ambiguous network or server failure is not retried; state may already have changed, so get the template before repeating. Read-only logins are refused. --dry-run validates and prints the request without contacting the server.
Response fields outside the modeled stable fields may be passed through from the server.
The API response envelope is preserved by the CLI; stable fields are modeled and other server fields remain extensible.
Own recovery guidance
| Code | Hint |
|---|---|
| NOT_FOUND | Run akedly utilities templates list and check the template id. |
| NOT_EDITABLE | Only draft, rejected or approved WhatsApp-enabled templates with no Meta submission are editable. Check akedly utilities templates get <id> before changing the file. |
| SUBMISSION_IN_FLIGHT | A Meta submission is in progress. Wait for details.retryAfterSeconds, then check akedly utilities templates get <id> before editing. |
| DUPLICATE_NAME | Run akedly utilities templates list and choose an unused name and language. |
| NO_TEMPLATE_CHANNEL | Enable at least one of usableOn.whatsapp or usableOn.sms in --file. |
| UTILITY_SMS_REQUIRES_BYO | Connect, test and activate an eligible BYO-SMS integration before enabling usableOn.sms. Check akedly byo-sms list and akedly whoami for BYO-SMS entitlement and granular pricing. |
utilities templates submit
place a draft or rejected template into Akedly staff review; this does not submit it to Meta.
When to use
- place a draft or rejected template into Akedly staff review; this does not submit it to Meta.
How it works
- Submit an existing owned template after reviewing lint blockers and Meta classification prediction. Requires confirmation.
Prerequisites
- Authenticated account with utilities:update permission.
- Writable owner account and explicit confirmation where required.
- An owned draft or rejected template; lint findings reviewed, including possible Meta Marketing reclassification.
Expected outcome
Returns updated review status; may notify Akedly staff.
Next steps
- Get template to confirm pending_review; wait for Akedly decision before Meta submission.
Usage
akedly utilities templates submit <id>
Inspect this command offline before preparing an operation:
akedly describe "utilities templates submit" --output json
| Positional | Grammar | Usage guidance |
|---|---|---|
| <id> | ^[a-fA-F0-9]{24}$ | Use the id from akedly utilities templates list. |
Flags
| Flag | Type | Enum / range | Description |
|---|---|---|---|
--ksa | boolean switch | — | Select the KSA deployment. |
--yes | boolean switch | — | Confirm this action where consent is required. |
--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: utilities:update.
Server request: POST /utilities/templates/:id/submit.
Consent
--yes. --dry-run bypasses confirmation where supported. Destructive: false. Spends money: false. Real send: true.
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
Submit an owned draft or rejected template for Akedly staff review with --yes. Before submitting, run akedly utilities templates lint --file <path> on the lint-compatible copy described below and review predictedOutcome. This saves pending_review and may notify Akedly staff; it does not itself submit to Meta. Fix the blockers in details.issues, save with akedly utilities templates update <id> --file <path> --yes, then run akedly utilities templates submit <id> --yes. For akedly utilities templates lint --file <path>, use a copy containing only name, language, body, variables (string examples), header, footer and buttons. Lint predictedOutcome predicts Meta, not Akedly approval. An ambiguous network or server failure is not retried; state may already have changed, so get the template before repeating. Read-only logins are refused. --dry-run validates and prints the request without contacting the server. Meta may reclassify a template as Marketing, which costs more per message than Utility; inspect lint predictedOutcome before submitting knowingly.
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 CLI scenario
place a draft or rejected template into Akedly staff review; this does not submit it to Meta.
akedly utilities templates submit 64b000000000000000000001 --yes
Illustrative response (sensitive values omitted):
{
"status": "success",
"data": {
"_id": "64b000000000000000000002",
"name": "Order update",
"language": "en",
"body": "Your order {{1}} is ready.",
"header": {
"text": "Order"
},
"buttons": [],
"variables": [
{
"name": "1",
"example": "ORD-17"
}
],
"usableOn": {
"whatsapp": true,
"sms": false
},
"parameterFormat": "POSITIONAL",
"akedlyStatus": "pending_review",
"metaStatus": null,
"metaTemplateId": null,
"metaCategory": null,
"suggestedCategory": null,
"whatsappSubmitError": null,
"whatsappResubmittable": false,
"rejectionReason": null,
"sourceLibraryName": null,
"createdAt": "2050-01-02T03:04:05.000Z",
"updatedAt": "2050-01-02T03:04:05.000Z"
}
}
Synthetic example only; do not execute against a live account.
Additional command forms
akedly utilities templates submit <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
Submit an owned draft or rejected template for Akedly staff review with --yes. Before submitting, run akedly utilities templates lint --file <path> on the lint-compatible copy described below and review predictedOutcome. This saves pending_review and may notify Akedly staff; it does not itself submit to Meta. Fix the blockers in details.issues, save with akedly utilities templates update <id> --file <path> --yes, then run akedly utilities templates submit <id> --yes. For akedly utilities templates lint --file <path>, use a copy containing only name, language, body, variables (string examples), header, footer and buttons. Lint predictedOutcome predicts Meta, not Akedly approval. An ambiguous network or server failure is not retried; state may already have changed, so get the template before repeating. Read-only logins are refused. --dry-run validates and prints the request without contacting the server. Meta may reclassify a template as Marketing, which costs more per message than Utility; inspect lint predictedOutcome before submitting knowingly.
Response fields outside the modeled stable fields may be passed through from the server.
The API response envelope is preserved by the CLI; stable fields are modeled and other server fields remain extensible.
Own recovery guidance
| Code | Hint |
|---|---|
| NOT_FOUND | Run akedly utilities templates list and check the template id. |
| NOT_SUBMITTABLE | Only draft or rejected templates can enter Akedly review. Check akedly utilities templates get <id>. |
| TEMPLATE_NOT_READY | Fix the blockers in details.issues, save with akedly utilities templates update <id> --file <path> --yes, then run akedly utilities templates submit <id> --yes. For akedly utilities templates lint --file <path>, use a copy containing only name, language, body, variables (string examples), header, footer and buttons. |
utilities templates resubmit-meta
retry Meta submission for an Akedly-approved WhatsApp template whose previous submission failed or is absent.
When to use
- retry Meta submission for an Akedly-approved WhatsApp template whose previous submission failed or is absent.
How it works
- Ask server to submit; Meta and staff notification may be involved, with server cooldown and potentially a successful HTTP result containing submitted:false.
Prerequisites
- Authenticated account with utilities:update permission.
- Writable owner account and explicit confirmation where required.
- An owned Akedly-approved WhatsApp-enabled template without a Meta submission; no active 60-second resubmission cooldown.
Expected outcome
Returns Meta submission outcome and current template state; success does not guarantee Meta approval.
Next steps
- Inspect whatsappSubmitError/metaStatus; no_active_waba means connect WABA, blocked_by_lint requires content changes, cooldown requires waiting.
Usage
akedly utilities templates resubmit-meta <id>
Inspect this command offline before preparing an operation:
akedly describe "utilities templates resubmit-meta" --output json
| Positional | Grammar | Usage guidance |
|---|---|---|
| <id> | ^[a-fA-F0-9]{24}$ | Use the id from akedly utilities templates list. |
Flags
| Flag | Type | Enum / range | Description |
|---|---|---|---|
--ksa | boolean switch | — | Select the KSA deployment. |
--yes | boolean switch | — | Confirm this action where consent is required. |
--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: utilities:update.
Server request: POST /utilities/templates/:id/resubmit-meta.
Consent
--yes. --dry-run bypasses confirmation where supported. Destructive: false. Spends money: false. Real send: true.
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
Retry a real Meta submission for an Akedly-approved, WhatsApp-enabled template that has no Meta submission, with --yes. This contacts Meta and may notify Akedly staff. Akedly automatically attempts Meta submission for WhatsApp-enabled templates on approval; use resubmit-meta to retry when that submission failed. The server enforces a 60-second attempt cooldown: inspect details.retryAfterSeconds on RESUBMIT_COOLDOWN. HTTP 200 can contain submitted:false, data.whatsappSubmitError and retryAfterSeconds; that is not Meta submission or approval. Inspect those fields and data.metaStatus before deciding what to do. For these customer templates, data.whatsappSubmitError no_active_waba means connect a WhatsApp Business Account first: check akedly whatsapp status, then use akedly whatsapp connect for the dashboard sign-up link. blocked_by_lint: <ruleIds> cannot be fixed by retrying; change the content with akedly utilities templates update <id> --file <path> --yes, then run akedly utilities templates submit <id> --yes. Other values report the Meta submission failure reason. Uses a 90-second request timeout. An ambiguous network or server failure is not retried; state or Meta may already have changed, so get the template before repeating. Read-only logins are refused. --dry-run validates and prints the request without contacting the server.
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 CLI scenario
retry Meta submission for an Akedly-approved WhatsApp template whose previous submission failed or is absent.
akedly utilities templates resubmit-meta 64b000000000000000000001 --yes
Illustrative response (sensitive values omitted):
{
"status": "success",
"submitted": false,
"retryAfterSeconds": 60,
"data": {
"_id": "64b000000000000000000002",
"metaStatus": null,
"whatsappSubmitError": "no_active_waba",
"whatsappResubmittable": true
}
}
Synthetic example only; do not execute against a live account.
Additional command forms
akedly utilities templates resubmit-meta <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
Retry a real Meta submission for an Akedly-approved, WhatsApp-enabled template that has no Meta submission, with --yes. This contacts Meta and may notify Akedly staff. Akedly automatically attempts Meta submission for WhatsApp-enabled templates on approval; use resubmit-meta to retry when that submission failed. The server enforces a 60-second attempt cooldown: inspect details.retryAfterSeconds on RESUBMIT_COOLDOWN. HTTP 200 can contain submitted:false, data.whatsappSubmitError and retryAfterSeconds; that is not Meta submission or approval. Inspect those fields and data.metaStatus before deciding what to do. For these customer templates, data.whatsappSubmitError no_active_waba means connect a WhatsApp Business Account first: check akedly whatsapp status, then use akedly whatsapp connect for the dashboard sign-up link. blocked_by_lint: <ruleIds> cannot be fixed by retrying; change the content with akedly utilities templates update <id> --file <path> --yes, then run akedly utilities templates submit <id> --yes. Other values report the Meta submission failure reason. Uses a 90-second request timeout. An ambiguous network or server failure is not retried; state or Meta may already have changed, so get the template before repeating. Read-only logins are refused. --dry-run validates and prints the request without contacting the server.
Response fields outside the modeled stable fields may be passed through from the server.
The API response envelope is preserved by the CLI; stable fields are modeled and other server fields remain extensible.
Own recovery guidance
| Code | Hint |
|---|---|
| NOT_FOUND | Run akedly utilities templates list and check the template id. |
| NOT_RESUBMITTABLE | Check akedly utilities templates get <id>; resubmission requires Akedly approval, WhatsApp enabled and no Meta submission. |
| RESUBMIT_COOLDOWN | Wait for details.retryAfterSeconds, then check akedly utilities templates get <id> before another Meta submission. |
utilities templates dev-approve
bypass Akedly review for development by approving an owned non-approved template; server refuses production.
When to use
- bypass Akedly review for development by approving an owned non-approved template; server refuses production.
How it works
- Approve with explicit confirmation; WhatsApp approval may trigger Meta submission and notification emails.
Prerequisites
- Authenticated account with utilities:update permission.
- Writable owner account and explicit confirmation where required.
- An owned non-approved template and development server environment; the server refuses production.
Expected outcome
Returns approval and Meta submission state, which are distinct.
Next steps
- Inspect Meta status/error; use only development context, and resubmit-meta only after understanding failure/cooldown.
Usage
akedly utilities templates dev-approve <id>
Inspect this command offline before preparing an operation:
akedly describe "utilities templates dev-approve" --output json
| Positional | Grammar | Usage guidance |
|---|---|---|
| <id> | ^[a-fA-F0-9]{24}$ | Use the id from akedly utilities templates list. |
Flags
| Flag | Type | Enum / range | Description |
|---|---|---|---|
--ksa | boolean switch | — | Select the KSA deployment. |
--yes | boolean switch | — | Confirm this action where consent is required. |
--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: utilities:update.
Server request: POST /utilities/templates/:id/dev-approve.
Consent
--yes. --dry-run bypasses confirmation where supported. Destructive: false. Spends money: false. Real send: true.
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 an owned non-approved template for development with --yes, bypassing the Akedly admin review queue. The server refuses production with DEV_ONLY; the CLI does not guess the server environment. This can make a real Meta submission for WhatsApp and schedules owner/consented-recipient notification emails. Akedly approval does not guarantee Meta submission or approval; inspect data.metaStatus and data.whatsappSubmitError. Akedly automatically attempts Meta submission for WhatsApp-enabled templates on approval; use resubmit-meta to retry when that submission failed. For these customer templates, data.whatsappSubmitError no_active_waba means connect a WhatsApp Business Account first: check akedly whatsapp status, then use akedly whatsapp connect for the dashboard sign-up link. blocked_by_lint: <ruleIds> cannot be fixed by retrying; change the content with akedly utilities templates update <id> --file <path> --yes, then run akedly utilities templates submit <id> --yes. Other values report the Meta submission failure reason. Uses a 90-second request timeout. An ambiguous network or server failure is not retried; state or Meta may already have changed, so get the template before repeating. Read-only logins are refused. --dry-run validates and prints the request without contacting the server.
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 CLI scenario
bypass Akedly review for development by approving an owned non-approved template; server refuses production.
akedly utilities templates dev-approve 64b000000000000000000001 --yes
Illustrative response (sensitive values omitted):
{
"status": "success",
"data": {
"_id": "64b000000000000000000002",
"name": "Order update",
"language": "en",
"body": "Your order {{1}} is ready.",
"header": {
"text": "Order"
},
"buttons": [],
"variables": [
{
"name": "1",
"example": "ORD-17"
}
],
"usableOn": {
"whatsapp": true,
"sms": false
},
"parameterFormat": "POSITIONAL",
"akedlyStatus": "approved",
"metaStatus": null,
"metaTemplateId": null,
"metaCategory": null,
"suggestedCategory": null,
"whatsappSubmitError": null,
"whatsappResubmittable": false,
"rejectionReason": null,
"sourceLibraryName": null,
"createdAt": "2050-01-02T03:04:05.000Z",
"updatedAt": "2050-01-02T03:04:05.000Z"
}
}
Synthetic example only; do not execute against a live account.
Additional command forms
akedly utilities templates dev-approve <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
Approve an owned non-approved template for development with --yes, bypassing the Akedly admin review queue. The server refuses production with DEV_ONLY; the CLI does not guess the server environment. This can make a real Meta submission for WhatsApp and schedules owner/consented-recipient notification emails. Akedly approval does not guarantee Meta submission or approval; inspect data.metaStatus and data.whatsappSubmitError. Akedly automatically attempts Meta submission for WhatsApp-enabled templates on approval; use resubmit-meta to retry when that submission failed. For these customer templates, data.whatsappSubmitError no_active_waba means connect a WhatsApp Business Account first: check akedly whatsapp status, then use akedly whatsapp connect for the dashboard sign-up link. blocked_by_lint: <ruleIds> cannot be fixed by retrying; change the content with akedly utilities templates update <id> --file <path> --yes, then run akedly utilities templates submit <id> --yes. Other values report the Meta submission failure reason. Uses a 90-second request timeout. An ambiguous network or server failure is not retried; state or Meta may already have changed, so get the template before repeating. Read-only logins are refused. --dry-run validates and prints the request without contacting the server.
Response fields outside the modeled stable fields may be passed through from the server.
The API response envelope is preserved by the CLI; stable fields are modeled and other server fields remain extensible.
Own recovery guidance
| Code | Hint |
|---|---|
| ALREADY_APPROVED | Check akedly utilities templates get <id> and inspect data.whatsappResubmittable; use resubmit-meta only when it is true. |
| DEV_ONLY | This server disables shortcut approval. Use akedly utilities templates submit <id> --yes for Akedly review. |
utilities templates delete
remove an owned draft or rejected template from Akedly; this does not remove anything from Meta.
When to use
- remove an owned draft or rejected template from Akedly; this does not remove anything from Meta.
How it works
- Delete one eligible owned template after checking its state; pending notification may block deletion. Requires confirmation.
Prerequisites
- Authenticated account with utilities:delete permission.
- Writable owner account and explicit confirmation where required.
- An owned draft or rejected template with no pending status notification.
Expected outcome
Returns server deletion result.
Next steps
- Verify with templates list; do not retry an ambiguous deletion before checking.
Usage
akedly utilities templates delete <id>
Inspect this command offline before preparing an operation:
akedly describe "utilities templates delete" --output json
| Positional | Grammar | Usage guidance |
|---|---|---|
| <id> | ^[a-fA-F0-9]{24}$ | Use the id from akedly utilities templates list. |
Flags
| Flag | Type | Enum / range | Description |
|---|---|---|---|
--ksa | boolean switch | — | Select the KSA deployment. |
--yes | boolean switch | — | Confirm this action where consent is required. |
--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: utilities:delete.
Server request: DELETE /utilities/templates/:id.
Consent
--yes. --dry-run bypasses confirmation where supported. Destructive: true. 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
Delete an owned draft or rejected template from Akedly with --yes. A pending template-status notification can block deletion. This is local deletion, not deletion at Meta. An ambiguous network or server failure is not retried; get the template before repeating. Read-only logins are refused. --dry-run validates and prints the request without contacting the server.
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 CLI scenario
remove an owned draft or rejected template from Akedly; this does not remove anything from Meta.
akedly utilities templates delete 64b000000000000000000001 --yes
Illustrative response (sensitive values omitted):
{
"status": "success",
"data": {
"deleted": true
}
}
Resource identifiers and records are fictional prerequisites, not claims that these resources exist.
Additional command forms
akedly utilities templates delete <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
Delete an owned draft or rejected template from Akedly with --yes. A pending template-status notification can block deletion. This is local deletion, not deletion at Meta. An ambiguous network or server failure is not retried; get the template before repeating. Read-only logins are refused. --dry-run validates and prints the request without contacting the server.
Response fields outside the modeled stable fields may be passed through from the server.
The API response envelope is preserved by the CLI; stable fields are modeled and other server fields remain extensible.
Own recovery guidance
| Code | Hint |
|---|---|
| NOT_FOUND | Run akedly utilities templates list and check the template id. |
| NOT_DELETABLE | Only draft or rejected templates without a pending status notification can be deleted. Check akedly utilities templates get <id>. |
utilities templates test-send
send a real chargeable one-channel template test to validate template rendering/provider acceptance; it does not exercise the production WhatsApp-to-SMS fallback path.
When to use
- After an eligible approved template and active pipeline are configured, when checking that one selected channel accepts a test message.
- Do not use this test to prove the production WhatsApp fallback path; test-send transactions are excluded from that fallback service.
How it works
- The server chooses a usable account API key scoped to the target pipeline for admission/attribution; it refuses the send if no usable scoped key exists.
- The server renders and sends only the explicitly selected channel (SMS or WhatsApp); test-send does not fall back from WhatsApp to SMS.
- The real send may charge, obeys daily test-send, quota and spend-cap limits, and a provider acceptance is not proof of handset delivery.
Prerequisites
- Authenticated account with utilities:send permission.
- Writable owner account and explicit confirmation where required.
- An owned approved/send-ready template; a valid destination; eligible WhatsApp or BYO-SMS setup; available quota/balance;
--yes. Pipeline must be owned and active if specified. - The server must find a usable account API key scoped to the target pipeline for admission and attribution; if it cannot, the send is refused.
Expected outcome
A one-channel test-send transaction with provider acceptance state. It may charge and it does not prove handset delivery or exercise production WhatsApp-to-SMS fallback.
Next steps
- On timeout retain same key and inputs; inspect messages list/get before recovery. Do not start a new operation.
Usage
akedly utilities templates test-send <id>
Inspect this command offline before preparing an operation:
akedly describe "utilities templates test-send" --output json
| Positional | Grammar | Usage guidance |
|---|---|---|
| <id> | ^[a-fA-F0-9]{24}$ | Use the id from akedly utilities templates list. |
Flags
| Flag | Type | Enum / range | Description |
|---|---|---|---|
--ksa | boolean switch | — | Select the KSA deployment. |
--phone-number | text | — | Command-specific option; see the full command details below. Manifest body field: phone. |
--pipeline-id | id | — | Command-specific option; see the full command details below. Manifest body field: pipelineId. |
--channel | enum | sms | whatsapp | Command-specific option; see the full command details below. Manifest body field: channel. |
--values-file | text | — | Command-specific option; see the full command details below. Manifest body field: variableValues. |
--idempotency-key | text | — | Command-specific option; see the full command details below. Manifest body field: idempotencyKey. |
--operation-fingerprint | text | — | Command-specific option; see the full command details below. Manifest body field: operationFingerprint. |
--yes | boolean switch | — | Confirm this action where consent is required. |
--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: utilities:send.
Server request: POST /utilities/templates/:id/test-send.
Consent
--yes. --dry-run bypasses confirmation where supported. Destructive: false. Spends money: true. Real send: true.
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
Send a real, chargeable utility-template test with --yes; use only your own recipient number. --channel is sms or whatsapp (server default sms). Optional --phone-number must be E.164; omission uses the account phone. Optional --pipeline-id is a 24-hex active non-sandbox utility pipeline id; when omitted, the server selects one. A usable account API key selected by the server is required for that pipeline. --values-file is a regular JSON object at most 64 KiB mapping variable names to strings, finite numbers or booleans; 0, false and empty strings are preserved, but an empty string uses the stored fallback or fails rendering. SMS requires eligible BYO-SMS; WhatsApp requires the channel enabled, Akedly approval and Meta readiness. Region, suppression, quota and spend-cap rules remain server-owned. The account-wide daily limit is 10 persisted test-send transactions from server-local midnight, including failed attempts. Provider acceptance is not handset delivery; SMS bills immediately and WhatsApp billing is deferred, with possible later configured fallback. Uses a 60-second request timeout and no automatic ambiguous retry. A key is generated once per plan and included in the request and recovery error details; pass --idempotency-key to retain it. Supplied keys and optional --operation-fingerprint are separate trimmed 1-255-character values; no fingerprint is generated. Keep the same key and original inputs for recovery, and inspect akedly utilities messages list and akedly utilities messages get <transactionID> before retrying. Replay is bounded, not an unlimited safe-resend guarantee; unresolved dispatches may require support. Do not start a fresh operation merely because the CLI timed out. Read-only logins are refused. --dry-run validates and prints the planned key/body without credentials, consent or any request. TEST_SEND_LIMIT reports that the daily limit was reached but supplies no reset time; do not infer a retry timestamp from it.
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 CLI scenario
exercise an approved utility template by sending a real message to a recipient; the operation may charge and fallback.
akedly utilities templates test-send 64b000000000000000000001 --phone-number +201234567890 --channel whatsapp --yes --idempotency-key utility-test-example-0001 --values-file values.json
Input file: values.json (json).
{}
Illustrative response (sensitive values omitted):
{
"status": "success",
"message": "Test WhatsApp sent",
"data": {
"transactionID": "txn_example_20500102",
"status": "Pending",
"channel": "whatsapp",
"provider": "meta-cloud",
"recipient": "+201234567890",
"customerUserId": null,
"wamid": "wamid.example.20500102",
"billed": false,
"billing": {
"status": "deferred"
}
}
}
Synthetic example only; do not execute against a live account.
Additional command forms
akedly utilities templates test-send <id> --phone-number <number> --pipeline-id <id> --values-file <path> --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
Send a real, chargeable utility-template test with --yes; use only your own recipient number. --channel is sms or whatsapp (server default sms). Optional --phone-number must be E.164; omission uses the account phone. Optional --pipeline-id is a 24-hex active non-sandbox utility pipeline id; when omitted, the server selects one. A usable account API key selected by the server is required for that pipeline. --values-file is a regular JSON object at most 64 KiB mapping variable names to strings, finite numbers or booleans; 0, false and empty strings are preserved, but an empty string uses the stored fallback or fails rendering. SMS requires eligible BYO-SMS; WhatsApp requires the channel enabled, Akedly approval and Meta readiness. Region, suppression, quota and spend-cap rules remain server-owned. The account-wide daily limit is 10 persisted test-send transactions from server-local midnight, including failed attempts. Provider acceptance is not handset delivery; SMS bills immediately and WhatsApp billing is deferred, with possible later configured fallback. Uses a 60-second request timeout and no automatic ambiguous retry. A key is generated once per plan and included in the request and recovery error details; pass --idempotency-key to retain it. Supplied keys and optional --operation-fingerprint are separate trimmed 1-255-character values; no fingerprint is generated. Keep the same key and original inputs for recovery, and inspect akedly utilities messages list and akedly utilities messages get <transactionID> before retrying. Replay is bounded, not an unlimited safe-resend guarantee; unresolved dispatches may require support. Do not start a fresh operation merely because the CLI timed out. Read-only logins are refused. --dry-run validates and prints the planned key/body without credentials, consent or any request. TEST_SEND_LIMIT reports that the daily limit was reached but supplies no reset time; do not infer a retry timestamp from it.
Response fields outside the modeled stable fields may be passed through from the server.
The API response envelope is preserved by the CLI; stable fields are modeled and other server fields remain extensible.
This command never verifies the production WhatsApp failure-to-SMS fallback: the fallback service skips utility.testSend transactions.
The successful API data carries string transactionID/status plus selected channel/provider and channel-specific acceptance/billing fields. It is not a production fallback test.
Own recovery guidance
| Code | Hint |
|---|---|
| TEMPLATE_NOT_FOUND | Run akedly utilities templates list and check the template id. |
| INVALID_PHONE | Pass --phone-number with your own valid E.164 number; omit it only when the account has a verified phone. If the saved phone is missing, complete your profile in the dashboard or ask Akedly support to correct it. |
| NO_UTILITY_PIPELINE | Create a utility pipeline with akedly pipelines create --product utility --name <name>, activate it with akedly pipelines update <id> --status active --yes, then supply --pipeline-id. |
| TEMPLATE_NOT_APPROVED | Check akedly utilities templates get <id>; submit the stored draft or rejected template for Akedly review before sending. |
| TEMPLATE_NOT_SMS | Check data.usableOn in akedly utilities templates get <id>; the template must allow SMS. |
| TEMPLATE_NOT_WHATSAPP_READY | Check akedly utilities templates get <id> for Akedly approval, WhatsApp usability and data.metaStatus. Use resubmit-meta only when data.whatsappResubmittable is true. |
| WHATSAPP_NOT_ENABLED | Check the utility pipeline and enable WhatsApp with akedly utilities pipelines channels set <id> --file <path>. |
| TEMPLATE_MISSING_VARIABLE | Supply the missing values through --values-file; use akedly utilities templates get <id> to inspect variables and fallbacks. |
| RECIPIENT_SUPPRESSED | Check akedly utilities suppressions list and respect the recipient opt-out; do not repeat the send to bypass suppression. |
| UTILITY_SMS_REQUIRES_BYO | Check akedly byo-sms list, active tested integration coverage and the pipeline byoSms setting; utility SMS requires eligible BYO-SMS. |
| UTILITY_SMS_COUNTRY_NOT_ROUTED | Check the selected BYO-SMS integration coverage for this destination with akedly byo-sms get <id>. |
| UTILITY_SMS_PROVIDER_NOT_READY | Check akedly byo-sms get <id> and complete the selected provider setup before sending. |
| IDEMPOTENCY_KEY_REUSE | Keep the original idempotency key with exactly the original template id and flags (--pipeline-id, --channel, --phone-number, --values-file and --operation-fingerprint, each supplied or omitted as before). Inspect akedly utilities messages list before deciding on a different operation. |
| IDEMPOTENCY_IN_PROGRESS | The existing operation is still processing. Keep its key and inputs; inspect akedly utilities messages list before retrying. |
| IDEMPOTENCY_OUTCOME_UNKNOWN | Keep the key and inputs. Inspect akedly utilities messages list and get <transactionID>, then contact Akedly support before retrying; do not start a new operation. |
| TEMPLATE_VAR_MISSING | No message was sent. Fill every required variable in --values-file; inspect variables and fallbacks with akedly utilities templates get <id>. |
| no_active_waba | No message was sent. An active connected WhatsApp Business Account is required; use --channel sms if ready, or run akedly whatsapp connect for the dashboard connection link. |
