> ## Documentation Index
> Fetch the complete documentation index at: https://chatcli.edilsonfreitas.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Chat gateway

> Run ChatCLI as a messaging daemon on Telegram, Slack, Discord, WhatsApp or any system that speaks HTTP: every message runs the full agent with its tools, and the progress comes back to the chat while it works.

The **chat gateway** puts ChatCLI behind a bot. You message it from **Telegram, Slack, Discord, WhatsApp** or a **generic webhook**, and every message runs the same engine as `/coder`, with its tools (files, shell, web, MCP) and your memory, while the progress and the answer come back to the conversation.

## Connect a channel

Pick a channel for its setup, variables and limits.

<div className="cc-channels">
  <a className="cc-channel" href="/gateway/telegram"><span className="cc-channel-icon cc-ch-telegram"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z" /></svg></span><span className="cc-channel-name">Telegram</span><svg className="cc-channel-arrow" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M5 12h14" /><path d="m12 5 7 7-7 7" /></svg></a>
  <a className="cc-channel" href="/gateway/slack"><span className="cc-channel-icon cc-ch-slack"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zM6.313 15.165a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zM8.834 6.313a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zM18.956 8.834a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zM17.688 8.834a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zM15.165 18.956a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zM15.165 17.688a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z" /></svg></span><span className="cc-channel-name">Slack</span><svg className="cc-channel-arrow" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M5 12h14" /><path d="m12 5 7 7-7 7" /></svg></a>
  <a className="cc-channel" href="/gateway/discord"><span className="cc-channel-icon cc-ch-discord"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z" /></svg></span><span className="cc-channel-name">Discord</span><svg className="cc-channel-arrow" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M5 12h14" /><path d="m12 5 7 7-7 7" /></svg></a>
  <a className="cc-channel" href="/gateway/whatsapp"><span className="cc-channel-icon cc-ch-whatsapp"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413Z" /></svg></span><span className="cc-channel-name">WhatsApp</span><svg className="cc-channel-arrow" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M5 12h14" /><path d="m12 5 7 7-7 7" /></svg></a>
  <a className="cc-channel" href="/gateway/webhook"><span className="cc-channel-icon cc-ch-webhook"><svg viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M18 16.98h-5.99c-1.1 0-1.95.94-2.48 1.9A4 4 0 0 1 2 17c.01-.7.2-1.4.57-2" /><path d="m6 17 3.13-5.78c.53-.97.1-2.18-.5-3.1a4 4 0 1 1 6.89-4.06" /><path d="m12 6 3.13 5.73C15.66 12.7 16.9 13 18 13a4 4 0 0 1 0 8" /></svg></span><span className="cc-channel-name">Webhook</span><svg className="cc-channel-arrow" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M5 12h14" /><path d="m12 5 7 7-7 7" /></svg></a>
</div>

| | Telegram | Slack | Discord | WhatsApp | Webhook |
| - | - | - | - | - | - |
| Needs a public URL | no | yes | no | yes | yes, to receive |
| Sender allow-list | yes | no | no | no | shared secret |
| Voice in | yes | yes | yes | yes | yes |
| Voice replies | yes | no | no | no | no |
| Images in | yes | yes | yes | yes | yes |
| Images out | yes | yes | yes | yes | yes |
| "Working on it" | typing indicator | text notice | text notice | text notice | callback notice |

<Warning>
  The agent runs **without confirmations**, with its tools and shell. Treat the gateway as a privileged remote surface: only Telegram has a sender allow-list, so on the other channels decide who can reach the bot with the platform's own permissions, and harden the agent with `CHATCLI_AGENT_SECURITY_MODE=strict` before exposing it. See [Security](/security/overview).
</Warning>

## Start and stop

The gateway runs as a **detached daemon**: `/gateway start` launches `chatcli gateway` in the background and gives the prompt back at once, so you keep using ChatCLI as usual.

```text theme={"system"}
/gateway start     # start every configured channel in the background (also: /gateway)
/gateway status    # pid, the channels running, and the voice transcription backend (also: /gateway platforms)
/gateway stop      # stop the daemon
```

