Skip to main content
All data commands share these common flags:
FlagDescription
--api-key <key>Override the active API key for this request
--jsonForce JSON output (auto-enabled when piped)
--helpShow help for the command

Customers List

List and filter customers with pagination.
outlit customers list [flags]

Flags

FlagTypeDefaultDescription
--billing-statusstringFilter by billing status: NONE, TRIALING, PAYING, CHURNED
--mrr-abovenumberMRR floor in cents (e.g. 10000 for $100/mo)
--mrr-belownumberMRR ceiling in cents
--statusstringFilter by customer status: PROVISIONAL, ACTIVE, CHURNED, MERGED
--typestringFilter by type: COMPANY, INDIVIDUAL
--no-activity-instringInactive for period: 7d, 14d, 30d, 90d
--has-activity-instringActive within period: 7d, 14d, 30d, 90d
--searchstringSearch by name or domain
--order-bystringlast_activity_atSort field
--order-directionstringdescSort direction: asc, desc
--limitnumber20Results per page (1–100)
--cursorstringPagination cursor from a previous response

Examples

# Paying customers inactive for 30 days
outlit customers list --billing-status PAYING --no-activity-in 30d

# High-MRR customers sorted by revenue
outlit customers list --mrr-above 50000 --order-by mrr_cents --order-direction desc

# Search for a customer
outlit customers list --search "acme"

# Pipe to jq
outlit customers list --json | jq '.items[] | {domain, mrr: .currentMrr}'

JSON Response

{
  "items": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "name": "Acme Corp",
      "domain": "acme.com",
      "billingStatus": "PAYING",
      "currentMrr": 500000,
      "lastActivityAt": "2025-02-10T15:30:00Z",
      "status": "ACTIVE",
      "type": "COMPANY"
    }
  ],
  "pagination": {
    "hasMore": true,
    "nextCursor": "cursor_abc123",
    "total": 150
  }
}

Pagination

Use --cursor to page through results:
# First page
outlit customers list --limit 50 --json > page1.json

# Next page
CURSOR=$(jq -r '.pagination.nextCursor' page1.json)
outlit customers list --limit 50 --cursor "$CURSOR" --json
In interactive mode, the CLI shows a hint after the table:
Showing 20 of 150 total. Next page: --cursor cursor_abc123

Customers Get

Get a detailed customer profile with optional sections.
outlit customers get <customer> [flags]

Arguments

ArgumentRequiredDescription
customerYesCustomer domain (e.g. acme.com), UUID, or name

Flags

FlagTypeDefaultDescription
--includestringComma-separated sections: users, revenue, recentTimeline, behaviorMetrics
--timeframestring30dLookback window for included sections: 7d, 14d, 30d, 90d

Examples

# Basic profile
outlit customers get acme.com

# Full profile with all sections
outlit customers get acme.com --include users,revenue,recentTimeline --timeframe 90d

# By UUID
outlit customers get 550e8400-e29b-41d4-a716-446655440000

JSON Response

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "name": "Acme Corp",
  "domain": "acme.com",
  "billingStatus": "PAYING",
  "currentMrr": 500000,
  "contacts": [
    {
      "id": "user-uuid",
      "name": "Jane Doe",
      "email": "jane@acme.com",
      "journeyStage": "CHAMPION"
    }
  ],
  "revenue": {
    "currentMrr": 500000,
    "historicalMrr": []
  },
  "recentTimeline": [
    {
      "type": "PAGE_VIEW",
      "channel": "WEB",
      "occurredAt": "2025-02-10T15:30:00Z"
    }
  ]
}
The --include users flag maps to the contacts key in the response, which contains user/contact data for that customer.

Customers Timeline

View the activity timeline for a customer, filtered by channel and event type.
outlit customers timeline <customer> [flags]

Arguments

ArgumentRequiredDescription
customerYesCustomer domain or UUID

Flags

FlagTypeDefaultDescription
--timeframestring30dLookback window: 7d, 14d, 30d, 90d
--start-datestringStart date (YYYY-MM-DD) — overrides --timeframe
--end-datestringEnd date (YYYY-MM-DD) — overrides --timeframe
--channelsstringComma-separated channels: EMAIL, SLACK, WEB, etc.
--event-typesstringComma-separated types: PAGE_VIEW, MEETING, SUPPORT_TICKET, etc.
--limitnumber20Results per page (1–100)
--cursorstringPagination cursor
When --start-date or --end-date is provided, --timeframe is ignored.

Examples

# Last 30 days (default)
outlit customers timeline acme.com

# Last 90 days, email and Slack only
outlit customers timeline acme.com --timeframe 90d --channels EMAIL,SLACK

# Custom date range
outlit customers timeline acme.com --start-date 2025-01-01 --end-date 2025-03-01

# Page views and meetings only
outlit customers timeline acme.com --event-types PAGE_VIEW,MEETING --limit 50

JSON Response

{
  "items": [
    {
      "id": "event-uuid",
      "customerId": "customer-uuid",
      "type": "PAGE_VIEW",
      "channel": "WEB",
      "occurredAt": "2025-02-10T15:30:00Z",
      "metadata": {
        "url": "https://acme.com/pricing",
        "title": "Pricing Page"
      }
    }
  ],
  "pagination": {
    "hasMore": false,
    "nextCursor": null,
    "total": 45
  }
}

