You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Inbox API commands are namespaced under hs inbox .... Uses OAuth2 client credentials for authentication.
Authentication
The CLI uses HelpScout's OAuth2 client credentials flow. You'll need an App ID and App Secret from your HelpScout app settings (Your Profile > My Apps > Create App).
Interactive login (recommended)
hs inbox auth login
This prompts for your App ID and App Secret, validates them against the API, and stores them securely in your OS keyring.
Non-interactive setup
hs inbox config set --inbox-app-id your-app-id --inbox-app-secret your-app-secret
hs inbox config set --inbox-default-mailbox 12345 --format json
hs inbox config set --inbox-pii-mode customers --inbox-pii-allow-unredacted
An allowlist-based permission system that restricts which Inbox operations are permitted. When HS_INBOX_PERMISSIONS is set, only explicitly granted resource:operation pairs are allowed. When unset, everything is allowed (backward compatible).
# Read-only access to conversations and customers
HS_INBOX_PERMISSIONS="conversations:read,customers:read"# Read-only across all resources
HS_INBOX_PERMISSIONS="*:read"# Full access to conversations, read-only everything else
HS_INBOX_PERMISSIONS="conversations:*,*:read"# Unrestricted (explicit)
HS_INBOX_PERMISSIONS="*:*"
# Show current policy, source, and per-command allow/deny table
hs inbox permissions
# With a policy set
HS_INBOX_PERMISSIONS="conversations:read" hs inbox permissions
Denied commands
When a command is denied:
Error: permission denied: conversations:write not allowed
Current policy: conversations:read,customers:read
To allow, add conversations:write to HS_INBOX_PERMISSIONS
Commands
Config
# Set one or more config values
hs inbox config set --inbox-app-id xxx --inbox-app-secret yyy
hs inbox config set --inbox-default-mailbox 12345
hs inbox config set --format json
hs inbox config set --inbox-pii-mode customers
hs inbox config set --inbox-pii-allow-unredacted
# Disable/unset PII features explicitly
hs inbox config set --inbox-pii-allow-unredacted=false
hs inbox config set --inbox-pii-mode off --inbox-pii-allow-unredacted=false
# View all config values
hs inbox config get
# View a single value
hs inbox config get inbox-app-id
# Print config file path
hs inbox config path
config set flags
Flag
Type
Description
--inbox-app-id
string
HelpScout App ID
--inbox-app-secret
string
HelpScout App Secret
--inbox-default-mailbox
int
Default mailbox ID
--format
string
Output format: table, json, json-full, csv
--inbox-pii-mode
string
PII redaction mode: off, customers, all
--inbox-pii-allow-unredacted
bool
Allow per-request --unredacted override
--docs-api-key
string
HelpScout Docs API key
Mailboxes
# List all mailboxes
hs inbox mailboxes list
hs inbox mb list # alias# Get mailbox details
hs inbox mailboxes get 12345
# Mailbox folders, custom fields, and routing
hs inbox mailboxes folders list 12345
hs inbox mailboxes custom-fields list 12345
hs inbox mailboxes routing get 12345
hs inbox mailboxes routing update 12345 --json '{"enabled":true}'# JSON output
hs inbox mailboxes list --format json
# Fetch all pages
hs inbox mailboxes list --no-paginate
mailboxes routing update flags
Flag
Type
Required
Description
--json
string
yes
Routing update payload as JSON object
Conversations
# List conversations (default: active, sorted by createdAt desc)
hs inbox conversations list
hs inbox conv list # alias# Filter by status
hs inbox conversations list --status active # default
hs inbox conversations list --status closed
hs inbox conversations list --status pending
hs inbox conversations list --status spam
hs inbox conversations list --status all # everything# Filter by mailbox (or set a default: hs inbox config set --inbox-default-mailbox 12345)
hs inbox conversations list --mailbox 12345
# Combine filters — folder, tag, assignee
hs inbox conversations list --folder 12 --tag billing --assigned-to 99
# Filter by modification date
hs inbox conversations list --modified-since "2026-01-01T00:00:00Z"# Look up by conversation number
hs inbox conversations list --number 23053
# Sort options: createdAt, modifiedAt, number, subject, status, customerEmail,# customerName, mailboxid, score, waitingSince
hs inbox conversations list --sort-field modifiedAt --sort-order asc
hs inbox conversations list --sort-field waitingSince --sort-order desc
# Custom field filters (requires --mailbox)
hs inbox conversations list --mailbox 12345 --custom-fields-by-ids "10:foo,11:bar"# Embed threads in response
hs inbox conversations list --embed threads
# Pagination
hs inbox conversations list --page 2 --per-page 50
hs inbox conversations list --no-paginate # fetch ALL pages# Combine flags freely
hs inbox conversations list --mailbox 12345 --status closed --tag billing \
--sort-field modifiedAt --sort-order desc --format json
conversations list: --query (advanced search)
The --query flag maps directly to the HelpScout search API. It accepts a mini query language with field names, operators, and date ranges. When combined with other flags (e.g. --mailbox), they are ANDed together.
# Free-text search (searches subject + body)
hs inbox conversations list --query "billing issue"# Search by subject
hs inbox conversations list --query '(subject:"password reset")'
hs inbox conversations list --query '(subject:"shipping" OR subject:"delivery")'# Search by email (matches to, cc, bcc, and customer profile)
hs inbox conversations list --query '(email:"alice@example.com")'
hs inbox conversations list --query '(email:(alice@example.com OR bob@example.com))'# Search message body
hs inbox conversations list --query '(body:"error 500")'
hs inbox conversations list --query '(body:"timeout" OR body:"connection refused")'# Search by tag
hs inbox conversations list --query '(tag:"vip")'
hs inbox conversations list --query '(tag:"urgent" OR tag:"escalated")'# Search by assignee name (or "Unassigned")
hs inbox conversations list --query '(assigned:"Jane Smith")'
hs inbox conversations list --query '(assigned:"Unassigned")'# Search by mailbox name or ID
hs inbox conversations list --query '(mailbox:"Support")'
hs inbox conversations list --query '(mailboxid:12345)'# Search by conversation number or ID
hs inbox conversations list --query '(number:23053)'
hs inbox conversations list --query '(id:100200300)'# Search by customer ID
hs inbox conversations list --query '(customerIds:500001)'# Search by replying user IDs
hs inbox conversations list --query '(replyUserIds:(23 OR 45))'# Has attachments
hs inbox conversations list --query '(attachments:true)'# Date ranges — createdAt and modifiedAt
hs inbox conversations list --query '(createdAt:[2026-01-01T00:00:00Z TO *])'
hs inbox conversations list --query '(createdAt:[2026-01-01T00:00:00Z TO 2026-01-31T23:59:59Z])'
hs inbox conversations list --query '(modifiedAt:[NOW-1HOUR TO *])'
hs inbox conversations list --query '(modifiedAt:[NOW-7DAY TO *])'
hs inbox conversations list --query '(createdAt:2026-01)'# month shorthand# Combine with AND (implicit) and OR
hs inbox conversations list --query '(tag:"billing" AND status:"active")'
hs inbox conversations list --query '(subject:"refund" OR subject:"cancel")'# Negate with NOT
hs inbox conversations list --query '(NOT tag:"spam")'
hs inbox conversations list --query '(subject:"order" AND NOT assigned:"Unassigned")'# Combine --query with other flags (ANDed together)
hs inbox conversations list --mailbox 12345 --query '(tag:"vip")'
hs inbox conversations list --status all --query '(email:"alice@example.com")'
# List customers
hs inbox customers list
hs inbox cust list # alias# Search customers by email
hs inbox customers list --query "alice@example.com"# Filter flags
hs inbox customers list --mailbox 12345 --first-name Alice --last-name Smith
hs inbox customers list --modified-since "2026-01-01T00:00:00Z"
hs inbox customers list --sort-field firstName --sort-order asc
# --query supports a mini query language (same operators as conversations, fewer fields)
hs inbox customers list --query '(firstName:"John")'
hs inbox customers list --query '(firstName:"John" AND lastName:"Appleseed")'
hs inbox customers list --query '(firstName:"John" OR firstName:"Johnny")'
hs inbox customers list --query '(email:"alice@example.com")'
hs inbox customers list --query '(modifiedAt:[2026-01-01T00:00:00Z TO *])'# Get customer details
hs inbox customers get 11111
# Create a customer
hs inbox customers create \
--first-name Alice \
--last-name Smith \
--email alice@example.com \
--phone "555-1234" \
--job-title "Engineer" \
--location "Paris" \
--gender female \
--background "VIP customer" \
--age "35" \
--photo-url "https://example.com/photo.jpg" \
--organization-id 42
# Create with raw JSON (overrides all flags, supports nested objects)
hs inbox customers create \
--json '{"firstName":"Alice","emails":[{"type":"work","value":"alice@example.com"}]}'# Update a customer
hs inbox customers update 11111 --first-name "Alicia"# Overwrite a customer (same flags as create)
hs inbox customers overwrite 11111 --first-name "Alice"# Delete a customer
hs inbox customers delete 11111
# Delete asynchronously (returns 202)
hs inbox customers delete 11111 --async
customers list flags
Flag
Type
Description
--query
string
Search query — supports firstName, lastName, email, modifiedAt fields with AND/OR operators and [TO] date ranges
--mailbox
string
Filter by mailbox ID
--first-name
string
Filter by first name
--last-name
string
Filter by last name
--modified-since
string
Filter by last-modified timestamp
--sort-field
string
Sort field
--sort-order
string
Sort direction
--embed
string
Embed sub-resources (deprecated)
customers get flags
Flag
Type
Description
--embed
string
Embed sub-resources (deprecated)
customers create flags
Also used by overwrite.
Flag
Type
Required
Description
--first-name
string
yes
First name
--last-name
string
Last name
--email
string
Email address
--phone
string
Phone number
--job-title
string
Job title
--background
string
Background info
--location
string
Location
--gender
string
Gender: male, female, unknown
--age
string
Age
--photo-url
string
Photo URL
--organization-id
int
Organization ID
--json
string
Raw JSON body (overrides all flags)
customers update flags
Flag
Type
Description
--first-name
string
First name
--last-name
string
Last name
--phone
string
Phone number
customers delete flags
Flag
Type
Description
--async
bool
Delete asynchronously (returns 202)
Tags
# List tags
hs inbox tags list
# Get tag details
hs inbox tags get 123
Users
# List users
hs inbox users list
hs inbox users list --email agent@example.com --mailbox 12345
# Get user details
hs inbox users get 22222
hs inbox users me
hs inbox users delete 22222
# User statuses
hs inbox users status list
hs inbox users status get 22222
hs inbox users status set 22222 --status away
hs inbox users status set 22222 --json '{"status":"away","autoReply":"I am out of office"}'
users list flags
Flag
Type
Description
--email
string
Filter by email
--mailbox
string
Filter by mailbox ID
users status set flags
Flag
Type
Description
--status
string
Status value
--json
string
Full status payload as JSON
Teams
# List teams and team members
hs inbox teams list
hs inbox teams members 77
Shared across all report families. For the full set of available params per report family (views, granularity, tags, folders, etc.) see the HelpScout Reports API docs.
Flag
Type
Description
--start
string
Report start date/time
--end
string
Report end date/time
--mailbox
string
Filter by mailbox ID
--view
string
Report view filter
--param
strings
Additional params as key=value (repeatable) — pass-through to the API
Workflows
# List workflows
hs inbox workflows list
hs inbox wf list # alias
hs inbox workflows list --mailbox-id 12345 --type manual
# Activate or deactivate a workflow
hs inbox workflows update-status 33333 --status inactive
hs inbox workflows update-status 33333 --status active
# Run a workflow on specific conversations
hs inbox workflows run 33333 --conversation-ids 100,200,300
workflows list flags
Flag
Type
Description
--mailbox-id
int
Filter by mailbox ID
--type
string
Filter by workflow type
workflows update-status flags
Flag
Type
Required
Description
--status
string
yes
Status: active or inactive
workflows run flags
Flag
Type
Required
Description
--conversation-ids
strings
yes
Conversation IDs (comma-separated)
Webhooks
# List webhooks
hs inbox webhooks list
hs inbox wh list # alias# Get webhook details
hs inbox webhooks get 44444
# Create a webhook
hs inbox webhooks create \
--url https://example.com/hook \
--events "convo.created,convo.updated" \
--secret my-webhook-secret \
--payload-version V2 \
--mailbox-ids 12345,67890 \
--notification \
--label "Primary Hook"# Update a webhook
hs inbox webhooks update 44444 \
--url https://example.com/new-hook \
--payload-version V1 \
--mailbox-ids 12345 \
--notification=false
# Delete a webhook
hs inbox webhooks delete 44444
webhooks create flags
Flag
Type
Required
Description
--url
string
yes
Webhook URL
--events
strings
yes
Events to subscribe to (comma-separated)
--secret
string
yes
Webhook secret
--payload-version
string
Payload version: V1, V2
--mailbox-ids
ints
Mailbox IDs to scope (comma-separated)
--notification
bool
Send lightweight notification payloads
--label
string
Human-readable label
webhooks update flags
Same flags as create, none required.
Saved Replies
# List and get saved replies
hs inbox saved-replies list --mailbox-id 12345
hs inbox saved-replies list --query "welcome"
hs inbox saved-replies get 44
# Create a saved reply
hs inbox saved-replies create --mailbox-id 12345 --name "Welcome" --body "Hi there" --subject "Welcome!" --private
# Update a saved reply
hs inbox saved-replies update 44 --name "Welcome v2" --body "Updated greeting" --subject "Welcome back!"# Delete
hs inbox saved-replies delete 44
saved-replies list flags
Flag
Type
Description
--mailbox-id
string
Filter by mailbox ID
--query
string
Search query
saved-replies create flags
Flag
Type
Required
Description
--mailbox-id
string
yes
Mailbox ID
--name
string
yes
Reply name
--body
string
yes
Reply body text
--subject
string
Reply subject
--private
bool
Mark as private
--json
string
Full payload as JSON (overrides flags)
saved-replies update flags
Flag
Type
Description
--mailbox-id
string
Mailbox ID
--name
string
Reply name
--body
string
Reply body text
--subject
string
Reply subject
--private
bool
Mark as private
--json
string
Full payload as JSON (overrides flags)
Tools
Workflow commands that aggregate data from the Inbox API. Namespaced under hs inbox tools ....
# Team overview — conversation counts per agent
hs inbox tools briefing
# Filter by status
hs inbox tools briefing --status pending
hs inbox tools briefing --status all
# Agent summary — list conversations for a specific user
hs inbox tools briefing --assigned-to 531600
# Agent briefing with full thread data
hs inbox tools briefing --assigned-to 531600 --embed threads
# JSON output (clean — no HAL _embedded/_links)
hs inbox tools briefing --assigned-to 531600 --embed threads --format json
Conversation list (same columns as conversations list)
Agent + threads
briefing --assigned-to <id> --embed threads
Conversation list with thread count and last activity
When --format json is used with --embed threads, the output is a JSON array where each conversation has a top-level threads array with full thread data. HAL envelope (_embedded, _links) is stripped from both conversation and thread objects.