* Each channel **starts only when its required variables are set**, so configure just the ones you want. With none configured, `/gateway start` says so and nothing runs.
* The daemon keeps its pid in `~/.chatcli/gateway.pid` (a second `start` while it runs is refused) and writes to `~/.chatcli/gateway.log`, which is the first place to look when a channel stays quiet.
* `chatcli gateway` runs the same daemon in the foreground, for a service manager or a container; it stops on `Ctrl+C` or `SIGTERM`.
* With `CHATCLI_GATEWAY_IN_SERVER=true`, the gateway runs inside [`chatcli server`](/server/server-mode) instead and shares its Conversation Hub with connected clients.

## How a message is handled

```text theme={"system"}
Channel adapter --message--> Runner --> agent (the /coder engine, unattended) --> reply
       ^                                   |
       └──── "working on it", progress ─────┘
```

1. The **adapter** receives the message through the platform's own HTTP API (no third-party SDKs), downloads any voice note or image, and hands it to the runner. Each chat is one conversation, keyed by platform and chat.
2. A voice note is **transcribed first**, so the agent always gets text; an image is attached to the turn for the model to see.
3. The **agent** runs the request with its tools and without confirmations, in the gateway's conversational voice and in the language of the message.
4. While it works, the person sees that it is on it: the native "typing…" on Telegram, or one short notice (`gateway.thinking`, "🤔 Got it — working on that…") on the other channels, sent only when the reply takes more than about 2 seconds. Progress from the agent's tool calls is merged and sent as new messages at most every 3 seconds.
5. The **reply** is the agent's final answer, written as a chat message; "✅" is sent only if the agent finished without one. An error comes back as "⚠️" followed by the error.

### Concurrency and context

Messages are received in parallel (up to 64 queued, 4 workers) but **agent runs happen one at a time across all channels**, because the agent uses shared ChatCLI state. Each turn gets the last 12 turns of the sender's [Conversation Hub](/gateway/conversation-hub) thread as context; durable state lives in the files the agent edits and in [named sessions](#session-binding-from-the-channel).

### Limits shared by every channel

* A reply is cut at **3500 characters** and ends with `…`.
* One voice note and one image per message are used; downloads are capped by `CHATCLI_GATEWAY_MAX_AUDIO_BYTES` and `CHATCLI_GATEWAY_MAX_IMAGE_BYTES` (20 MB each by default).

## Runtime model

The gateway **mirrors the model (and provider) your interactive session is using** — not the `.env` default. Switching model or provider in the REPL with `/switch`, `/model`, or `/max-tokens` propagates to the daemon: it re-reads the choice **before every message**, so a conversation already running on Telegram starts answering with the new model without restarting the gateway.

Because the daemon runs as a **separate process**, the sync goes through a small state file at `~/.chatcli/runtime_model.json` that the interactive session writes and the daemon reads. This covers both cases: **starting the gateway after** a model switch, and **switching while the gateway is already running**.

<Note>
  When you switch **provider**, the daemon adopts the new provider with its correct model — as long as that provider's credentials are present in the environment the daemon inherited (usually your `.env`). Adjustments that live only in memory, such as StackSpot's `/switch --realm` / `--agent-id`, do **not** propagate through this file; set them via environment variable or restart the gateway.
</Note>

***

## Conversational replies (not "coder tone")

The gateway runs the same engine as `/coder` — **all the tools** (read/edit files, shell, web, MCP) are still available — but with its own **conversational voice**. The final reply is the **message the person reads in chat**, not a technical commit summary: direct, natural text, with no tables, banners, ASCII art, or long code blocks (unless code is asked for). Under the hood this is a dedicated gateway system prompt used in place of the coder prompt, preserving the tool-use mechanics.

### Dynamic language (follows the sender)

Replies come out **in the language of the user's message**, detected **every turn** — not pinned to the daemon locale. Portuguese → answers in Portuguese; Spanish → Spanish; and so on. The dynamic language directive is applied on **every** gateway path (including with an active persona), so the reply is never statically stuck in one language. In the **interactive CLI**, the fixed per-locale directive (`CHATCLI_LANG`) still applies — only the gateway changes.

***

## Usage example

```text theme={"system"}
export LLM_PROVIDER=CLAUDEAI
export ANTHROPIC_API_KEY=sk-ant-...
export CHATCLI_TELEGRAM_BOT_TOKEN=123456:ABC...
export CHATCLI_TELEGRAM_ALLOWED_USERS=111111111
chatcli
> /gateway start
  OK Gateway started (pid=4821) on: telegram. Logs: ~/.chatcli/gateway.log
```

On Telegram, user `111111111` sends:

> *"list the Go files changed in the last commit and summarize the diff"*

