segment
Segment — manage sources, destinations, events, and tracking plans via Config & Tracking APIs
Packaged view
This page reorganizes the original catalog entry around fit, installability, and workflow context first. The original raw source lives below.
Install command
npx @skill-hub/cli install openclaw-skills-segment
Repository
Skill path: skills/aiwithabidi/segment
Segment — manage sources, destinations, events, and tracking plans via Config & Tracking APIs
Open repositoryBest for
Primary workflow: Ship Full Stack.
Technical facets: Full Stack.
Target audience: everyone.
License: MIT.
Original source
Catalog source: SkillHub Club.
Repository owner: openclaw.
This is still a mirrored public skill entry. Review the repository before installing into production workflows.
What it helps with
- Install segment into Claude Code, Codex CLI, Gemini CLI, or OpenCode workflows
- Review https://github.com/openclaw/skills before adding segment to shared team environments
- Use segment for development workflows
Works across
Favorites: 0.
Sub-skills: 0.
Aggregator: No.
Original source / Raw SKILL.md
---
name: segment
description: "Segment — manage sources, destinations, events, and tracking plans via Config & Tracking APIs"
homepage: https://www.agxntsix.ai
license: MIT
compatibility: Python 3.10+ (stdlib only — no dependencies)
metadata: {"openclaw": {"emoji": "📊", "requires": {"env": ["SEGMENT_ACCESS_TOKEN", "SEGMENT_WRITE_KEY"]}, "primaryEnv": "SEGMENT_ACCESS_TOKEN", "homepage": "https://www.agxntsix.ai"}}
---
# 📊 Segment
Segment — manage sources, destinations, events, and tracking plans via Config & Tracking APIs
## Requirements
| Variable | Required | Description |
|----------|----------|-------------|
| `SEGMENT_ACCESS_TOKEN` | ✅ | Config API token |
| `SEGMENT_WRITE_KEY` | ✅ | Source write key |
## Quick Start
```bash
# List sources
python3 {{baseDir}}/scripts/segment.py sources
# Get source
python3 {{baseDir}}/scripts/segment.py source-get id <value>
# Create source
python3 {{baseDir}}/scripts/segment.py source-create --name <value> --catalog_name <value>
# Delete source
python3 {{baseDir}}/scripts/segment.py source-delete id <value>
# List destinations
python3 {{baseDir}}/scripts/segment.py destinations
# Get destination
python3 {{baseDir}}/scripts/segment.py destination-get id <value>
# List warehouses
python3 {{baseDir}}/scripts/segment.py warehouses
# List source catalog
python3 {{baseDir}}/scripts/segment.py catalog-sources
```
## All Commands
| Command | Description |
|---------|-------------|
| `sources` | List sources |
| `source-get` | Get source |
| `source-create` | Create source |
| `source-delete` | Delete source |
| `destinations` | List destinations |
| `destination-get` | Get destination |
| `warehouses` | List warehouses |
| `catalog-sources` | List source catalog |
| `catalog-destinations` | List destination catalog |
| `tracking-plans` | List tracking plans |
| `tracking-plan-get` | Get tracking plan |
| `spaces` | List spaces |
| `functions` | List functions |
| `track` | Send track event |
| `identify` | Send identify |
## Output Format
All commands output JSON by default. Add `--human` for readable formatted output.
```bash
python3 {{baseDir}}/scripts/segment.py <command> --human
```
## Script Reference
| Script | Description |
|--------|-------------|
| `{{baseDir}}/scripts/segment.py` | Main CLI — all commands in one tool |
## Credits
Built by [M. Abidi](https://www.linkedin.com/in/mohammad-ali-abidi) | [agxntsix.ai](https://www.agxntsix.ai)
[YouTube](https://youtube.com/@aiwithabidi) | [GitHub](https://github.com/aiwithabidi)
Part of the **AgxntSix Skill Suite** for OpenClaw agents.
📅 **Need help setting up OpenClaw for your business?** [Book a free consultation](https://cal.com/agxntsix/abidi-openclaw)
---
## Skill Companion Files
> Additional files collected from the skill directory layout.
### _meta.json
```json
{
"owner": "aiwithabidi",
"slug": "segment",
"displayName": "Segment",
"latest": {
"version": "1.0.0",
"publishedAt": 1772823168536,
"commit": "https://github.com/openclaw/skills/commit/c3d3d86649527e22f43f57b1cb2f11a742705c36"
},
"history": []
}
```
### scripts/segment.py
```python
#!/usr/bin/env python3
"""Segment CLI — Segment — manage sources, destinations, events, and tracking plans via Config & Tracking APIs
Zero dependencies beyond Python stdlib.
Built by M. Abidi | agxntsix.ai
"""
import argparse, json, os, sys, urllib.request, urllib.error, urllib.parse
API_BASE = "https://api.segmentapis.com"
def get_env(name):
val = os.environ.get(name, "")
if not val:
env_path = os.path.join(os.environ.get("WORKSPACE", os.path.expanduser("~/.openclaw/workspace")), ".env")
if os.path.exists(env_path):
with open(env_path) as f:
for line in f:
line = line.strip()
if line.startswith(name + "="):
val = line.split("=", 1)[1].strip().strip('"').strip("'")
break
if not val:
print(f"Error: {name} not set", file=sys.stderr)
sys.exit(1)
return val
def get_headers():
token = get_env("SEGMENT_ACCESS_TOKEN")
return {"Authorization": f"Bearer {token}", "Content-Type": "application/json", "Accept": "application/json"}
def get_api_base():
base = API_BASE
pass
return base
def req(method, path, data=None, params=None):
headers = get_headers()
if path.startswith("http"):
url = path
else:
url = get_api_base() + path
if params:
qs = urllib.parse.urlencode({k: v for k, v in params.items() if v is not None})
if qs:
url = f"{url}?{qs}" if "?" not in url else f"{url}&{qs}"
body = json.dumps(data).encode() if data else None
r = urllib.request.Request(url, data=body, method=method)
for k, v in headers.items():
r.add_header(k, v)
try:
resp = urllib.request.urlopen(r, timeout=30)
raw = resp.read().decode()
return json.loads(raw) if raw.strip() else {"ok": True}
except urllib.error.HTTPError as e:
err_body = e.read().decode()
print(json.dumps({"error": True, "code": e.code, "message": err_body}), file=sys.stderr)
sys.exit(1)
def try_json(val):
if val is None:
return None
try:
return json.loads(val)
except (json.JSONDecodeError, ValueError):
return val
def out(data, human=False):
if human and isinstance(data, dict):
for k, v in data.items():
print(f" {k}: {v}")
elif human and isinstance(data, list):
for item in data:
if isinstance(item, dict):
for k, v in item.items():
print(f" {k}: {v}")
print()
else:
print(item)
else:
print(json.dumps(data, indent=2, default=str))
def cmd_sources(args):
"""List sources."""
path = "/sources"
data = req("GET", path)
out(data, getattr(args, "human", False))
def cmd_source_get(args):
"""Get source."""
path = f"/sources/{args.id}"
data = req("GET", path)
out(data, getattr(args, "human", False))
def cmd_source_create(args):
"""Create source."""
path = "/sources"
body = {}
if getattr(args, "name", None): body["name"] = try_json(args.name)
if getattr(args, "catalog_name", None): body["catalog_name"] = try_json(args.catalog_name)
data = req("POST", path, data=body)
out(data, getattr(args, "human", False))
def cmd_source_delete(args):
"""Delete source."""
path = f"/sources/{args.id}"
data = req("DELETE", path)
out(data, getattr(args, "human", False))
def cmd_destinations(args):
"""List destinations."""
path = "/destinations"
data = req("GET", path)
out(data, getattr(args, "human", False))
def cmd_destination_get(args):
"""Get destination."""
path = f"/destinations/{args.id}"
data = req("GET", path)
out(data, getattr(args, "human", False))
def cmd_warehouses(args):
"""List warehouses."""
path = "/warehouses"
data = req("GET", path)
out(data, getattr(args, "human", False))
def cmd_catalog_sources(args):
"""List source catalog."""
path = "/catalog/sources"
data = req("GET", path)
out(data, getattr(args, "human", False))
def cmd_catalog_destinations(args):
"""List destination catalog."""
path = "/catalog/destinations"
data = req("GET", path)
out(data, getattr(args, "human", False))
def cmd_tracking_plans(args):
"""List tracking plans."""
path = "/tracking-plans"
data = req("GET", path)
out(data, getattr(args, "human", False))
def cmd_tracking_plan_get(args):
"""Get tracking plan."""
path = f"/tracking-plans/{args.id}"
data = req("GET", path)
out(data, getattr(args, "human", False))
def cmd_spaces(args):
"""List spaces."""
path = "/spaces"
data = req("GET", path)
out(data, getattr(args, "human", False))
def cmd_functions(args):
"""List functions."""
path = "/functions"
data = req("GET", path)
out(data, getattr(args, "human", False))
def cmd_track(args):
"""Send track event."""
path = "/track"
body = {}
if getattr(args, "event", None): body["event"] = try_json(args.event)
if getattr(args, "userId", None): body["userId"] = try_json(args.userId)
if getattr(args, "properties", None): body["properties"] = try_json(args.properties)
data = req("POST", path, data=body)
out(data, getattr(args, "human", False))
def cmd_identify(args):
"""Send identify."""
path = "/identify"
body = {}
if getattr(args, "userId", None): body["userId"] = try_json(args.userId)
if getattr(args, "traits", None): body["traits"] = try_json(args.traits)
data = req("POST", path, data=body)
out(data, getattr(args, "human", False))
def main():
parser = argparse.ArgumentParser(description="Segment CLI")
parser.add_argument("--human", action="store_true", help="Human-readable output")
sub = parser.add_subparsers(dest="command")
sources_p = sub.add_parser("sources", help="List sources")
sources_p.set_defaults(func=cmd_sources)
source_get_p = sub.add_parser("source-get", help="Get source")
source_get_p.add_argument("id", help="Source ID")
source_get_p.set_defaults(func=cmd_source_get)
source_create_p = sub.add_parser("source-create", help="Create source")
source_create_p.add_argument("--name", help="Name", default=None)
source_create_p.add_argument("--catalog_name", help="Catalog name", default=None)
source_create_p.set_defaults(func=cmd_source_create)
source_delete_p = sub.add_parser("source-delete", help="Delete source")
source_delete_p.add_argument("id", help="Source ID")
source_delete_p.set_defaults(func=cmd_source_delete)
destinations_p = sub.add_parser("destinations", help="List destinations")
destinations_p.set_defaults(func=cmd_destinations)
destination_get_p = sub.add_parser("destination-get", help="Get destination")
destination_get_p.add_argument("id", help="Destination ID")
destination_get_p.set_defaults(func=cmd_destination_get)
warehouses_p = sub.add_parser("warehouses", help="List warehouses")
warehouses_p.set_defaults(func=cmd_warehouses)
catalog_sources_p = sub.add_parser("catalog-sources", help="List source catalog")
catalog_sources_p.set_defaults(func=cmd_catalog_sources)
catalog_destinations_p = sub.add_parser("catalog-destinations", help="List destination catalog")
catalog_destinations_p.set_defaults(func=cmd_catalog_destinations)
tracking_plans_p = sub.add_parser("tracking-plans", help="List tracking plans")
tracking_plans_p.set_defaults(func=cmd_tracking_plans)
tracking_plan_get_p = sub.add_parser("tracking-plan-get", help="Get tracking plan")
tracking_plan_get_p.add_argument("id", help="Plan ID")
tracking_plan_get_p.set_defaults(func=cmd_tracking_plan_get)
spaces_p = sub.add_parser("spaces", help="List spaces")
spaces_p.set_defaults(func=cmd_spaces)
functions_p = sub.add_parser("functions", help="List functions")
functions_p.set_defaults(func=cmd_functions)
track_p = sub.add_parser("track", help="Send track event")
track_p.add_argument("--event", help="Event name", default=None)
track_p.add_argument("--userId", help="User ID", default=None)
track_p.add_argument("--properties", help="JSON properties", default=None)
track_p.set_defaults(func=cmd_track)
identify_p = sub.add_parser("identify", help="Send identify")
identify_p.add_argument("--userId", help="User ID", default=None)
identify_p.add_argument("--traits", help="JSON traits", default=None)
identify_p.set_defaults(func=cmd_identify)
args = parser.parse_args()
if not args.command:
parser.print_help()
sys.exit(1)
args.func(args)
if __name__ == "__main__":
main()
```