API Reference¶
Cost Guard backend API for programmatic access.
Base URL¶
https://api.costcut.dev/v1/
Authentication¶
Two auth methods:
| Type | Use | Header |
|---|---|---|
| JWT | User endpoints (auth, keys, billing) | Authorization: Bearer <access_token> |
| API Key | CLI ingest (sessions, usage) | Authorization: Bearer cg_live_<key> |
Auth Endpoints¶
POST /auth/signup¶
Create new account.
Request:
{
"email": "[email protected]",
"password": "secure_password"
}
Response (201):
{
"access_token": "eyJ...",
"token_type": "bearer"
}
POST /auth/login¶
Authenticate user.
Request:
{
"email": "[email protected]",
"password": "secure_password"
}
Response (200):
{
"access_token": "eyJ...",
"token_type": "bearer"
}
GET /auth/me¶
Get current user info (requires JWT).
Response (200):
{
"id": "user_123",
"email": "[email protected]",
"plan": "Pro"
}
Keys Endpoints¶
POST /keys¶
Create new API key (requires JWT).
Request:
{
"name": "my-cli-key"
}
Response (201):
{
"id": "key_123",
"key": "cg_live_abc123...",
"prefix": "cg_live",
"name": "my-cli-key"
}
GET /keys¶
List API keys (requires JWT).
Response (200):
[
{
"id": "key_123",
"prefix": "cg_live",
"name": "my-cli-key",
"last_used_at": "2026-05-23T10:00:00Z",
"created_at": "2026-05-20T14:30:00Z"
}
]
Sessions Endpoints¶
POST /sessions¶
Upload session data (requires API Key or JWT).
Request:
{
"project_id": "cost-guard",
"model": "claude-3-5-sonnet",
"input_tokens": 2500,
"output_tokens": 1200,
"cache_hits": 50,
"cost_usd": 0.01,
"date": "2026-05-23"
}
Response (201):
{
"id": "session_456",
"project_id": "cost-guard",
"model": "claude-3-5-sonnet",
"cost_usd": 0.01,
"created_at": "2026-05-23T10:00:00Z"
}
GET /sessions¶
List user's sessions (requires JWT).
Query params:
| Param | Type | Default | Description |
|---|---|---|---|
project_id |
string | — | Filter by project |
model |
string | — | Filter by model |
since |
ISO 8601 | — | Sessions after this date |
limit |
int | 50 | Max results |
Response (200):
[
{
"id": "session_456",
"project_id": "cost-guard",
"model": "claude-3-5-sonnet",
"input_tokens": 2500,
"output_tokens": 1200,
"cost_usd": 0.01,
"date": "2026-05-23"
}
]
Billing Endpoints¶
POST /billing/checkout¶
Create Stripe checkout session (requires JWT).
Request:
{
"plan": "Pro"
}
Response (200):
{
"checkout_url": "https://checkout.stripe.com/pay/cs_..."
}
POST /billing/webhook¶
Stripe webhook (public endpoint, no auth).
Called by Stripe on payment events (payment_intent.succeeded, customer.subscription.updated).
Error Responses¶
| Code | Meaning |
|---|---|
| 400 | Bad Request — invalid params |
| 401 | Unauthorized — missing/invalid auth |
| 409 | Conflict — email already registered |
| 500 | Server Error — try again later |
Example error:
{
"detail": "Email already registered"
}