Audited workflows
Native replacements for recurring raw API calls.
Localized content
For localized resources, --locale selects the content locale. The CLI sends
it as content_locale, so reads and writes address that locale rather than
filtering records by a generic locale query.
This applies to pages, menus, products, collections, blogs and posts, notifications, channel entries, and shipping rates:
nimbu pages get --page=about --locale=nl-BE
printf '%s\n' '{"seo_title":"Over ons"}' |
nimbu pages update --page=about --locale=nl-BE --file=-
nimbu products update --product=shirt --locale=fr name="Chemise"
nimbu blogs posts update --blog=news --post=launch --locale=nl title="Lancering"Use canonical locale casing in scripts: nl-BE, zh-Hant-TW. Translation
assignment keys also accept forms such as nl_BE and normalize them to
nl-BE; equivalent hyphen/underscore forms match when projecting output.
--json keeps the complete server representation, including every
translations block. Human and --plain output overlay the selected locale
onto the displayed fields and fall back to the top-level value when that
translation is absent.
Write one or several locales
Use --locale for a single-locale write. Where a resource accepts a
translations payload, send several locales in one request:
nimbu pages update --page=about \
'translations:={"nl":{"seo_title":"Over ons"},"fr":{"seo_title":"À propos"}}'
nimbu menus update --menu=main --file=menu-translations.jsonTop-level translations:=... is allowed inline for pages and menus. Other
nested page or menu edits require --file; inline updates are intentionally
limited to shallow fields. Use --replace --file=page.json only when replacing
the page canvases, and review its destructive guards first.
For string translations, create --file accepts one object or an array:
[
{
"key": "checkout.submit",
"values": {
"nl-BE": "Bestellen",
"fr": "Commander"
}
},
{
"key": "checkout.cancel",
"values": {
"nl-BE": "Annuleren",
"fr": "Annuler"
}
}
]nimbu translations create --file=translations.json
nimbu translations create key=home.title nl=Welkom fr=BienvenueThe second form is shorthand for values.nl and values.fr.
Copy localized content
The native copy commands preserve localized payloads:
nimbu products copy --from=staging --to=production --json
nimbu blogs copy --from=staging --to=production --only=news --json
nimbu sites copy --from=staging --to=production --dry-run --jsonProduct copy maps localized built-in and custom fields to the target site's
configured locales and preserves localized variants. Blog copy matches blogs
and posts in the target default locale while preserving translation maps, SEO
fields, and other writable fields. Both copy flows require explicit default
locales on both sites, and the target default must exist on the source. Full
site copy uses these localized copy stages and includes the complete consent
configuration. With --allow-errors, consent is skipped with a warning if its
page-backed privacy policy could not be copied.
Consent configuration
Manage the complete consent configuration without raw API calls:
nimbu settings consent config get --json
nimbu settings consent config update enabled:=true privacy_policy_url.nl=/privacybeleid
nimbu --force settings consent config replace --file=consent.json
nimbu settings consent config copy --from=staging --to=production --dry-run --jsonupdate patches selected fields. replace requires an explicit JSON file or
--file=- plus --force because it replaces the whole configuration. copy
resolves page references on the target site and preserves localized and
unknown fields.
Shipping rates
Shipping rates have native CRUD commands:
nimbu shipping-rates list --locale=nl --json
nimbu shipping-rates get --rate=RATE_ID --locale=nl
nimbu shipping-rates create name=Express price:=12.5 region_id=REGION_ID
nimbu shipping-rates update --rate=RATE_ID --locale=nl name=Spoed
nimbu shipping-rates update --rate=RATE_ID --locale=fr name=Express
nimbu --force shipping-rates delete --rate=RATE_IDThere is no shipping-rates count or shipping-rates copy. The API does not
accept a nested translations payload for shipping rates. Create the rate
once, then repeat update --rate with --locale for each translation.
Region IDs are opaque and site-specific. For that reason, sites copy
inspects source shipping rates but does not copy them. If it finds any, its
structured result and progress output include an explicit warning with the
number skipped.
Other native workflows
nimbu products attachments list --product=shirt
nimbu products attachments download --product=shirt --attachment=manual --output=manual.pdf
nimbu uploads download --id=UPLOAD_ID --output=image.jpg
nimbu apps code get --app=storefront --filename=main.js
nimbu pages versions list --page=about
nimbu customers roles set --customer=CUSTOMER_ID --role=member --role=buyer
nimbu settings get --section=shipping
nimbu settings update --section=shipping enabled:=true
nimbu announcements list --all
nimbu domain-registrations list --allFor page content, nimbu pages get|update|versions wrap the REST endpoints described in
Working with Pages via the API. Read that guide before using pages update --replace, or when you need surgical batch operations, drafts, or preview tokens that the CLI does
not expose natively yet. In the meantime nimbu api post /pages/<page>/draft/batch --data @ops.json
works for draft batches; live batches need an If-Match header, which nimbu api cannot send, so
use curl for those.
Customer role add and remove derive direct membership from the role resources, so inherited roles are not promoted to direct assignments. They still use a verified read-modify-write cycle; concurrent changes can race until the API offers conditional or atomic mutations.