---
question: Is there a Nexus screen that creates an organization?
kind: task
via_web: na
via_cli: available
via_python: na
via_api: available
via_config: available
ref_cli: abi org create
ref_api: POST /api/organizations
ref_config: nexus_config.organizations
prereq: A signed-in Nexus account. Any account can create an organization and becomes its owner.
next:
  - /capabilities/platform/create-a-workspace
  - /capabilities/platform/invite-an-organization-member
---

# Create an organization

An [organization](/user-guide/platform/organization) is the tenancy above workspaces. Its slug follows the workspace rule: lowercase letters, digits and dashes, no dash at either end. A generated project already seeds one from its config.

## Web UI

Not applicable. Nexus lists organizations, under Organization Settings, but has no screen that creates one. Use the CLI, the REST API or the config.

## CLI

### Create it

```bash
abi org create --name "Acme" --slug acme
```

Both options are required. The command calls `POST /api/organizations` and prints the organization; you are its owner. It signs in with `--token` (`NEXUS_ACCESS_TOKEN`), or with `--auth-email` and `--auth-password`, against `--api-url` (default `http://localhost:9879`). See [`abi org create`](/user-guide/reference/cli#abi-org-create).

### Check it

```bash
abi org list
```

## Python

Not applicable. ABI has no Python API for organizations. From Python, call the REST API.

## REST API

### Create it

```bash
curl -X POST http://localhost:9879/api/organizations \
  -H "Authorization: Bearer $NEXUS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "Acme", "slug": "acme"}'
```

The access token comes from `POST /api/auth/login`. Branding fields (`logo_url`, `primary_color`, `default_theme`, ...) are optional. The response is the organization, with an id that starts with `org-`. A slug in use answers 400 "Slug already exists".

## Config

### Add it to `nexus_config`

```yaml title="config.yaml"
nexus_config:
  organizations:
    - name: "Acme"
      slug: "acme"
      owner_email: "admin@example.com"
      workspaces:
        - name: "Acme"
          slug: "acme"
```

`owner_email` must name a user that exists: one from `users:` or one already in the database. Otherwise the organization is skipped, with a warning in the logs. `members:` is deprecated and ignored.

### Restart the API

The list is applied when the API starts, by slug. On an organization that already exists, the owner is set back to `owner_email`, and every branding field is overwritten from the config on each start: change branding in the config, not in Nexus.
