XCT Claw
Your own OpenClaw agent runtime — launch an isolated instance and bind an IM channel in seconds.
XCT Claw is a hosted “OpenClaw” agent runtime (source), offered as a paid add-on from your Xcity dashboard. Each user launches their own agent — with private memory, skills, and tools — and binds IM channels (Telegram, Discord, Slack) so end-users can chat with it on the platform of their choice.
TL;DR — Buy the add-on → click Launch OpenClaw → paste a bot token. Your agent is live, isolated, and metered through your existing TokenHub budget.
How it works
XCT Claw runs as one shared XCT Claw instance behind claws.xcity.one. The dashboard never spins up a container per customer. Instead it holds a single type=user API key and provisions you as an isolated app_user via the X-Fastclaw-End-User header — keyed to your Xcity user.id.
dashboard ──(Bearer FASTCLAW_USER_KEY + X-Fastclaw-End-User: <user.id>)──▶ XCT Claw
POST /v1/users → mint your isolated app_user
POST /api/agents → create your OpenClaw agent
POST /api/providers → wire its model to TokenHub with your key
POST /api/agents/{id}/channels/telegram → bind your bot
Everything partitions per user.id: sessions, memory, files, agents, and channel bindings. No other tenant can see or reach your agent.
Getting started
- Purchase — open Dashboard → XCT Claw and click Purchase XCT Claw. This is a standalone subscription, independent of your Free / Pro / Team plan.
- Launch — click Launch OpenClaw. One call provisions your agent and points its model at TokenHub using your existing virtual key, so inference spend flows through your normal budget.
- Bind a channel — pick Telegram / Discord / Slack, paste the bot token, and click Connect. XCT Claw validates the token live and starts delivering messages immediately — no restart.
- Chat — message your bot. Your agent replies with its own memory and skills.
Plan & billing
Access is gated by the xct_claws_access entitlement, granted by either:
- the standalone XCT Claw add-on (its own Stripe subscription, tracked in
app_metadata.claws_addon), or - a plan that bundles the entitlement.
The dashboard checks this with hasClawsAccess(app_metadata). Canceling the add-on flips claws_addon.active to false and the Launch / channel actions lock again — your data is retained.
Channels
| Channel | Credential | Notes |
|---|---|---|
| Telegram | Bot token from @BotFather | Validated via getMe; binds by bot username |
| Discord | Bot token (Developer Portal) | Validated via /users/@me |
| Slack | Bot token (xoxb-…) | Validated via auth.test |
A bound channel goes live without a restart. You can disconnect any channel from the dashboard at any time.
API reference
All routes require an authenticated Xcity session cookie and that your account has xct_claws_access. They proxy to XCT Claw under your isolated app_user.
GET /api/me/claws
Status for the dashboard.
{
"entitled": true,
"configured": true,
"provisioned": true,
"agent": { "id": "agt_…" },
"channels": [{ "type": "telegram", "accountId": "mybot", "enabled": true }],
"degraded": false
}
POST /api/me/claws/provision
Launch (or re-assert) your OpenClaw instance. Idempotent — a second call reuses your existing agent.
{ "agent": { "id": "agt_…", "name": "My OpenClaw", "model": "…" }, "app_user_id": "u_…" }
403 claws_access_required if your account isn’t entitled; 502 on a provisioning failure.
GET / POST / DELETE /api/me/claws/channels
GET— list bound channels.POST{ "type": "telegram", "botToken": "…" }— bind a channel; returns{ ok, type, botUsername }.DELETE{ "type": "telegram", "accountId": "mybot" }— disconnect.
409 not_provisioned if you haven’t launched an agent yet; 400 unsupported_channel for an unknown type.
Data isolation
Because every call carries X-Fastclaw-End-User: <your user.id>, XCT Claw rebinds the request to a stable internal app_user minted from that id. Sessions, memory, agent files, and channel rows all live under that app_user — there is no shared-tenant surface. App_users cannot redirect user-scope provider config either, so the calling app’s TokenHub wiring can’t be tampered with from inside the agent.
For operators
The dashboard needs three env vars (see .env.example):
CLAWS_BASE_URL=https://claws.xcity.one # shared XCT Claw instance
FASTCLAW_USER_KEY=sk_… # one type=user key (fastclaw apikey create --type user)
STRIPE_PRICE_CLAWS=price_… # the add-on's Stripe price
Deploy XCT Claw with FASTCLAW_BIND=all and a Postgres FASTCLAW_STORAGE_DSN for durability, and subscribe the Stripe webhook to the add-on price so customer.subscription.* events flip claws_addon.active.
See also
- Integrate a browser sub-product — the identity + TokenHub flow XCT Claw reuses.
- Plans & entitlements
Last updated: