---
title: Introducing the Truto CLI
slug: introducing-truto-cli
date: 2026-04-15
author: Roopendra Talekar
categories: [Product Updates, Engineering]
excerpt: "Manage your entire Truto integration platform from the terminal. Install in one command, query unified APIs, export data, batch operations, and diff records."
tldr: "The Truto CLI is a single standalone binary that gives you full control over integrations, unified APIs, data exports, batch operations, and record diffs — all from the terminal."
canonical: https://truto.one/blog/introducing-truto-cli/
---

# Introducing the Truto CLI


Dashboards are for overview. Terminals are for doing. If you're an engineer working with Truto, you shouldn't have to leave your terminal to manage integrations, query data, or debug a failing sync job.

The Truto CLI is a standalone binary that puts the entire Truto platform at your fingertips — unified APIs, proxy APIs, admin resources, bulk exports, batch operations, and record diffs. One `curl` to install, one command to authenticate, and you're running.

<link rel="stylesheet" href="https://esm.sh/terminal-demo@0.1.11/dist/style.css">
<script type="importmap">{"imports":{"terminal-demo":"https://esm.sh/terminal-demo@0.1.11"}}</script>
<div id="cli-blog-demo" style="margin: 2rem 0; border-radius: 8px; overflow: hidden;"></div>
<script type="module">
import { TerminalDemo } from 'terminal-demo'
var fast = window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 100 : 1.2
new TerminalDemo(document.getElementById('cli-blog-demo'), {
  title: 'truto — zsh',
  promptText: '~',
  promptSymbol: '$',
  autoPlay: true,
  loop: true,
  speed: fast,
  theme: {
    background: '#1a1a1a',
    foreground: '#f9f8f6',
    headerBackground: '#252525',
    cursor: '#fc5b37',
    prompt: '#8a8a8a',
    buttonClose: '#ff5f57',
    buttonMinimize: '#febc2e',
    buttonMaximize: '#28c840',
    gray: '#8a8a8a',
    green: '#28c840',
    cyan: '#7dcfff',
    yellow: '#febc2e',
    red: '#ff5f57',
    purple: '#bb9af7',
    white: '#f9f8f6'
  },
  scenarios: [
    {
      name: 'install',
      steps: [
        { type: 'prompt' },
        { type: 'command', text: 'curl -fsSL https://cli.truto.one/install.sh | bash', delay: 30 },
        { type: 'output', text: ' [gray]Detected: darwin arm64 [/gray]' },
        { type: 'spinner', text: 'Downloading truto v0.2.1...', duration: 1200 },
        { type: 'output', text: ' [green]\u2713 Installed to ~/.truto/bin/truto [/green]' },
        { type: 'wait', ms: 1200 }
      ]
    },
    {
      name: 'login',
      steps: [
        { type: 'prompt' },
        { type: 'command', text: 'truto login', delay: 50 },
        { type: 'output', text: ' [cyan]\u25c6  Profile name [/cyan]' },
        { type: 'output', text: ' [gray]\u2502 [/gray]  default' },
        { type: 'wait', ms: 400 },
        { type: 'output', text: ' [cyan]\u25c6  API base URL [/cyan]' },
        { type: 'output', text: ' [gray]\u2502 [/gray]  https://api.truto.one' },
        { type: 'wait', ms: 400 },
        { type: 'output', text: ' [cyan]\u25c6  API token [/cyan]' },
        { type: 'output', text: ' [gray]\u2502 [/gray]  \u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa' },
        { type: 'wait', ms: 300 },
        { type: 'spinner', text: 'Verifying credentials', duration: 900 },
        { type: 'output', text: ' [green]\u25c7  Credentials verified [/green]' },
        { type: 'output', text: ' [green]\u2713 Logged in as profile "default" at https://api.truto.one [/green]' },
        { type: 'wait', ms: 1200 }
      ]
    },
    {
      name: 'query',
      steps: [
        { type: 'prompt' },
        { type: 'command', text: 'truto unified crm contacts -a acme-sf -o table', delay: 35 },
        { type: 'spinner', text: 'Fetching contacts...', duration: 1000 },
        { type: 'output', text: '\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510' },
        { type: 'output', text: '\u2502 name         \u2502 email               \u2502 company    \u2502' },
        { type: 'output', text: '\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524' },
        { type: 'output', text: '\u2502 Jane Cooper  \u2502 jane@acme.co        \u2502 Acme Corp  \u2502' },
        { type: 'output', text: '\u2502 Alex Rivera  \u2502 alex.r@globex.io    \u2502 Globex     \u2502' },
        { type: 'output', text: '\u2502 Sam Chen     \u2502 schen@initech.com   \u2502 Initech    \u2502' },
        { type: 'output', text: '\u2502 Maya Wong    \u2502 mwong@soylent.co    \u2502 Soylent    \u2502' },
        { type: 'output', text: '\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518' },
        { type: 'wait', ms: 1500 }
      ]
    },
    {
      name: 'export',
      steps: [
        { type: 'prompt' },
        { type: 'command', text: "truto export crm/contacts -a acme-sf -o ndjson | jq '.email'", delay: 30 },
        { type: 'spinner', text: 'Exporting...', duration: 800 },
        { type: 'output', text: ' [cyan]"jane@acme.co" [/cyan]' },
        { type: 'output', text: ' [cyan]"alex.r@globex.io" [/cyan]' },
        { type: 'output', text: ' [cyan]"schen@initech.com" [/cyan]' },
        { type: 'output', text: ' [cyan]"mwong@soylent.co" [/cyan]' },
        { type: 'output', text: ' [cyan]"priya.k@umbrella.io" [/cyan]' },
        { type: 'output', text: ' [gray]Exported 247 records [/gray]' },
        { type: 'wait', ms: 1500 }
      ]
    }
  ]
})
</script>