The bot shows "typing…", sends progress as the agent runs `git` and reads the files, and ends with the summary written as a chat message. A message from anyone who is not in `CHATCLI_TELEGRAM_ALLOWED_USERS` gets no answer.

***

## Voice messages (transcription)

The gateway accepts **voice notes and audio** on every channel. The message is **transcribed to text before the pipeline** — so it works with **any of the 14 chat providers** (they only ever see text; no multimodal model or message redesign needed). The adapter downloads the media, transcribes it, and the agent treats it as a normal text request — the transcript is even recorded in the [Conversation Hub](/gateway/conversation-hub).

| Channel | Voice source |
| - | - |
| Telegram | voice note / audio (`getFile` → download) |
| WhatsApp | audio message (Graph media API lookup) |
| Discord | `audio/*` attachment (CDN) |
| Slack | `audio/*` file (`url_private`, bearer token) |
| Webhook | `audio_b64` (inline base64) or `audio_url` |

### Transcription backend (zero-config, local-first, keyless)

Selection is **local/keyless first** — and since v1.135 it has an **embedded floor**: with nothing configured, the gateway uses the **embedded Whisper** (multilingual, via [sherpa-onnx](/gateway/text-to-speech) — the same engine as the Kokoro TTS), no API key and no cgo. The daemon **pre-downloads engine + model at startup**, so the first voice note arrives with everything ready.

1. **`CHATCLI_TRANSCRIPTION_CMD`** — your own local STT command (any wrapper). Reads the transcript from **stdout**, or from the `.txt` it writes into `{output_dir}`.
2. **`CHATCLI_TRANSCRIPTION_URL`** — a **self-hosted** OpenAI-compatible endpoint (whisper.cpp `whisper-server`, faster-whisper, Speaches). Keyless (unless `CHATCLI_TRANSCRIPTION_KEY`).
3. **Embedded Whisper already provisioned** — when the cache (`~/.cache/chatcli/stt/`) holds engine + model, it wins over any cloud key.
4. **A whisper CLI on PATH** — if `whisper` (openai-whisper) or `whisper-cli` (whisper.cpp) is installed, it's used **automatically, zero config**. The ggml model is **downloaded once** to the cache (`~/.cache/chatcli/whisper/`), like faster-whisper does.
5. **`GROQ_API_KEY`** → Groq Whisper (free tier).
6. **`OPENAI_API_KEY`** → OpenAI Whisper.
7. **Nothing configured** → **embedded Whisper**: one-time download (engine \~25MB + `base` model \~200MB) when the daemon starts. Only platforms without a prebuilt engine (outside Linux/macOS/Windows x64/arm64) fall back to the configuration hint.

`CHATCLI_TRANSCRIPTION_PROVIDER` pins a backend (`embedded|command|url|groq|openai`) — `=embedded` forces the embedded engine even with whisper/keys present. `CHATCLI_TRANSCRIPTION_MODEL` picks the embedded model size (`tiny|base|small|medium|large-v3`, default `base`) or the cloud model; `_LANG` pins the language (default: auto-detect the spoken language); `CHATCLI_TRANSCRIPTION_CACHE_DIR` relocates the cache (absolute path — useful for air-gapped pre-seeding); `CHATCLI_GATEWAY_MAX_AUDIO_BYTES` caps the download size (default 20MB). The active backend is shown in `/config integrations`.

<Note>
  **Voice notes are OGG/Opus.** The embedded engine decodes WAV and OGG/Opus by itself, so Telegram, WhatsApp and Discord voice notes work with nothing else installed; it needs **ffmpeg** only for MP3, M4A/AAC, FLAC and WMA. A local **whisper.cpp** cannot decode Opus and needs ffmpeg, which the gateway then uses to convert to 16 kHz WAV automatically. Cloud and self-hosted backends decode on the server. The language is detected from the audio, so the transcript, and the reply, follow the spoken language.
</Note>

#### Quick setup

**Zero-config** (embedded Whisper — recommended):

```bash theme={"system"}
/gateway start             # the daemon downloads engine + model on first boot
```

100% local with whisper.cpp (if you prefer the ggml engine):

```bash theme={"system"}
brew install whisper-cpp ffmpeg          # macOS  (Linux: apt/dnf; Windows: scoop/winget); ffmpeg decodes Opus for it
# nothing else: chatcli detects whisper-cli, downloads the model on first use, and converts with ffmpeg
```

Self-hosted (a whisper server that decodes Opus):

