Exchange is excluded from this API/CLI release. Any historical Exchange API or CLI example in this guide is unavailable; native portal behavior is outside this exclusion. See [current release scope](/developers/guides/release-scope?lang=en).

# Public portal settings

Internal administrators can change the public portal name and contact address. The name appears in the page title and footer; the contact address appears in the footer. These settings apply to **the entire portal and every company**, even when an administrator has selected a specific company context.

This administration does not change the SMTP sender address, portal URL, login policy, supplier connection, currency, VAT or billing. The corresponding server settings are shown on the page for information only. Existing company-specific configuration rows, styling and the logo are preserved; this function edits only the existing global name and contact address.

## In the portal

Open **Portal settings**, enter the public name and contact address, confirm that the change applies to every company and choose **Save portal details**. Confirm with a recent passkey. The next page shows the new details. No email is sent.

If the response is interrupted, reload the page and check the values actually stored before making another change. The form does not automatically repeat an uncertain write. If another administrator changed the settings, your stale version is refused; review the new values first.

## CLI

Sign in as a human internal administrator. `--account` selects the administration context and does not restrict this global change to that company.

```sh
binadit admin portal-settings get --account 1
binadit admin portal-settings update --account 1 --version CURRENT_VERSION --confirm-global --from-file branding.json --dry-run
binadit admin portal-settings update --account 1 --version CURRENT_VERSION --confirm-global --from-file branding.json
```

Replace `CURRENT_VERSION` with the `version` from `get`. The JSON file contains only:

```json
{
  "app_name": "Voorbeeldportal",
  "contact_email": "help@example.com"
}
```

Use a private file or trusted stdin; on Windows, supply JSON through `--from-file -`. For unattended input, use `--yes`, while retaining explicit `--confirm-global` and current human administrator verification. An automation key cannot access this administration. `--dry-run` checks the command without storing settings or a mutation operation.

## API

| Method and path | Scope | Behavior |
| --- | --- | --- |
| `GET /api/v1/accounts/{context}/admin/portal-settings` | `admin:read` | Global name, contact address, `scope: global` and version; ETag in the headers |
| `PUT /api/v1/accounts/{context}/admin/portal-settings` | `admin:write` | Store the exact reviewed global details |

Both endpoints require a current human internal administrator with recent passkey verification. A PUT contains `app_name`, `contact_email` and `confirm_global: true`, plus optional `dry_run: true`. Send the current `If-Match` and one durable `Idempotency-Key`. A missing version returns `428`; a changed version returns `412`; invalid or unsupported fields return `422`. The change and audit are stored atomically. One shared database lock prevents two first updates from creating multiple global configurations. Existing duplicate global configurations return `409` and require correction before saving.

After a lost response, preserve the original body and idempotency key. Read the stored details or the original operation. Replaying the same key returns the original confirmed result; do not replace the key to bypass a version conflict.

## Instructions for AI agents

Global scope is a material property: explicitly preserve `confirm_global: true` and show that the change affects every company. Never interpret `--account` as a company-specific branding target. Read the current version, review the exact two public fields, and use an original idempotency key for writes. After ambiguity, inspect current settings and the original operation rather than guessing success. Do not extend this endpoint to SMTP, authentication, supplier, payment or tax configuration. Never place credentials in the public name or contact field.