## Install in one command

No package managers. No dependencies. A single `curl` downloads a standalone binary for your platform:

```bash
curl -fsSL https://cli.truto.one/install.sh | bash
```

The installer detects your OS and architecture (macOS, Linux, x64, arm64), downloads the correct binary, and drops it into `~/.truto/bin/truto`. That's it.

Need a specific version or a custom install path?

```bash
TRUTO_VERSION=0.1.0 curl -fsSL https://cli.truto.one/install.sh | bash
TRUTO_INSTALL_DIR=/usr/local/bin curl -fsSL https://cli.truto.one/install.sh | bash
```

The CLI is self-updating. Run `truto upgrade` to pull the latest version and replace the binary in-place. Run `truto upgrade --check` to see if there's a new version without installing it.

## Authenticate

Run `truto login` and you get an interactive setup powered by [clack](https://github.com/bombshell-dev/clack) — profile name, API URL, and token (masked input). The token is verified against the API before saving.

```bash
truto login
```

For CI/CD or scripted usage, skip the prompts entirely:

```bash
truto login --token <your-api-token>
truto login --token <token> --profile-name staging --api-url https://your-instance.truto.one
```

Verify your credentials:

```bash
$ truto whoami
┌─────────┬───────────────────────┬──────────────────┐
│ profile │ api_url               │ team_name        │
├─────────┼───────────────────────┼──────────────────┤
│ default │ https://api.truto.one │ Acme Engineering │
└─────────┴───────────────────────┴──────────────────┘
```

The CLI supports multiple profiles — maintain separate credentials for staging, production, and different teams. Switch between them with `truto profiles use <name>`.

## Query any integration

The CLI covers every Truto data-plane API — unified, proxy, and custom.

**Unified API** gives you normalized data across integrations. Same field names whether you're querying Salesforce, HubSpot, or Pipedrive:

```bash
truto unified crm contacts -a <account-id> -o table
truto unified crm contacts <contact-id> -m get -a <account-id>
truto unified crm contacts -m create -a <account-id> -b '{"first_name":"Jane","last_name":"Doe"}'
```

**Proxy API** gives you the raw, integration-specific data without any schema normalization:

```bash
truto proxy tickets -a <account-id>
truto proxy tickets T-42 -m get -a <account-id>
```

**Custom API** lets you call your own endpoints built on Truto:

```bash
truto custom /my-endpoint -a <account-id>
truto custom /my-endpoint -m POST -a <account-id> -b '{"key":"value"}'
```

### Five output formats

Every command supports five output formats via `-o`:

| Format   | Best for                              |
| -------- | ------------------------------------- |
| `table`  | Interactive use, quick inspection     |
| `json`   | Piping to `jq`, saving to files      |
| `ndjson` | Streaming, log processing, piping    |
| `csv`    | Spreadsheets, data analysis           |
| `yaml`   | Config files, human-readable output  |

## Power features

Beyond querying, the CLI ships three power tools that make it genuinely useful for day-to-day workflows.

### Export

Bulk-export any resource with automatic pagination. The CLI handles cursors and streams results in your chosen format:

```bash
truto export crm/contacts -a <account-id> -o ndjson --out contacts.ndjson
truto export crm/contacts -a <account-id> -o csv --out contacts.csv
```

NDJSON and CSV stream page-by-page as data arrives — safe for large datasets. Pipe directly to other tools:

```bash
truto export crm/contacts -a <account-id> -o ndjson | jq '.email'
truto export crm/contacts -a <account-id> -o ndjson | wc -l
```

A slash in the resource name means unified API (`crm/contacts`). No slash means proxy (`tickets`).

### Batch

Execute multiple API requests from a JSON file in a single command:

```bash
truto batch requests.json -a <account-id>
```

Mix creates, updates, and deletes. Each request runs in parallel with individual status reporting:

```
✓ POST crm/contacts → 201 (42ms)
✓ PATCH crm/contacts/c_17 → 200 (51ms)
✓ DELETE crm/contacts/c_99 → 204 (29ms)
3/3 succeeded in 112ms
```

You can also pipe batch requests from stdin:

```bash
cat updates.ndjson | truto batch --stdin -a <account-id>
```

### Diff

Compare two records field-by-field, or diff the same record across two different integrated accounts:

```bash
truto diff crm/contacts abc-123 def-456 -a <account-id>
truto diff crm/contacts abc-123 -a <account-1> --account2 <account-2>
```

```
Diff: abc-123 vs def-456
┌─────────────┬───────────────┬───────────────┐
│ Field       │ abc-123       │ def-456       │
├─────────────┼───────────────┼───────────────┤
│ email       │ old@test.com  │ new@test.com  │
│ status      │ active        │ inactive      │
└─────────────┴───────────────┴───────────────┘
2 field(s) differ
```

Use `-o json` for programmatic consumption of diff results.

## Built for scripting

The CLI follows Unix conventions. Structured output formats (`json`, `ndjson`, `csv`, `yaml`) automatically suppress decorative status messages so only clean data reaches stdout. Error messages always go to stderr.

Pipe JSON or NDJSON into create commands for bulk operations:

```bash
cat contacts.ndjson | truto accounts create --stdin
echo '[{"name":"a"},{"name":"b"}]' | truto integrations create --stdin
```

Chain CLI commands together:

```bash
truto export crm/contacts -a <account-id> -o ndjson | \
  jq -c '{email: .email}' | \
  truto proxy email-list -m create -a <other-account-id> --stdin
```

Debug any request with verbose mode:

```bash
truto integrations list -v
# → GET https://api.truto.one/integration?limit=25
# ← 200 OK
```

## Full platform coverage

The CLI isn't limited to data queries. It covers the entire Truto admin API:

- **Integrations** — list, create, update, delete integration definitions
- **Accounts** — manage integrated accounts, refresh OAuth credentials
- **Sync Jobs** — configure and trigger data-sync pipelines
- **Workflows** — event-triggered automation with conditional steps
- **Webhooks** — outbound event delivery to your URLs
- **MCP Tokens** — create and manage scoped tokens for AI agent access
- **Environments** — manage isolated scopes within your team
- **Unified Models** — customize cross-integration schemas
- **Datastores, Daemons, Gates, Logs, Schema** — everything else

Every resource follows the same pattern: `truto <resource> <operation> [args] [options]`. Every command supports `--help`.

There's also an interactive mode for when you want to explore without memorizing commands:

```bash
truto interactive
```

It walks you through resource selection, operations, and parameters with a guided wizard.

## Get started

Install the CLI and start querying your integrations in under a minute:

```bash
curl -fsSL https://cli.truto.one/install.sh | bash
truto login
truto unified crm contacts -a <your-account-id> -o table
```

Read the full CLI documentation at [truto.one/docs](https://truto.one/docs).

> Questions about the CLI or the Truto platform? We'd love to chat.
>
> [Talk to us](https://cal.com/truto/partner-with-truto)