```bash theme={"system"}
export CHATCLI_TRANSCRIPTION_URL="http://localhost:8080/v1"   # keyless
```

Cloud (decodes Opus server-side, nothing installed locally):

```bash theme={"system"}
export CHATCLI_TRANSCRIPTION_PROVIDER=openai   # uses OPENAI_API_KEY (or =groq with GROQ_API_KEY)
```

After configuring, restart the daemon (`/gateway stop && /gateway start`) and send a voice message.

***

## Voice replies

On **Telegram** the way back speaks too: by default (`CHATCLI_GATEWAY_VOICE_REPLY=auto`) a voice note gets a voice note back and text gets text, with any TTS backend, including the [embedded Kokoro engine](/gateway/text-to-speech) (offline, no API key). Each conversation can turn it on or off in plain words ("answer me in audio", "stop sending audio") through the `@voice` tool, and the choice is kept per conversation. The other channels answer in text: the gateway does not synthesize audio for them. Details in **[Voice replies](/gateway/voice-replies)**.

## Images

A photo or image file in a message is attached to the turn for the model to see, with native vision when the model supports it; an image sent without text gets a default instruction to describe it. When the agent **generates an image** during the turn, the first one goes back with the reply on every channel; set `CHATCLI_GATEWAY_IMAGE_REPLY=never` to send text only.

The gateway also treats the user's **memory index** as real knowledge: personal questions ("what do you know about me?") consult [persistent memory](/context/bootstrap-memory) through `@memory recall` before any "I don't know".

***

## Cross-channel continuity

When the **[Conversation Hub](/gateway/conversation-hub)** is active (the default), the gateway shares the conversation with the chatcli on your notebook: a topic started on Telegram continues in the terminal and vice-versa. Each incoming message resolves the sender's **principal**, reads recent context, and records the turn in the hub — so what you said on the notebook shows up as context on Telegram, with zero configuration (single-user mode). For real-time push to a connected CLI, run the gateway **inside the server** with `CHATCLI_GATEWAY_IN_SERVER=true`. Multi-user bots use `CHATCLI_HUB_ISOLATE=true` + bindings. Details in [Conversation Hub](/gateway/conversation-hub).

***

## Session binding from the channel

On top of the ephemeral hub, channel users can bind their conversation to a **named saved session** — the durable, cross-surface layer — by sending `/session` commands in the chat:

| Command | Effect |
| - | - |
| `/session attach <name>` | Binds the sender to the named session (creates it if it doesn't exist yet). The hub thread is rotated so the old backlog is not interleaved with the bound session. |
| `/session detach` | Drops the binding; turns go back to hub-only context. |
| `/session status` | Shows whether the sender is bound, and to which session. |
| `/session save <name>` | Snapshots the current hub conversation into the store under `<name>` and binds to it. |
| `/session list` | Lists saved sessions. |
| `/session new` | Unbinds and rotates the hub thread — a fresh conversation. |

While bound, the turn's context comes from the **named session file** — which carries the turns other surfaces (terminal REPL, MCP/ACP server, another channel) wrote through — and each completed gateway turn is appended to that same file. So `/session attach projeto-x` on WhatsApp continues the exact conversation you started with `/session attach projeto-x` in the terminal or the IDE. The binding is **per principal** (sender) and persisted in the hub's runtime settings, so it survives daemon restarts.

<Note>
  `/session delete` is deliberately **not** exposed to channels: a gateway conversation may be multi-user, and destroying store state stays an operator/REPL decision. And a message that merely starts with `/` but isn't a session command flows to the model as normal user text — input is never hijacked.
</Note>

The write-through / last-writer-wins model behind this is described in [Cross-surface continuity](/context/session-management#cross-surface-continuity).

***

## See also

<CardGroup cols={2}>
  <Card title="Conversation Hub" icon="share-nodes" href="/gateway/conversation-hub">
    One conversation across channels and your terminal.
  </Card>

  <Card title="Proactive messaging" icon="paper-plane" href="/gateway/proactive-messaging">
    Let the agent message a channel first with `@send`.
  </Card>

  <Card title="Session management" icon="clock-rotate-left" href="/context/session-management">
    Named sessions shared by every surface.
  </Card>

  <Card title="Environment variables" icon="rectangle-list" href="/reference/environment-variables#chat-gateway-telegram-slack-discord-whatsapp-webhook">
    Every gateway setting in one table.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.