Users List

List and filter users across your customer base.
outlit users list [flags]

Flags

FlagTypeDefaultDescription
--journey-stagestringFilter by stage: CHAMPION, AT_RISK, CHURNED, ACTIVATED, etc.
--customer-idstringFilter to users of a specific customer (UUID)
--no-activity-instringInactive for period: 7d, 14d, 30d, 90d
--has-activity-instringActive within period: 7d, 14d, 30d, 90d
--searchstringSearch by name or email
--order-bystringlast_activity_atSort field
--order-directionstringdescSort direction: asc, desc
--limitnumber20Results per page (1–100)
--cursorstringPagination cursor

Examples

# Find champions
outlit users list --journey-stage CHAMPION

# Inactive users from a specific customer
outlit users list --customer-id 550e8400-... --no-activity-in 30d

# Search by name
outlit users list --search "alice" --order-by last_activity_at

JSON Response

{
  "items": [
    {
      "id": "user-uuid",
      "email": "jane@acme.com",
      "name": "Jane Doe",
      "customerId": "customer-uuid",
      "journeyStage": "CHAMPION",
      "lastActivityAt": "2025-02-10T15:30:00Z"
    }
  ],
  "pagination": {
    "hasMore": true,
    "nextCursor": "cursor_abc",
    "total": 500
  }
}

Facts

Retrieve AI-generated facts, signals, and insights for a customer.
outlit facts <customer> [flags]

Arguments

ArgumentRequiredDescription
customerYesCustomer domain or UUID

Flags

FlagTypeDefaultDescription
--timeframestring30dLookback window: 7d, 14d, 30d, 90d
--limitnumber20Results per page (1–100)
--cursorstringPagination cursor

Examples

# Facts from last 30 days
outlit facts acme.com

# Extended lookback
outlit facts acme.com --timeframe 90d --limit 50

# Pipe for processing
outlit facts acme.com --json | jq '.items[] | select(.severity == "HIGH")'

JSON Response

{
  "items": [
    {
      "id": "fact-uuid",
      "customerId": "customer-uuid",
      "type": "SIGNAL",
      "title": "Budget concerns raised",
      "severity": "HIGH",
      "generatedAt": "2025-02-10T15:30:00Z"
    }
  ],
  "pagination": {
    "hasMore": false,
    "nextCursor": null,
    "total": 12
  }
}
Semantic search across customer context — events, signals, emails, and facts.
outlit search <query> [flags]

Arguments

ArgumentRequiredDescription
queryYesNatural language search query

Flags

FlagTypeDefaultDescription
--customerstringScope to a specific customer (domain or UUID)
--top-knumber20Maximum results to return
--afterstringFilter to events after date (YYYY-MM-DD)
--beforestringFilter to events before date (YYYY-MM-DD)

Examples

# Organization-wide search
outlit search "pricing objections"

# Scoped to a customer
outlit search "budget concerns" --customer acme.com

# Time-bounded
outlit search "expansion signals" --after 2025-01-01 --before 2025-03-31

# More results
outlit search "churn risk" --top-k 100 --json

JSON Response

{
  "items": [
    {
      "customerId": "customer-uuid",
      "snippet": "Customer mentioned pricing concerns in Q1 planning meeting",
      "relevance": 0.92,
      "source": "TIMELINE",
      "timestamp": "2025-02-10T15:30:00Z"
    }
  ],
  "total": 42
}
The search response uses a flat total field — not nested under pagination like other list commands.

SQL

Execute read-only SQL queries against Outlit’s analytics database.
outlit sql <query> [flags]
outlit sql --query-file <path> [flags]

Arguments

ArgumentRequiredDescription
queryYes*SQL query string (*or use --query-file)

Flags

FlagTypeDefaultDescription
--query-filestringPath to a .sql file (takes precedence over positional arg)
--limitnumber1000Maximum rows to return

Examples

# Inline query
outlit sql "SELECT event_type, COUNT(*) as cnt FROM events GROUP BY 1 ORDER BY cnt DESC"

# From a file
outlit sql --query-file ./queries/monthly-activity.sql

# Pipe to jq
outlit sql "SELECT domain, current_mrr FROM customer_dimensions ORDER BY current_mrr DESC LIMIT 10" | jq

JSON Response

{
  "rows": [
    { "event_type": "PAGE_VIEW", "cnt": 12500 },
    { "event_type": "MEETING", "cnt": 340 }
  ],
  "rowCount": 2
}

Available Tables

Use outlit schema to discover all tables and their columns. Common tables:
TableDescription
eventsEvent stream (page views, meetings, emails, etc.)
customer_dimensionsDenormalized customer attributes and metrics
user_dimensionsDenormalized user attributes
mrr_snapshotsMonthly recurring revenue snapshots

Schema

Discover database tables and their column definitions.
outlit schema [table]

Arguments

ArgumentRequiredDescription
tableNoSpecific table name — omit to list all tables

Examples

# List all tables
outlit schema

# Describe a specific table
outlit schema events

# JSON output
outlit schema customer_dimensions --json

JSON Response

{
  "tables": [
    {
      "name": "events",
      "columns": [
        { "name": "id", "type": "uuid", "nullable": false },
        { "name": "event_type", "type": "varchar", "nullable": false }
      ]
    }
  ]
}