Attributes
The attribute / attributes commands mirror Settings → Attributes
— custom columns added to each contact (Company, Job Title, Birthday,
etc.). Full CRUD plus the page’s visibility toggle and up/down reorder
actions.
Quick start
splashify attributes # list every attribute
splashify attributes --search co # client-side substring filter on label
splashify attribute <id> # show one (list-and-filter)
splashify attribute create --label "Company" --type TEXT
splashify attribute update <id> --label "Company Name"
splashify attribute toggle-visibility <id>
splashify attribute reorder <id> up | down
splashify attribute delete <id>Command reference
Write examples
# Create a text attribute
splashify attribute create --label "Company" --type TEXT
# Create a required dropdown with options
splashify attribute create \
--label "Lead Source" \
--type SELECT \
--options "Web,Referral,Ads,Trade Show" \
--required true \
--help "Where this lead came from"
# Multi-select
splashify attribute create --label "Interests" --type MULTISELECT \
--options "Sales,Marketing,Support"
# Update — only flags you pass are changed (read-modify-write under the hood)
splashify attribute update <id> --label "Company Name"
splashify attribute update <id> --required false --help "Optional from now on"
splashify attribute update <id> --options "Web,Referral,Ads,Trade Show,Other"Endpoint reference
| Subcommand | Endpoint |
|---|---|
attributes [--search …] | GET /api/v1/app/attributes (filter client-side) |
attribute <id> | List-and-filter (backend has no per-id GET) |
attribute create … | POST /api/v1/app/attributes |
attribute update <id> … (alias edit) | PUT /api/v1/app/attributes/:id |
attribute delete <id> (aliases rm, remove) | DELETE /api/v1/app/attributes/:id |
attribute toggle-visibility <id> (alias toggle) | POST /api/v1/app/attributes/:id/toggle-visibility |
attribute reorder <id> up|down (alias move) | POST /api/v1/app/attributes/reorder |
Attribute types
| Type | Accepts on the contact | Notes |
|---|---|---|
TEXT | any string | Default; labels with spaces become underscores |
NUMBER | numeric | |
EMAIL | RFC-5322 email | |
PHONE | E.164 phone | |
DATE | ISO 8601 date | |
SELECT | one of --options | --options "a,b,c" required |
MULTISELECT | subset of --options | --options "a,b,c" required |
URL | URL | |
CHECKBOX | bool |
Why update is read-modify-write
The backend’s PUT /api/v1/app/attributes/:id requires label + type
to be present and writes every optional column (is_visible,
is_required, options, default_value, help_text) on every call.
The CLI loads the current row first, overlays only the flags you
passed, then submits the full body so omitted fields stay intact. Same
pattern as splashify waba update and splashify opt ….
Common patterns
# IDs of all required attributes
splashify attributes | jq -r '.attributes[] | select(.is_required) | .id'
# Look up an attribute id by label
splashify attributes | \
jq -r '.attributes[] | select(.label == "Company") | .attribute_id'
# Hide every SELECT attribute from the contacts table
splashify attributes | \
jq -r '.attributes[] | select(.type == "SELECT" and .is_visible) | .attribute_id' | \
xargs -I{} splashify attribute toggle-visibility {}
# Bulk delete attributes whose label starts with "test_"
splashify attributes | \
jq -r '.attributes[] | select(.label | startswith("test_")) | .attribute_id' | \
xargs -I{} splashify attribute delete {}