> For the complete documentation index, see [llms.txt](https://developer.celigo.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://developer.celigo.com/cli/getting-started/profiles.md).

# Profiles & regions

A **profile** is a named set of credentials — a token plus a base URL, plus per-profile defaults. One binary, many accounts.

Profiles live in `~/.celigo/config.json`:

```json
{
  "active_profile": "prod",
  "profiles": {
    "prod": {
      "api_token": "abc…xyz",
      "base_url": "https://api.integrator.io",
      "default_format": "table"
    },
    "eu": {
      "api_token": "def…qrs",
      "base_url": "https://api.eu.integrator.io"
    },
    "au": {
      "api_token": "ghi…tuv",
      "base_url": "https://api.au.integrator.io"
    },
    "qa": {
      "api_token": "jkl…wxy",
      "base_url": "https://api.integrator.io",
      "default_format": "json"
    }
  }
}
```

`prod` and `qa` share a base URL because environments do not get their own hostname. Every environment has its own token, so give each one its own profile.

File mode is `0600` on Unix. Tokens are redacted on any CLI output.

## Managing profiles

All profile management happens through `celigo profile <subcommand>`. Full syntax and flags for each subcommand live in the [command reference](/cli/commands/profile.md). In short: `profile add` creates one, `profile use` switches the active profile, `profile list` shows them, and `profile rename` / `profile delete` rename and delete them.

There is no `profile edit`. To change a field on an existing profile, either `celigo config set <key> <value>` against it (see the [`config` command reference](/cli/commands/config.md)) or `profile delete` + `profile add` to rebuild it.

## Selecting a profile

```bash
# Per-command, overrides everything
celigo --profile eu integrations list

# Persistent default
celigo profile use eu
celigo integrations list
```

## Regions

| Region | API base URL                   |
| ------ | ------------------------------ |
| US     | `https://api.integrator.io`    |
| EU     | `https://api.eu.integrator.io` |
| AU     | `https://api.au.integrator.io` |
| CA     | `https://api.ca.integrator.io` |

Create one profile per region:

```bash
celigo profile add us --api-token "$US_TOKEN" --api-base-url https://api.integrator.io
celigo profile add eu --api-token "$EU_TOKEN" --api-base-url https://api.eu.integrator.io
celigo profile add au --api-token "$AU_TOKEN" --api-base-url https://api.au.integrator.io
celigo profile add ca --api-token "$CA_TOKEN" --api-base-url https://api.ca.integrator.io
```

Tokens are **not** interchangeable — a token from one region authenticating against another region's base URL will return `401 Unauthorized`.

See [Environments & regions](https://developer.celigo.com/api/getting-started/environments) in the API section for the full context.

## Per-profile config keys

| Field            | Typical use                                              |
| ---------------- | -------------------------------------------------------- |
| `api_token`      | Bearer token.                                            |
| `base_url`       | API base URL; defaults to `https://api.integrator.io`.   |
| `default_format` | `json` for CI, `table` for humans.                       |
| `mode`           | Permission mode: `read`, `operate`, or `full` (default). |

Edit any of these with `--profile <name> config set <key> <value>`:

```bash
celigo --profile ci config set default_format json
celigo --profile ci config set mode read
```

## Permission modes

* **`full`** (default) — create/update/set/delete all resources.
* **`operate`** — read + edit a narrow allow-list of fields (`disabled`, `debugUntil`, `schedule`, `autoResolveAt`). Useful for operational profiles that can pause flows but not change their configuration.
* **`read`** — read only. `list`, `get`, `account`, `config`, `profile` are allowed; any mutation is rejected before the request leaves your machine.

A few operations use `POST` but only read or transform data, so `read` mode allows them: marketplace browsing, export previews and `exports invoke`, connection pings, lookup-cache reads, execution-log and EDI transaction queries, signed download URLs, multi-select audit queries, and every [processors](/cli/commands/processors.md) transform. None of them create, run, or change anything on the account.

## CI recipes

### GitHub Actions

```yaml
- name: Celigo deploy
  env:
    CELIGO_API_TOKEN: ${{ secrets.CELIGO_PROD_TOKEN }}
    CELIGO_BASE_URL: https://api.integrator.io
  run: |
    npx --yes @celigo/celigo-cli@latest integrations list --format json > integrations.json
```

No profile file needed — pass the env vars.

### GitLab CI

```yaml
deploy-celigo:
  image: node:22
  variables:
    CELIGO_BASE_URL: https://api.integrator.io
  script:
    - npm install -g @celigo/celigo-cli
    - celigo integrations list
```

Set `CELIGO_API_TOKEN` as a masked CI variable.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://developer.celigo.com/cli/getting-started/profiles.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
