User
User endpoints of the Ellipsis REST API.
| Method | Path |
|---|---|
| POST | /v1/user/subscription_tokens/{provider} |
Replaces whatever was stored. The token is saved DISABLED and routes nothing until `POST /v1/user/subscription_tokens/{provider}/verify` succeeds. Only `claude` routes today; generate its token with `claude setup-token`.
Path parameters
Named for the harness the token drives, not the vendor behind it: a developer connects "my Claude subscription", and the path segment they type is `claude`.
claudecodexcurl -X POST "https://api.ellipsis.dev/v1/user/subscription_tokens/{provider}" \
-H "Authorization: Bearer $ELLIPSIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"token":"..."}'import os
from ellipsis import Ellipsis
client = Ellipsis(api_key=os.environ["ELLIPSIS_API_TOKEN"])
result = client.user.subscription_tokens.set(
"claude",
"...",
)
print(result)import { Ellipsis } from '@ellipsis-dev/sdk';
const client = new Ellipsis({
apiKey: process.env.ELLIPSIS_API_TOKEN!,
});
const result = await client.user.subscriptionTokens.set(
'claude',
{ token: '...' },
);
console.log(result);Request
Body parameters
The subscription OAuth token. For `claude`, the `sk-ant-oat…` token `claude setup-token` prints.
Response
| Method | Path |
|---|---|
| GET | /v1/user/subscription_tokens |
One entry per supported provider, whether or not you have saved a token for it. Tokens are write-only: the response carries only `token_last4`, never the token.
curl "https://api.ellipsis.dev/v1/user/subscription_tokens" \
-H "Authorization: Bearer $ELLIPSIS_API_KEY"import os
from ellipsis import Ellipsis
client = Ellipsis(api_key=os.environ["ELLIPSIS_API_TOKEN"])
result = client.user.subscription_tokens.list()
print(result)import { Ellipsis } from '@ellipsis-dev/sdk';
const client = new Ellipsis({
apiKey: process.env.ELLIPSIS_API_TOKEN!,
});
const result = await client.user.subscriptionTokens.list();
console.log(result);Request
Response
| Method | Path |
|---|---|
| GET | /v1/user/subscription_tokens/{provider} |
`configured` is false when nothing is saved. The token itself is never returned, only `token_last4`.
Path parameters
Named for the harness the token drives, not the vendor behind it: a developer connects "my Claude subscription", and the path segment they type is `claude`.
claudecodexcurl "https://api.ellipsis.dev/v1/user/subscription_tokens/{provider}" \
-H "Authorization: Bearer $ELLIPSIS_API_KEY"import os
from ellipsis import Ellipsis
client = Ellipsis(api_key=os.environ["ELLIPSIS_API_TOKEN"])
result = client.user.subscription_tokens.get(
"claude",
)
print(result)import { Ellipsis } from '@ellipsis-dev/sdk';
const client = new Ellipsis({
apiKey: process.env.ELLIPSIS_API_TOKEN!,
});
const result = await client.user.subscriptionTokens.get('claude');
console.log(result);Request
Response
| Method | Path |
|---|---|
| DELETE | /v1/user/subscription_tokens/{provider} |
Your sessions stop billing your subscription immediately, and the usage reading goes with it — it described that token's plan.
Path parameters
Named for the harness the token drives, not the vendor behind it: a developer connects "my Claude subscription", and the path segment they type is `claude`.
claudecodexcurl -X DELETE \
"https://api.ellipsis.dev/v1/user/subscription_tokens/{provider}" \
-H "Authorization: Bearer $ELLIPSIS_API_KEY"import os
from ellipsis import Ellipsis
client = Ellipsis(api_key=os.environ["ELLIPSIS_API_TOKEN"])
result = client.user.subscription_tokens.delete(
"claude",
)
print(result)import { Ellipsis } from '@ellipsis-dev/sdk';
const client = new Ellipsis({
apiKey: process.env.ELLIPSIS_API_TOKEN!,
});
const result = await client.user.subscriptionTokens.delete('claude');
console.log(result);Request
Response
| Method | Path |
|---|---|
| GET | /v1/user/subscription_tokens/{provider}/usage |
Display-only, and only as fresh as your last call through Ellipsis (`observed_at`) — the same plan used outside Ellipsis moves the real windows without us seeing them. Null unless a token is enabled for the provider: a disabled token routes nothing, so any reading behind it is stale by construction.
Path parameters
Named for the harness the token drives, not the vendor behind it: a developer connects "my Claude subscription", and the path segment they type is `claude`.
claudecodexcurl "https://api.ellipsis.dev/v1/user/subscription_tokens/{provider}/usage" \
-H "Authorization: Bearer $ELLIPSIS_API_KEY"import os
from ellipsis import Ellipsis
client = Ellipsis(api_key=os.environ["ELLIPSIS_API_TOKEN"])
result = client.user.subscription_tokens.usage(
"claude",
)
print(result)import { Ellipsis } from '@ellipsis-dev/sdk';
const client = new Ellipsis({
apiKey: process.env.ELLIPSIS_API_TOKEN!,
});
const result = await client.user.subscriptionTokens.usage('claude');
console.log(result);Request
Response
| Method | Path |
|---|---|
| POST | /v1/user/subscription_tokens/{provider}/verify |
Makes one minimal call on the exact runtime path, so a pass proves the token is what will pay. This is the gate on routing: success enables the token, failure disables it, so verifying a revoked token is how you stop it routing. A 200 with `ok: false` is the normal way a bad token is reported — it is an answer, not a transport failure.
Path parameters
Named for the harness the token drives, not the vendor behind it: a developer connects "my Claude subscription", and the path segment they type is `claude`.
claudecodexcurl -X POST \
"https://api.ellipsis.dev/v1/user/subscription_tokens/{provider}/verify" \
-H "Authorization: Bearer $ELLIPSIS_API_KEY"import os
from ellipsis import Ellipsis
client = Ellipsis(api_key=os.environ["ELLIPSIS_API_TOKEN"])
result = client.user.subscription_tokens.verify(
"claude",
)
print(result)import { Ellipsis } from '@ellipsis-dev/sdk';
const client = new Ellipsis({
apiKey: process.env.ELLIPSIS_API_TOKEN!,
});
const result = await client.user.subscriptionTokens.verify('claude');
console.log(result);