ai-subscription-api
v0.0.2
Published
Use ChatGPT, Claude, and Gemini subscriptions programmatically without API keys
Maintainers
Readme
AI Subscription API
Use your ChatGPT Plus/Pro, Claude Pro/Max, and Gemini subscriptions programmatically. No API keys required.
Installation
bun add ai-subscription-apiRequirements
- Bun runtime (Node.js is not supported)
Quick Start
import { SubscriptionClient } from "ai-subscription-api"
const client = new SubscriptionClient()
// Login (opens browser)
const { session, complete } = await client.login("claude", "browser")
console.log(`Open: ${session.url}`)
// For Claude, paste the code from the browser
const code = "..." // from browser
await complete(code)
// Chat
const response = await client.ask("claude", "What is the meaning of life?")
console.log(response)Providers
| Provider | ID | Subscription |
| -------- | --------- | ----------------- |
| Claude | claude | Pro/Max |
| ChatGPT | chatgpt | Plus/Pro |
| Gemini | gemini | Free/Pro |
Login Methods
Claude
const { session, complete } = await client.login("claude", "browser")
console.log(session.url) // Open this URL
console.log(session.instructions) // "After authorizing, copy and paste the code shown."
Bun.spawn(["open", session.url])
const code = await getCodeFromUser()
await complete(code)ChatGPT
const { session, complete } = await client.login("chatgpt", "browser")
Bun.spawn(["open", session.url])
await complete() // Waits for OAuth callbackGemini
const { session, complete } = await client.login("gemini", "browser")
Bun.spawn(["open", session.url])
await complete() // Waits for OAuth callbackChat
// Simple
const answer = await client.ask("claude", "Hello!")
// With options
const response = await client.chat("claude", [{ role: "user", content: "Hello!" }], {
model: "claude-sonnet-4-20250514",
maxTokens: 1024,
system: "You are a helpful assistant.",
})
console.log(response.content)
console.log(response.usage) // { input: 10, output: 50 }Streaming
await client.chat("claude", messages, {
stream: true,
onChunk: (chunk) => process.stdout.write(chunk),
})Custom Credential Storage
import {
SubscriptionClient,
MemoryCredentialStore,
FileCredentialStore,
StaticCredentialStore,
} from "ai-subscription-api"
// In-memory (session only)
const client = new SubscriptionClient({
store: new MemoryCredentialStore(),
})
// Custom file path
const client = new SubscriptionClient({
store: new FileCredentialStore("/path/to/auth.json"),
})
// Pre-loaded credentials (read-only)
const client = new SubscriptionClient({
store: new StaticCredentialStore({
claude: {
type: "oauth",
refresh: "...",
access: "...",
expires: Date.now() + 3600000,
},
}),
})Custom Credential Store
Implement the CredentialStore interface:
import type { CredentialStore, Credentials } from "ai-subscription-api"
class RedisCredentialStore implements CredentialStore {
async get(provider: string): Promise<Credentials | undefined> { ... }
async set(provider: string, credentials: Credentials): Promise<void> { ... }
async remove(provider: string): Promise<void> { ... }
async all(): Promise<Record<string, Credentials>> { ... }
}
const client = new SubscriptionClient({
store: new RedisCredentialStore()
})Available Models
Claude
claude-sonnet-4-5-20250929(default)claude-opus-4-5-20251101claude-opus-4-6claude-haiku-4-5-20251001
ChatGPT
gpt-5.2(default)gpt-5.1-codexgpt-5.1-codex-minigpt-5.1-codex-maxgpt-5.2-codexgpt-5.3-codex
Gemini
gemini-3-flash-preview(default)gemini-3-pro-previewgemini-2.5-progemini-2.5-flashgemini-2.0-flashgemini-2.0-flash-lite
Scripts
# Run tests
bun test
# Run interactive CLI example
bun run exampleUse bun run example to play with the APIs.
Notes
- Claude OAuth credentials require the
claude-cliuser agent - ChatGPT Codex API requires
stream: trueandstore: false - Credentials are stored in
~/.local/share/subscription-auth/auth.jsonby default - Tokens are automatically refreshed when expired
