For AI agents: a documentation index is available at the root level at /llms.txt and /llms-full.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.
PlaygroundDiscordStatusDashboardSign Up >
DocumentationSDK ReferenceGraphiti
DocumentationSDK ReferenceGraphiti
      • Documentation MCP Server
      • llms.txt
      • zepctl CLI
      • Debugging
LogoLogo
PlaygroundDiscordStatusDashboardSign Up >
On this page
  • Installation
  • Homebrew (macOS/Linux)
  • Binary Download
  • Quick Start
  • Authentication
  • Environment Variables
  • Configuration File
  • Global Flags
  • Commands
  • config
  • project
  • user
  • thread
  • List Flags
  • Message Format
  • graph
  • Add Data Flags
  • Add Fact Flags
  • Search Flags
  • Property Filter Syntax
  • Date Filter Syntax
  • Batch Episode Format
  • node
  • edge
  • episode
  • task
  • ontology
  • Ontology File Format
  • summary-instructions
  • Examples
  • Export All Users
  • Bulk User Creation
  • Migrate User Data
  • Monitor Batch Import
  • Delete User (RTBF Compliance)
  • Search with Advanced Filters
  • Output Formats
  • Shell Completions
  • Bash
  • Zsh
  • Fish
  • PowerShell
Developer Tools

zepctl CLI Reference

Was this page helpful?
Previous

Debugging

Debug workflow execution logs for graph operations
Next
Built with

zepctl is a command-line interface for administering Zep projects. It provides full access to Zep, enabling you to manage users, threads, Context Graphs, and data operations from the terminal.

Installation

Homebrew (macOS/Linux)

$brew tap getzep/zepctl https://github.com/getzep/zepctl.git
$brew install zepctl

Binary Download

Download the appropriate binary for your platform from the releases page.

macOS users: If you see “zepctl cannot be opened because the developer cannot be verified”, run:

$xattr -d com.apple.quarantine /path/to/zepctl

Quick Start

$# Configure your API key (you will be prompted to enter it securely)
$zepctl config add-profile production
$
$# Verify connection
$zepctl project get
$
$# List users
$zepctl user list

Authentication

Environment Variables

