Nimbu Developer Docs
CLI

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.json

Top-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:

translations.json
[
  {
    "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=Bienvenue

The 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 --json

Product 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.

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 --json

update 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_ID

There 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 --all

For 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.

On this page