VariableDescription
ZEP_API_KEYAPI key for authentication
ZEP_API_URLAPI endpoint URL (default: https://api.getzep.com)
ZEP_PROFILEOverride current profile
ZEP_OUTPUTDefault output format

Configuration File

Location: ~/.zepctl/config.yaml

1current-profile: production
2profiles:
3 - name: production
4 # API keys are stored securely in the system keychain
5 - name: development
6 api-url: https://api.dev.getzep.com # Optional: only if using non-default URL
7defaults:
8 output: table
9 page-size: 50

API keys are stored in the system keychain (macOS Keychain, Windows Credential Manager, or Linux Secret Service) rather than in the config file. For CI/CD environments without keychain access, use the ZEP_API_KEY environment variable.

Global Flags

FlagShortDescription
--api-key-kOverride API key
--api-urlOverride API URL
--profile-pUse specific profile
--output-oOutput format: table, json, yaml, wide
--quiet-qSuppress non-essential output
--verbose-vEnable verbose output
--help-hDisplay help

Commands

config

Manage zepctl configuration including profiles and defaults.

$# View current configuration
$zepctl config view
$
$# List all profiles
$zepctl config get-profiles
$
$# Switch active profile
$zepctl config use-profile <name>
$
$# Add a new profile (prompts for API key)
$zepctl config add-profile <name> [--api-url URL]
$
$# Remove a profile
$zepctl config delete-profile <name> [--force]

project

Get project information.

$zepctl project get

user

Manage users in your Zep project.

$# List users
$zepctl user list [--page N] [--page-size N]
$
$# Get user details
$zepctl user get <user-id>
$
$# Create a new user
$zepctl user create <user-id> [--email EMAIL] [--first-name NAME] [--last-name NAME] \
> [--metadata JSON] [--metadata-file PATH]
$
$# Update an existing user
$zepctl user update <user-id> [--email EMAIL] [--first-name NAME] [--last-name NAME] \
> [--metadata JSON] [--metadata-file PATH]
$
$# Delete a user (includes all associated data)
$zepctl user delete <user-id> [--force]
$
$# List user threads
$zepctl user threads <user-id>
$
$# Get user graph node
$zepctl user node <user-id>

Deleting a user removes all associated threads, graph data, and knowledge. This supports RTBF (Right to Be Forgotten) compliance.

thread

Manage conversation threads.

$# List all threads
$zepctl thread list [--page N] [--page-size N] [--order-by FIELD] [--asc]
$
$# Create a new thread
$zepctl thread create <thread-id> --user <user-id>
$
$# Get thread messages
$zepctl thread get <thread-id> [--last N]
$
$# Delete a thread
$zepctl thread delete <thread-id> [--force]
$
$# List thread messages
$zepctl thread messages <thread-id> [--last N] [--limit N]
$
$# Add messages to a thread
$zepctl thread add-messages <thread-id> --file messages.json [--batch] [--wait]
$zepctl thread add-messages <thread-id> --stdin [--batch] [--wait]
$
$# Get thread context
$zepctl thread context <thread-id>

List Flags

FlagDescription
--pagePage number (default: 1)
--page-sizeResults per page (default: 50)
--order-byOrder by field: created_at, updated_at, user_id, thread_id
--ascSort in ascending order (default: descending)

Message Format

When adding messages via --file or --stdin, use this JSON format:

1{
2 "messages": [
3 {
4 "role": "user",
5 "name": "Alice",
6 "content": "Hello, I need help with my account"
7 },
8 {
9 "role": "assistant",
10 "content": "I'd be happy to help!"
11 }
12 ]
13}

graph

Manage knowledge graphs.

$# List all graphs
$zepctl graph list [--page N] [--page-size N]
$
$# Create a new graph
$zepctl graph create <graph-id>
$
$# Delete a graph
$zepctl graph delete <graph-id> [--force]
$
$# Clone a graph
$zepctl graph clone --source-user USER_ID --target-user NEW_USER_ID
$zepctl graph clone --source-graph GRAPH_ID --target-graph NEW_GRAPH_ID
$
$# Add data to a graph
$zepctl graph add <graph-id> --type text --data "User prefers dark mode"
$zepctl graph add --user <user-id> --type json --file data.json
$zepctl graph add --user <user-id> --batch --file episodes.json --wait
$
$# Add a fact triple to a graph
$zepctl graph add-fact --user <user-id> --fact "Alice knows Bob" --fact-name KNOWS \
> --source-node "Alice" --target-node "Bob"
$zepctl graph add-fact --graph <graph-id> --fact "Alice works at Acme" --fact-name WORKS_AT \
> --source-node "Alice" --target-node "Acme" \
> --source-attrs '{"role": "engineer"}' --edge-attrs '{"since": "2020"}' \
> --target-attrs '{"industry": "tech"}'
$
$# Search a graph
$zepctl graph search "query" --user <user-id> --scope edges
$zepctl graph search "query" --graph <graph-id> --scope nodes --limit 20
$zepctl graph search "query" --user <user-id> --property-filter "status:=:active"
$zepctl graph search "query" --user <user-id> --date-filter "created_at:>:2024-01-01"

Add Data Flags

FlagDescription
--typeData type: text, json, message (default: text)
--dataInline data string
--filePath to data file
--stdinRead data from stdin
--userAdd to user graph
--batchEnable batch processing
--waitWait for ingestion to complete

Add Fact Flags

FlagDescription
--userAdd to user graph
--graphAdd to standalone graph
--factThe fact relating the two nodes (required)
--fact-nameEdge name, should be UPPER_SNAKE_CASE (required)
--source-nodeSource node name (required)
--target-nodeTarget node name (required)
--valid-atWhen the fact becomes true (ISO 8601)
--invalid-atWhen the fact stops being true (ISO 8601)
--source-attrsSource node attributes as JSON
--edge-attrsEdge attributes as JSON
--target-attrsTarget node attributes as JSON

Search Flags

FlagDescription
--userSearch user graph
--graphSearch standalone graph
--scopeSearch scope: edges, nodes, episodes (default: edges)
--limitMaximum results (default: 10)
--rerankerReranker: rrf, mmr, cross_encoder
--mmr-lambdaMMR diversity/relevance balance (0-1)
--node-labelsComma-separated node labels to include
--edge-typesComma-separated edge types to include
--exclude-node-labelsComma-separated node labels to exclude
--exclude-edge-typesComma-separated edge types to exclude
--property-filterProperty filter (repeatable): property:op:value or property:IS NULL
--date-filterDate filter (repeatable): field:op:date or field:IS NULL

Property Filter Syntax

Property filters allow filtering by node/edge attributes:

$--property-filter "property_name:operator:value"
$--property-filter "property_name:IS NULL"
$--property-filter "property_name:IS NOT NULL"

Supported operators: =, ==, <>, !=, >, <, >=, <=, IS NULL, IS NOT NULL

Values are automatically parsed as boolean (true/false), integer, float, or string.

Date Filter Syntax

Date filters allow filtering by temporal fields:

$--date-filter "field:operator:date"
$--date-filter "field:IS NULL"
$--date-filter "field:IS NOT NULL"

Supported fields: created_at, valid_at, invalid_at, expired_at

Batch Episode Format

1{
2 "episodes": [
3 {"type": "text", "data": "User prefers morning meetings"},
4 {"type": "json", "data": "{\"preference\": \"dark_mode\"}"},
5 {"type": "message", "data": "Alice: I love hiking on weekends"}
6 ]
7}

node

Manage graph nodes.

$# List nodes
$zepctl node list --user <user-id> [--limit N] [--cursor UUID]
$zepctl node list --graph <graph-id>
$
$# Get node details
$zepctl node get <uuid>
$
$# Get node edges
$zepctl node edges <uuid>
$
$# Get node episodes
$zepctl node episodes <uuid>
$
$# Delete a node
$zepctl node delete <uuid> [--force]

edge

Manage graph edges (facts/relationships).

$# List edges
$zepctl edge list --user <user-id> [--limit N] [--cursor UUID]
$zepctl edge list --graph <graph-id>
$
$# Get edge details
$zepctl edge get <uuid>
$
$# Delete an edge
$zepctl edge delete <uuid> [--force]

episode

Manage graph episodes (source data).

$# List episodes
$zepctl episode list --user <user-id> [--last N]
$zepctl episode list --graph <graph-id>
$
$# Get episode details
$zepctl episode get <uuid>
$
$# Get episode mentions
$zepctl episode mentions <uuid>
$
$# Delete an episode
$zepctl episode delete <uuid> [--force]

task

Monitor async operations (batch imports, cloning, etc.).

$# Get task status
$zepctl task get <task-id>
$
$# Wait for task completion
$zepctl task wait <task-id> [--timeout 5m] [--poll-interval 1s]

ontology

Manage graph schema definitions.

$# Get ontology definitions
$zepctl ontology get
$
$# Set ontology from file
$zepctl ontology set --file ontology.yaml

Ontology File Format

1entities:
2 Customer:
3 description: "A customer of the business"
4 fields:
5 tier:
6 description: "Customer tier level"
7 account_number:
8 description: "Customer account number"
9 Product:
10 description: "A product or service"
11 fields:
12 sku:
13 description: "Product SKU"
14
15edges:
16 PURCHASED:
17 description: "Customer purchased a product"
18 source_types: [Customer]
19 target_types: [Product]
20 INTERESTED_IN:
21 description: "Customer expressed interest"

summary-instructions

Manage user summary instructions.

$# List instructions
$zepctl summary-instructions list [--user USER_ID]
$
$# Add instructions
$zepctl summary-instructions add --name NAME --instruction "Text" [--user USER_IDS]
$zepctl summary-instructions add --name NAME --file instructions.txt [--user USER_IDS]
$
$# Delete instructions
$zepctl summary-instructions delete <name> [--force] [--user USER_IDS]

Examples

Export All Users

$zepctl user list -o json | jq '.users[].user_id'

Bulk User Creation

$cat users.json | jq -c '.[]' | while read user; do
$ zepctl user create $(echo $user | jq -r '.user_id') \
> --email "$(echo $user | jq -r '.email')" \
> --first-name "$(echo $user | jq -r '.first_name')"
$done

Migrate User Data

$# Clone user graph to test environment
$zepctl graph clone --source-user prod_user_123 --target-user test_user_123
$
$# Verify clone
$zepctl node list --user test_user_123 -o json | jq '.nodes | length'

Monitor Batch Import

$# Start batch import
$TASK_ID=$(zepctl graph add --user user_123 --batch --file data.json -o json | jq -r '.task_id')
$
$# Wait for completion
$zepctl task wait $TASK_ID --timeout 10m

Delete User (RTBF Compliance)

$# Preview what will be deleted
$zepctl user get $USER_ID
$zepctl user threads $USER_ID
$
$# Delete user and all associated data
$zepctl user delete $USER_ID --force

Search with Advanced Filters

$# Search with cross-encoder reranking
$zepctl graph search "critical decisions" --user user_123 --reranker cross_encoder
$
$# Search nodes excluding certain labels
$zepctl graph search "product" --graph graph_456 --scope nodes \
> --exclude-node-labels "Assistant,Document"
$
$# Search with property filters
$zepctl graph search "query" --user user_123 \
> --property-filter "status:=:active" \
> --property-filter "age:>:30"
$
$# Search for edges with null validity dates
$zepctl graph search "query" --user user_123 \
> --date-filter "valid_at:IS NULL" \
> --date-filter "created_at:>:2024-01-01"
$
$# Combine multiple filter types
$zepctl graph search "preferences" --user user_123 \
> --node-labels "Person,Product" \
> --property-filter "verified:=:true" \
> --date-filter "expired_at:IS NULL"

Output Formats

All commands support multiple output formats via the --output flag:

FormatDescription
tableHuman-readable table (default)
jsonJSON output for scripting
yamlYAML output
wideExtended table with additional columns
$# JSON output for scripting
$zepctl user list -o json
$
$# YAML output
$zepctl user get user_123 -o yaml

Shell Completions

Enable tab completion for commands, flags, and arguments.

Bash

Requires the bash-completion package.

$# Load completions in current session
$source <(zepctl completion bash)
$
$# Install permanently (Linux)
$zepctl completion bash > /etc/bash_completion.d/zepctl
$
$# Install permanently (macOS with Homebrew)
$zepctl completion bash > $(brew --prefix)/etc/bash_completion.d/zepctl

Zsh

$# Enable completions if not already configured
$echo "autoload -U compinit; compinit" >> ~/.zshrc
$
$# Load completions in current session
$source <(zepctl completion zsh)
$
$# Install permanently (Linux)
$zepctl completion zsh > "${fpath[1]}/_zepctl"
$
$# Install permanently (macOS with Homebrew)
$zepctl completion zsh > $(brew --prefix)/share/zsh/site-functions/_zepctl

Fish

$# Load completions in current session
$zepctl completion fish | source
$
$# Install permanently
$zepctl completion fish > ~/.config/fish/completions/zepctl.fish

PowerShell

1# Load completions in current session
2zepctl completion powershell | Out-String | Invoke-Expression
3
4# Install permanently (add to your PowerShell profile)
5zepctl completion powershell > zepctl.ps1
6# Then add `. /path/to/zepctl.ps1` to your profile

Start a new shell session after installing completions for changes to take effect.